Nginx服務與LNMP部署
Nginx簡介:跟Apache一樣,是一款web服務器軟件,也在普遍使用
Nginx的特點:併發量高,內存佔用小、處理速度快、但是CPU佔用大、安全性較低、模塊較少
Nginx服務配置
啓動命令:nginx 停止命令:killall -s QUIT nginx 重啓命令:killall -s QUIT nginx 》》nginx
重新加載:killall -s HUP nginx 查看服務開啓狀態:ps -ef | grep "nginx" 或者netstat -anpt | grep "nginx"
配置文件詳解
nginx配置文件主要分爲六個區域:
1.main:全局設置 2.events:nginx工作模式 3.http:http設置
4.sever:主機設置 5.location:URL匹配 6.upstream:負載均衡服務器設置
配置文件結構分佈:
main
events{。。。。。。}
http{
。。。。。。
server{
。。。。。。
location 1{。。。。。。}
location 2{。。。。。。}
}
}
全局配置:
user nobody; //程序用戶名
worker_processes 1; //設置nginx子進程數量,即提供服務的進程數量,該數值建議和服務cpu核數保持一致
error_log logs/error.log; //設置錯誤日誌的路徑
error_log logs/error.log notice; //設置錯誤日誌的路徑
error_log logs/error.log info; //設置錯誤日誌的路徑
pid logs/nginx.pid; //設置nginx進程pid文件所在路徑
worker_rlimit_nofile 10000; //設置nginx最多打開文件數限制
events配置:
worker_connections 1024; //定義每個work_process同時開啓的最大連接數
accept_mutex on; //防止多個進程爭搶資源,默認就是on
multi_accept on; //nginx worker processer可以做到同時接收多個新到達的網絡連接,默認爲off
use epoll; //設置模式,模式有如下:
select:只能在Windows下使用,這個事件模型不建議在高負載的系統使用
poll:Nginx默認首選,但不是在所有系統下都可用
kqueue:這種方式在FreeBSD 4.1+, OpenBSD2.9+, NetBSD 2.0, 和 MacOS X系統中是最高效的
epoll:這種方式是在Linux 2.6+內核中最高效的方式
rtsig:實時信號,可用在Linux 2.2.19的內核中,但不適用在高流量的系統中
eventport:Solaris 10最高效的方式
http配置:
MIME-Type
include mime.types; //設置nginx能識別的網絡資源媒體類型(如,文本、html、js、css、流媒體等)
default_type application/octet-stream; //設置默認的type,如果不定義改行,默認爲text/plain.
log_format
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
其中main爲日誌格式的名字,後面的爲nginx的內部變量組成的一串字符串。
access_log logs/access.log main; //設置日誌的路徑以及採用的日誌格式,該參數可以在server配置塊中定義
sendfile on; //是否調用sendfile函數傳輸文件,默認爲off
sendfile_max_chunk 128k; //限制Nginx worker process每次調用sendfile()函數傳輸數據的最大值,默認值爲0無限制
tcp_nopush on; //當調用tcp_cork方法進行數據傳輸,默認值爲on
keepalive_timeout 65 60; //第一個值設置nginx服務器與客戶端會話結束後仍舊保持連接的最長時間,單位是秒,默認爲75s
第二個值針對客戶端的瀏覽器來設置的,可以通過curl -I看到header信息中有一項Keep-Alive: timeout=60,如果
補充:不設置就沒有這一項,第二個數值設置後,瀏覽器就會根據這個數值決定何時主動關閉連接,Nginx服務器就不操心了。但
有的瀏覽器並不認可該參數
send_timeout //發送響應的超時時間
client_max_body_size 10m; //限制Content-Length所示值的大小的
gzip on; //是否開啓gzip壓縮
gzip_min_length 1k; //設置允許壓縮的頁面最小字節數,默認值20
gzip_buffers 4 16k; //設置系統獲取幾個單位的buffer用於存儲gzip的壓縮結果數據流
gzip_http_version 1.1; //用於識別 http 協議的版本
gzip_comp_level 6; //gzip壓縮比
gzip_types mime-type ... ; //匹配mime類型進行壓縮
gzip_proxied any; //Nginx作爲反向代理的時候啓用,決定開啓或者關閉後端服務器返回的結果是否壓縮
以下爲可用的值:
off - 關閉所有的代理結果數據的壓縮
expired - 啓用壓縮,如果header頭中包含 "Expires" 頭信息
no-cache - 啓用壓縮,如果header頭中包含 "Cache-Control:no-cache" 頭信息
no-store - 啓用壓縮,如果header頭中包含 "Cache-Control:no-store" 頭信息
private - 啓用壓縮,如果header頭中包含 "Cache-Control:private" 頭信息
no_last_modified - 啓用壓縮,如果header頭中不包含 "Last-Modified" 頭信息
no_etag - 啓用壓縮 ,如果header頭中不包含 "ETag" 頭信息
auth - 啓用壓縮 , 如果header頭中包含 "Authorization" 頭信息
any - 無條件啓用壓縮
gzip_vary on; //可以讓前端的緩存服務器緩存經過gzip壓縮的頁面
爲了方便我們自己寫個腳本,然後可以用service命令來管理nginx
腳本如下:
#!/bin/bash
PROG="/usr/local/nginx/sbin/nginx"
PIDF="/usr/local/nginx/logs/nginx.pid"
PROG_FPM="/usr/local/sbin/php-fpm"
PID_FPM="/usr/local/php5/var/run/php-fpm.pid"
isstatus=`ps -ef | awk '{print $1}' | grep "nginx" | wc -l`
start()
{
if [ $isstatus -ne 0 ]
then
echo "nginx already started"
else
$PROG
$PROG_FPM
echo "nginx starting......"
fi
}
stop()
{
if [ $isstatus -ne 0 ]
then
kill -s QUIT $(cat $PIDF)
kill -s QUIT $(cat $PID_FPM)
echo "nginx shutting down......"
else
echo "nginx has ceased"
fi
}
restart()
{
if [ $isstatus -ne 0 ]
then
kill -s QUIT $(cat $PIDF)
kill -s QUIT $(cat $PID_FPM)
$PROG
$PROG_FPM
echo "nginx restart......"
else
echo "nginx not started"
fi
}
reload()
{
kill -s HUP $(cat $PIDF)
kill -s HUP $(cat $PID_FPM)
echo "nginx is reloading......"
}
status()
{
if [ $isstatus -eq 0 ]
then
echo "nginx:nginx not running"
else
echo "nginx:mginx is running"
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
reload)
reload
;;
status)
status
;;
*)
echo "Usage:$0 {start|stop|restart|reload|status}"
esac
注意:記得把腳本名字改成nginx,然後再放到/etc/init.d/目錄下,之後就可以使用service命令管理了
啓動服務:service nginx start 停止服務:service nginx stop 重啓服務:service nginx restart
查看服務:service nginx status 重新加載服務:service nginx reload
nginx主配置文件位置:/usr/local/nginx/conf/nginx.conf(源碼包安裝)
一、源碼編譯安裝Nginx
1.安裝支持軟件,Nginx的配置需要pcre、zlib等軟件
yum -y install pcre-devel zlib-devel
2.nginx默認以nobody運行,建議建立專用用戶
useradd -M -s /sbin/nologin nginx
3.下載Nginx軟件包解壓安裝
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make && make install
編譯安裝nginx選項:
--prefix=目錄:設置Nginx的安裝路徑 默認路徑:/usr/local/nginx
--sbin-path=目錄:設置Nginx的可執行文件路徑 默認路徑:prefix/sbin/nginx
--conf-path=目錄:設置Nginx配置文件路徑 默認路徑:prefix/conf/nginx.conf
--pid-path=目錄:設置Nginx pid文件路徑 默認路徑:prefix/logs/nginx.pid
--error-log-path=目錄:設置錯誤日誌存放路徑 默認路徑:prefix/logs/error.log
--http-log-path=目錄:設置訪問日誌存放路徑 默認路徑:prefix/logs/access.log
--user=用戶名:設置運行Nginx的用戶 默認用戶:nobody
--group=用戶組名:設置運行Nginx的用戶組 默認用戶組:nobody
4.路徑的優化
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin
5.檢查優化以及配置文件
啓動Nginx:nginx
對網頁訪問測試服務是否搭建成功(下圖爲Nginx的默認網頁,能訪問爲成功)
二、MySQL數據庫安裝
1.安裝依賴包:yum -y install ncurses-devel
2.安裝cmake工具
然後gmake && gmake install
3.解壓編譯安裝mysql
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DSYSCONFDIR=/etc
然後make && make install
4.優化路徑以及優化管理
運行/etc/profile文件(沒有權限記得加權限)
5.初始化數據庫,啓動mysql服務
創建用戶組和用戶,設置爲屬主目錄
/usr/local/mysql/scripts/mysql_install_db --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --user=mysql
路徑優化
ln -s /usr/local/mysql/bin/* /usr/bin
下圖爲安裝成功
三、PHP安裝搭建
1.下載各種依賴包
yum -y install zilb zlib-devel libxml2-devel pcre pcre-devel libpng libpng-devel libjpeg libjpeg-devel freetype freetype-devel curl-devel gd
2.解壓源碼包並且編譯安裝
解壓再到解壓目錄下編譯
./configure --prefix=/usr/local/php5 --with-gd --with-curl --with-zlib --with-mysqli --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib
然後安裝:make && make install
複製配置文件模板使用
cp php.ini-development /usr/local/php5/php.ini
3.路徑優化
ln -s /usr/local/php5/bin/* /usr/local/bin/
ln -s /usr/local/php5/sbin/* /usr/local/sbin/
4.實現nginx與PHP對接
useradd -M -s /sbin/nologin php
使用模板/usr/local/php5/etc/php-fpm.conf.default
cp /usr/local/php5/etc/php-fpm.conf.default /usr/local/php5/etc/php-fpm.conf
配置模塊配置文件:vim /usr/local/php5/etc/php-fpm.conf
pid = run/php-fpm.pid
user = php
group = php
PHP優化(可選)
pm.max_children = 50 // 根據內存大小設置,一個進程大約 3M
pm.start_servers = 20 //啓動時開啓的進程數
pm.min_spare_servers = 5 //最少空閒進程數
pm.max_spare_servers = 35 //最多空閒進程數
啓動fpm進程:/usr/local/sbin/php-fpm
查詢php-fpm是否啓動(下圖爲啓動):netstat -anpt | grep php-fpm
修改nginx.conf,在www.aaa.com網站中使用本地php環境:vim /usr/local/nginx/conf/nginx.conf
在server{}裏添加如下:
location ~ \.php$ {
root /var/www/aaa;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
記得保存重啓服務
測試
編寫php文件
<?php
phpinfo();
?>
編寫php文件測試數據庫
出現以上錯誤說明mysql_connect這個模塊將在未來棄用,請你使用mysqli或者PDO來替代
解決方法一(不建議,最好把報錯顯示出來):
display_errors=on改爲off
解決方法二:
修改php文件代碼:mysql_connect改成mysqli_connect
成功如下圖:
補充:安裝ZendGuardLoader優化模塊
cp ZendGuardLoader.so /usr/local/php5/lib/php/
修改php.ini配置文件啓用優化模塊
zend_extension=/usr/local/php5/lib/php/ZendGuardLoader.so
zend_loader.enable=1
虛擬站點搭建
直接修改主配置文件添加一個server板塊即可,配置如下圖(基於域名):
vim /usr/local/nginx/conf/nginx.conf
四、Nginx+Apache動靜分離
作用原理:Nginx靜態頁面的處理擁有更好的性能,用Nginx訪問html而用Apache訪問php
1.編譯安裝Apache之後修改配置文件端口改爲8080
Listen 8080和ServerName study2.renjie.com:8080
2.安裝LAMP需要的php擴展包libmcrypt、mhash、mcrypt
3.重新編譯php
./configure --prefix=/usr/local/php5 --with-mcrypt --with-apxs2=/usr/local/httpd/bin/apxs --with-gd --with-curl --with-zlib --with-mysqli --with-mysql=/usr/local/mysql --with-config-file-path=/usr/local/php5 --enable-mbstring --enable-fpm --with-jpeg-dir=/usr/lib
Apache主配置文件添加識別php
AddType application/x-httpd-php .php和DirectoryIndex index.php index.html
編寫網頁測試訪問該地址8080端口和下面的php文件
最後修改Nginx主配置文件
添加
location ~ \.php$ {
proxy_pass http://www.cba.com;
}
保存重啓服務訪問測試用Nginx下的www.bbb.com去訪問Apache下的php網頁
五、訪問控制
基於授權的訪問控制
下載工具安裝:yum install -y httpd-tools
1.生成用戶密碼認證文件
htpasswd -c /usr/local/nginx/passwd.db webadmin
然後會讓你輸入密碼並確認密碼
2.修改passwd.db的權限爲400 ,修改文件屬主爲nginx用戶
3.修改配置文件,添加認證項
在要設置的站點location下添加
auth_basic "secret";
auth_basic_user_file /usr/local/nginx/passwd.db;
基於地址限制的訪問控制
直接在要設置的站點的location下設置
deny 192.168.0.100;
allow all;
六、Nginx管理優化
隱藏版本號
查詢版本號:curl -I http://192.168.0.122(也可以把IP地址換成解析後的網址)
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
在http裏添加server_tokens off;就可以隱藏版本(記得重啓服務生效)
補充:在編譯之前修改安裝包裏nginx-1.17.8/src/core目錄下的nginx.h文件
修改下面兩個參數再編譯安裝,可以設置版本信息顯示內容
#define NGINX_VERSION "1.17.8"
#define NGINX_VER "nginx/" NGINX_VERSION
修改用戶組
Nginx運行時主進程是root創建,子進程由指定 的用戶和組創建,Nginx默認使用的nobody
1.編譯安裝時指定用戶和組
./configure –prefix=/usr/local/nginx –user=nginx –group=nginx –with-http_stub_status_module
2.編譯安裝完之後修改配置文件:vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
配置網頁緩存時間
修改主配置文件:vim /usr/local/nginx/conf/nginx.conf
在網頁塊下新加一個location
日誌切割
Nginx沒有類似apache的cronlog日誌分割處理能力,但是可以通過nginx的信號控制功能腳本來實現日誌的分割
#!/bin/bash
#定義各種變量
date=`date -d "-1 day" +%Y%m%d`
logpath="/usr/local/nginx/logs"
pidpath="/usr/local/nginx/logs/nginx.pid"
#移動日誌到存放目錄
[ -d $logpath ] || mkdir -p $logpath
mv /usr/local/nginx/logs/access.log ${logpath}/www..access.log.$date
#重新創建日誌目錄
kill -HUP `cat $pidpath`
#定期刪除多餘的日誌文件(刪除30天之前的)
find $logpath -mtime +30 | xargs rm -rf
nginx 1.16版本開始自帶了日誌切割功能,而1.12版本,目前有幾種辦法可以做到按天切割
設置連接超時
爲了避免一個客戶長時間佔用連接,造成資源浪費,可設置相應的連接超時參數,實現控制連接訪問時間
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
Keepalive_timeout 65 180 ; \\默認時間65 超時時間180
進程優化
優化nginx進程數量,修改 Nginx 的配置文件的 worker_processes 參數,一般設爲 CPU 的個數或者核數, 在高併發的情況下可設置爲 CPU 個數或者核數的 2 倍,可以查看 CPU 的核數以確定參數
查看進程:cat /proc/cpuinfo | grep -c "physical"
默認情況,nginx的多個進程可能更多的跑在一個CPU上,可以分配不同的進程給 不同的 CPU 處理,充分利用硬件多核多 CPU,在一臺 4 核 CPU 服務器上,可以設置每個 進程分別由不同的 CPU 核心處理,達到 CPU 的性能最大化
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
worker_processes 4; \\開啓進程數
worker_cpu_affinity 0001 0010 0100 1000 \\邏輯CPU
補充:1.16版本
work_processes auto;
網頁壓縮
Nginx 的 ngx_http_gzip_module 壓縮模塊提供了對文件內容壓縮的功能,默認nginx已經安裝此模塊
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
gzip on; \\開啓gzip壓縮輸出
gzip_min_length 1k; \\用於設置允許壓縮的頁面最小字節數
gzip_buffers 4 16k; \\表示申請 4 個單位爲 16k 的內存作爲壓縮結果流緩存,默認值 是申請與原始數據大小相同的內存空間來存儲 gzip 壓縮結果
gZip_http_version 1.0; \\用於設置識別 http 協議版本,默認是 1.1,目前大部分瀏覽 器已經支持 gzip 解壓,但處理最慢,也比較消耗服務器 CPU 資源
Gzip_comp_level2; \\用來指定 gzip 壓縮比,1 壓縮比最小,處理速度最快;9 壓縮 比最大,傳輸速度快,但處理速度最慢,使用默認即可
Gzip_types text/plain; \\壓縮類型,是對哪些網頁文檔啓用壓縮功能
Gzip_vary on; \\選項可以讓前端的緩存服務器緩存經過 gzip 壓縮的頁面
防盜鏈
Nginx 的防盜鏈原理是加入 location 項,用正則表達式過濾圖片類型文件,對於信任的 網址可以正常使用,不信任的網址返回相應的錯誤圖片
修改配置文件:vim /usr/local/nginx/conf/nginx.conf
在需要設置的網頁段下面添加location
location ~*\.(png|jpg|gif|swf)$ {
valid_referers none blocked *.bbb.com bbb.com;
if ($invalid_referer) {
rewrite ^/http://www.aaa.com/error.jpg;
}
}
FPM參數優化
Nginx的PHP解析功能實現其中一種是交給FPM處理,如果要提供nginx對PHP的處理速度,需要對FPM進行優化
修改配置文件:vim /usr/local/php5/etc/php-fpm.conf
pm = dynamic / static; \\static(靜態)或者dynamic(動態)
pm.max_children = 5; \\如果靜態方式開啓的php-fpm進程數,在動態方式下他限定php-fpm的最大進程數
pm.start_servers = 2; \\動態情況下初始啓動的進程數
pm.max_spare_servers = 3; \\動態情況下最大的空閒進程
pm.min_spare_servers = 5; \\動態情況下最小的空閒進程
pm.max_requests = 500; \\最大的請求數
補充:建議設置
pm=dynamic;
pm.max_children=20;
pm.start_servers=5;
pm.min_spare_servers=5;
pm.max_spare_servers=20;
這樣可以最大的節省內存並提高執行效率