原文:https://blog.51cto.com/11134648/2134389javascript
默認的Nginx安裝參數只能提供最基本的服務,還須要調整如網頁緩存時間、鏈接超時、網頁壓縮等相應參數,才能發揮出服務器的最大做用。
下面實驗用到的抓包工具存放在百度網盤,密碼:0fl5
Ngnix服務的安裝詳細介紹請參考 部署Nginx網站服務實現訪問狀態統計以及訪問控制功能css
能夠從隱藏版本號、更改用戶與組、配置網頁緩存時間、日誌切割、設置鏈接超時這幾個方面進行優化。html
在生產環境中須要隱藏Nginx的版本號,以免泄露Nginx的版本,使×××者不能針對特定版本進行×××。查看Nginx的版本在CentOS中使用命令curl -I http://172.16.10.10/便可。前端
[root@localhost ~]# curl -I http://172.16.10.10/ HTTP/1.1 200 OK Server: nginx/1.12.0 #Nginx版本信息 Date: Fri, 29 Jun 2018 08:52:27 GMT Content-Type: text/html Content-Length: 483 Last-Modified: Fri, 29 Jun 2018 06:56:20 GMT Connection: keep-alive ETag: "5b35d814-1e3" Accept-Ranges: bytes
隱藏版本號有兩種方式,一種是修改Nginx的源碼文件,指定不顯示版本號,第二種是修改Nginx的主配置文件。java
將Nginx的配置文件中的server_tokens選項值設置爲off,如沒有該配置項,加上便可。nginx
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf ........... #省略內容 http { include mime.types; default_type application/octet-stream; server_tokens off; #關閉版本號 ............ #省略內容
[root@localhost ~]# nginx -t #測試配置文件 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
再次訪問網址,只顯示Nginx,版本號已經隱藏。正則表達式
[root@localhost ~]# service nginx restart #從新啓動nginx服務 [root@localhost ~]# curl -I http://172.16.10.10/ HTTP/1.1 200 OK Server: nginx #nginx隱藏了版本號 Date: Fri, 29 Jun 2018 09:09:36 GMT Content-Type: text/html Content-Length: 483 Last-Modified: Fri, 29 Jun 2018 06:56:20 GMT Connection: keep-alive ETag: "5b35d814-1e3" Accept-Ranges: bytes
[root@localhost ~]# vim /opt/nginx-1.12.0/src/core/nginx.h #編輯源碼文件
#define NGINX_VERSION "1.1.1" #修改版本號 #define NGINX_VER "IIS" NGINX_VERSION #修改服務器類型
從新編譯安裝shell
[root@localhost ~]# cd /opt/nginx-1.12.0/ [root@localhost nginx-1.12.0]#./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module && make && make install
再次訪問網址,只顯示修改以後的版本信息。vim
[root@localhost nginx-1.12.0]# service nginx restart #重啓nginx服務 [root@localhost nginx-1.12.0]# curl -I http://172.16.10.10/HTTP/1.1 200 OK Server: IIS1.1.1 #nginx的版本信息 Date: Fri, 29 Jun 2018 09:30:09 GMT Content-Type: text/html Content-Length: 483 Last-Modified: Fri, 29 Jun 2018 06:56:20 GMT Connection: keep-alive ETag: "5b35d814-1e3" Accept-Ranges: bytes
Nginx運行時進程須要有用戶與組的支持,用以實現對網站文件讀取時進行訪問控制。主進程由root建立,子進程由指定的用戶與組建立。Nginx默認使用nobody用戶帳號與組帳號,通常要修改。瀏覽器
[root@localhost ~]# cd /opt/nginx-1.12.0/ [root@localhost nginx-1.12.0]#./configure --prefix=/usr/local/nginx --user=nginx #指定用戶名是nginx --group=nginx #指定組名是nginx --with- && make && make install
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf user nginx nginx; #修改用戶爲nginx,組爲nginx
重啓nginx查看進程運行狀況,主進程由root帳戶建立,子進程由nginx建立。
[root@localhost ~]# ps aux | grep nginx root 14923 0.0 0.0 20540 624 ? Ss 17:30 0:00 nginx: master process /usr/local/nginx/sbin/nginx #主進程由root建立 nginx 14925 0.0 0.1 22984 1412 ? S 17:30 0:00 nginx: worker process #子進程由nginx建立 root 19344 0.0 0.0 112720 984 pts/0 R+ 17:47 0:00 grep --color=auto nginx
當Nginx將網頁數據返回給客戶端後,可設置緩存時間,方便往後進行相同內容請求是直接返回,避免重複請求,加快訪問速度,通常只針對靜態資源進行設置,對動態網頁不用設置緩存時間。
操做步驟以下所示:
[root@localhost ~]# cd /usr/local/nginx/html/ #Nginx的網站目錄 [root@localhost html]# ls 50x.html error.png game.jpg index.html test.html
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location ~\.(gif|jpg|jepg|png|bmp|ico)$ { #加入新的location root html; expires 1d; #指定緩存時間 }
[root@localhost ~]# service nginx restart
隨着Nginx的運行時間的增長,產生的日誌也會增長。太大的日誌文件很是不便於分析和排查,所以須要按期的進行日誌文件的切割。Nginx沒有相似Apache的cronlog日誌分割處理功能,但能夠經過Nginx的信號控制功能腳原本實現日誌的自動切割,並將腳本加入到Linux的計劃任務中,讓腳本在天天的固定時間執行。
[root@localhost ~]# vim /opt/fenge.sh #!/bin/bash #Filename:fenge.sh d=$(date -d "-1 day" "+%Y%m%d") #顯示一天前的時間 logs_path="/var/log/nginx" pid_path="/usr/local/nginx/logs/nginx.pid" [ -d $logs_path ] || mkdir -p $logs_path #建立日誌文件目錄 mv /usr/local/nginx/logs/access.log #移動並重命名日誌文件 ${logs_path}/test.com-access.log-$d kill -USR1 $(cat $pid_path) #重建新的日誌文件 find $logs_path -mtime +30 | xargs rm -rf #刪除30天以前的日誌文件
[root@localhost ~]# chmod +x /opt/fenge.sh [root@localhost ~]# ./fenge.sh #執行分割腳本 [root@localhost ~]# ls /var/log/nginx/ test.com-access.log-20180628
[root@localhost ~]# crontab -e 0 1 * * * /opt/fenge.sh #天天的凌晨1點執行/opt/fenge.sh腳本
在企業網站中,爲了不同一個客戶長時間佔用鏈接,形成資源浪費,能夠設置相應的鏈接超時參數,實現對鏈接訪問的時間的控制。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf ... #省略內容 http { ... keepalive_timeout 65 180; #設置超時是180秒 client_header_timeout 80; #指定請求頭的超時時間 client_body_timeout 80; #指定請求體超時時間 ... #省略內容 }
keepalive_timeout 第一個參數指定了與客戶端的keep-alive鏈接超時時間,服務器將會在這個時間後關閉鏈接;第二個參數指定了響應頭Keep-Alive:timeout=time中的time值。這個頭能讓瀏覽器主動關閉鏈接,這樣服務器就沒必要去關閉鏈接。
(2)重啓nginx服務,訪問網址,用Fidder工具抓包。
能夠從更改進程數、配置網頁壓縮、配置防盜鏈這幾個方面進行深刻優化。
在高併發環境中,須要啓動更多的nginx進程以保證快速響應,用以處理用戶的請求,避免形成阻塞。使用ps aux命令查看Nginx運行的進程的個數。
[root@localhost ~]# ps aux | grep nginx root 14923 0.0 0.0 20540 624 ? Ss 17:30 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 14925 0.0 0.1 22984 1412 ? S 17:30 0:00 nginx: worker process root 19344 0.0 0.0 112720 984 pts/0 R+ 17:47 0:00 grep --color=auto nginx
其中master process是主進程,開啓了一個,worker process是子進程,也是開啓了一個。
[root@localhost ~]# cat /proc/cpuinfo | grep -c "physical" 2
參數設置爲2,和CPU核數相同,運行進程數設置多一些,響應客戶端請求時,Nginx就不會臨時啓動新的進程提供服務,減小了系統的開銷,提高了服務的速度。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf worker_proces 2;
[root@localhost ~]# service nginx restart [root@localhost ~]# ps aux | grep nginx root 21453 0.0 0.0 20540 636 ? Ss 20:11 0:00 nginx: master process /usr/local/nginx/sbin/nginx nginx 21457 0.0 0.1 23000 1424 ? S 20:11 0:00 nginx: worker process nginx 21458 0.0 0.1 23000 1424 ? S 20:11 0:00 nginx: worker process root 21472 0.0 0.0 112720 984 pts/0 S+ 20:11 0:00 grep --color=auto nginx
開啓了一個主進程和2個子進程,可見參數設置起了做用。
Nginx的ngx_http_gzip_module壓縮模塊提供了對文件內容壓縮的功能,以節約網站的帶寬,提高用戶的訪問體驗,默認nginx已經安裝該模塊,只須要在配置文件加入相應的壓縮功能參數對壓縮性能進行優化。
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf gzip on; #開啓gzip壓縮輸出 gzip_buffers 4 64k; #表示申請4個單位爲64kB的內存做爲壓縮結果流緩存 gzip_http_version 1.1; #用於設置http協議版本,默認是1.1 gzip_comp_level 2; #指定gzip壓縮比,壓縮比最小,處理速度最快 gzip_min_length 1k; #設置容許壓縮的頁面最小字節數 gzip_vary on; #讓前端的緩存服務器緩存通過gzip壓縮的頁面 gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss text/jpg text/png; #壓縮類型
重啓服務,以大小超過1KB的html文件做爲nginx網站內容,而後訪問網址抓取數據報文,顯示使用gzip進行了壓縮。
在企業網站服務中,通常都要配置防盜鏈功能,以免網站內容被非法盜用,形成經濟損失,也避免沒必要要的帶寬浪費。
須要準備兩臺主機模擬盜鏈,一臺主機做爲客戶端訪問盜鏈網站。
IP地址 | 域名 | 用途 | 系統 |
---|---|---|---|
172.16.10.10 | www.benet.com | 源主機 | CentOS7 |
172.16.10.20 | www.bt.com | 盜鏈主機 | CentOS7 |
172.16.10.8 | -------------- | 客戶機 | Windows7 |
172.16.10.10 www.benet.com 172.16.10.20 www.bt.com
[root@localhost ~]# vim /etc/hosts 172.16.10.10 www.benet.com 172.16.10.20 www.bt.com
[root@localhost ~]# cd /usr/local/nginx/html/ [root@localhost html]# ls 50x.html game.jpg index.html
[root@localhost ~]# cd /usr/local/nginx/html/
[root@localhost html]# vim test.html
<html> <h1>Server 172.16.10.20</h1> <body> <img src="http://www.benet.com/game.jpg"/> </body> </html>
在圖片上點擊右鍵選擇屬性,能夠看到網址是http://www.benet.com/game.jpg。
Nginx的防盜原理是加入location項,用正則表達式過濾圖片類型文件,對於信任的網址能夠正常使用,對於不信任的網址則返回相應的錯誤圖片。在源主機benet.com的配置文件加入如下代碼:
[root@localhost ~]# vim /usr/local/nginx/conf/nginx.conf location ~*\.(jpg|gif|swf)$ { valid_referers none blocked *.benet.com benet.com; if ( $invalid_referer ) { rewrite ^/ http://www.benet.com/error.png; } }
[root@localhost ~]# cd /usr/local/nginx/html/ [root@localhost html]# ls 50x.html error.png game.jpg index.html test.html
須要注意的是若是在配置文件中加入了新的location項去配置網頁緩存時間,那麼防盜鏈加入的location項應置於其以前,才能防盜鏈成功。