Nginx優化與防盜鏈
前言
為了適應企業需求,就需要考慮如何提升Nginx的效能與穩定性,這就是Nginx優化的內容,本次部落格主要講述Nginx的優化以及防盜鏈的部署。
Nginx的詳細編譯安裝步驟:https://blog.csdn.net/weixin_47403060/article/details/109071875
一、隱藏版本號
1、隱藏Nginx版本號,避免安全漏洞洩露
2、Nginx隱藏版本號的方法
未隱藏版本號前使用curl -I(大寫的i)命令檢測結果
1 [root@localhost ~]# curl -I http://192.168.73.40 2 HTTP/1.1 200 OK 3 Server: nginx/1.12.24 Date: Fri, 16 Oct 2020 06:15:34 GMT
1.1、修改配置檔案方法
1 vi /usr/local/nginx/conf/nginx.conf 2 http { 3 include mime.types; 4 default_type application/octet-stream; 5 6 server_tokens off; ###關閉版本號 7 [root@localhost ~]# systemctl restart nginx 8 9 [root@localhost ~]# curl -I http://192.168.73.40 10 HTTP/1.1 200 OK 11 Server: nginx 12 Date: Fri, 16 Oct 2020 06:25:37 GMT
1.2、修改原始碼並重新編譯安裝
1 [root@localhost ~]# vi /root/nginx-1.12.2/src/core/nginx.h 2 #define nginx_version 1012002 3 #define NGINX_VERSION "1.1.1" ###修改版本號 4 #define NGINX_VER "nginx/" NGINX_VERSION 5 6 [root@localhost nginx-1.12.2]# make && make install 7 8 [root@localhost ~]# curl -I http://192.168.73.40 9 HTTP/1.1 200 OK 10 Server: nginx/1.1.1
二、修改Nginx使用者和組
1、Nginx執行時程序需要有使用者與組的支援,以實現對網站檔案讀取時進行訪問控制
2、Nginx預設使用nobody使用者賬號與組賬號
3、修改的方法
編譯安裝時指定使用者與組
1 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf 2 user nginx nginx; 3 4 [root@localhost ~]# systemctl restart nginx 5 [root@localhost ~]# ps aux | grep nginx ###檢視程序資訊
三、配置Nginx網頁快取時間
1、當nginx將網頁資料返回給客戶端後,可設定快取的時間,以方便在日後進行相同內容的請求時直接返回,避免重複請求,加快了訪問速度。
2、一般針對靜態網頁設定,對動態網頁不設定快取時間
3、設定方法
在主配置檔案的location段加入expires引數
1 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf 2 location / { 3 root html; 4 index index.html index.htm; 5 expires 1d; ###設定快取時間為1天 6 } 7 8 [root@localhost ~]# systemctl restart nginx
四、實現Nginx的日誌切割
1、隨著Nginx執行時間增加,日誌也會增加。太大的日誌檔案對監控是一個大災難。所以需要定期進行日誌檔案的切割
2、Nginx自身不具備日誌分割處理的功能,但可以通過Nginx訊號控制功能的指令碼實現日誌的自動切割(Kill -HUP cat /xxx/log/nginx.pid #平滑重啟nginx,類似reload)
-QUIT :結束程序;-USR1:日誌分割;-USR2:平滑升級
3、通過Linux的計劃任務週期性地進行日誌切割
4、編寫指令碼進行日誌切割示例
1 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf 2 error_log logs/error.log info; 3 4 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' 5 '$status $body_bytes_sent "$http_referer" ' 6 '"$http_user_agent" "$http_x_forwarded_for"'; 7 8 access_log logs/access.log main; ###去除前面#號 9 10 [root@localhost ~]# nginx -t ###檢查配置檔案是否正確 11 nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok 12 nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful 13 14 [root@localhost ~]# vim fenge.sh 15 #!/bin/bash 16 #Filename:fenge.sh 17 d=$(date -d "-1 day" "+%Y%m%d") 18 logs_path="/var/log/nginx" 19 pid_path="/usr/local/nginx/logs/nginx.pid" ###設定日期及路徑變數 20 [ -d $logs_path ] || mkdir -p $logs_path ###自動建立日誌目錄 21 mv /usr/local/nginx/logs/access.log ${logs_path}/test.com-access.log-$d ###分割新的日誌 22 kill -HUP $(cat $pid_path) ###生成新的日誌 23 find $logs_path -mtime +30 | xargs rm -rf ###刪除30天前的日誌(xargs用來傳遞引數) 24 25 [root@localhost ~]# chmod +x fenge.sh 26 [root@localhost ~]# ./fenge.sh 27 [root@localhost ~]# cd /var/log/nginx/ 28 [root@localhost nginx]# ll 29 總用量 44 30 -rw-r--r--. 1 root root 44866 10月 16 15:11 test.com-access.log-20201015 ###執行之後生成昨天的日誌
5、關於日期
1 ###獲取當天的的日期 2 [root@localhost ~]# date +%Y%m%d 3 20201016 4 [root@localhost ~]# date 5 2020年 10月 16日 星期五 15:40:12 CST 6 7 ###昨天 8 [root@localhost ~]# date -d "-1 day" 9 2020年 10月 15日 星期四 15:41:09 CST 10 11 ###明天 12 [root@localhost ~]# date -d "day" 13 2020年 10月 17日 星期六 15:41:51 CST 14 15 ###前一天的日期 16 [root@localhost ~]# date -d "-1 day" +%d 17 15 18 19 ###前一小時 20 [root@localhost ~]# date -d "-1 hour" +%H 21 14 22 23 ###前一分鐘 24 [root@localhost ~]# date -d "-1 min" +%M 25 48 26 27 ###前一秒鐘 28 [root@localhost ~]# date -d "-1 second" +%S 29 18
五、配置Nginx實現連線超時
1、為避免同一客戶端長時間佔用連線,造成資源浪費,可設定相應的連線超時引數,實現控制連線訪問時間
2、Nginx使用keepalive_timeout來指定KeepAlive的超時時間(timeout)
3、指定每個TCP連線最多可以保持多長時間。Nginx的預設值是65秒,有些瀏覽器最多隻保持60秒,
若將它設定為0,就禁止了keepalive連線。
1 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf 2 #keepalive_timeout 0; 3 keepalive_timeout 180; 4 client_header_timeout 80; ##等待客戶端傳送請求頭的超時時間 超時會發送408錯誤 5 client_body_timeout 80; ##設定請求體的讀超時時間 6 7 [root@localhost ~]# systemctl restart nginx
六、更改Nginx執行程序數
1、在高併發場景,需要啟動更多的Nginx程序以保證快速響應,以處理使用者的請求,避免造成阻塞。
2、修改配置檔案的worker_processes引數
一般設為CPU的個數或者核數
在高併發情況下可設定為CPU個數或者核數的2倍
3、增加程序數,可減少了系統的開銷,提升了服務速度
4、使用ps aux檢視執行程序數的變化情況
1 [root@localhost ~]# cat /proc/cpuinfo | grep -c "physical id" ###檢視物理CPU的個數 2 4 3 [root@localhost ~]# ps aux | grep nginx ###檢視執行行程數 4 root 1025 0.0 0.0 20500 632 ? Ss 16:06 0:00 nginx: master process /usr/local/nginx/sbin/nginx 5 nginx 1030 0.0 0.0 22948 1656 ? S 16:06 0:00 nginx: worker process 6 root 1885 0.0 0.0 112680 984 pts/0 S+ 16:13 0:00 grep --color=auto nginx 7 8 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf 9 worker_processes 4; ###將程序數改為4 10 11 [root@localhost ~]# systemctl restart nginx 12 [root@localhost ~]# ps aux | grep nginx ###檢視執行程序數變化 13 root 1030 0.0 0.0 20500 632 ? Ss 16:17 0:00 nginx: master process /usr/local/nginx/sbin/nginx 14 nginx 1031 0.0 0.0 22948 1408 ? S 16:17 0:00 nginx: worker process 15 nginx 1032 0.0 0.0 22948 1408 ? S 16:17 0:00 nginx: worker process 16 nginx 1033 0.0 0.0 22948 1408 ? S 16:17 0:00 nginx: worker process 17 nginx 1034 0.0 0.0 22948 1408 ? S 16:17 0:00 nginx: worker process 18 root 1731 0.0 0.0 112680 980 pts/0 S+ 16:18 0:00 grep --color=auto nginx
七、配置Nginx實現網頁壓縮功能
1、修改配置檔案
1 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf 2 gzip on; ###開啟gzip壓縮功能 3 gzip_min_length 1k; ###壓縮閾值(超過1k的檔案進行壓縮) 4 gzip_buffers 4 16k; ###buffer(緩衝)大小為4個16k緩衝區大小 5 gzip_http_version 1.1; ###壓縮版本 6 gzip_comp_level 6; ###壓縮比率,最小為1,處理速度快,傳輸速度慢;最大為9,處理速度慢,傳輸速度快 7 gzip_types text/plain application/x-javascript text/css image/jpg image/png image/gif application/xml text/javascript application/x-http-php application/javascript application/json; 8 gzip_vary on; ###選擇支援vary header可以讓前端的快取伺服器快取經過gzip壓縮的頁面 9 10 [root@localhost ~]# vi /usr/local/nginx/html/index.html ###插入圖片 11 <img src=a.jpg / > 12 </body> 13 </html> 14 15 [root@localhost ~]# systemctl restart nginx
2、驗證
八、Nginx防盜鏈設定
1.源主機配置
1 [root@localhost ~]# vi /etc/hosts 2 192.168.73.40 www.test.com
2.盜鏈網站首頁配置
1 [root@server1 ~]# vi /var/www/html/index.html 2 <html><body><h1>This is Copy!</h1><img src=http://192.168.73.40/a.jpg / ></body></html>
3、源主機防盜鏈配置
1 [root@localhost ~]# vi /usr/local/nginx/conf/nginx.conf 2 location ~*\.(gif|jpg|swf)$ { 3 valid_referers none blocked *.test.com test.com; 4 if ($invalid_referer) { 5 rewrite ^/http://www.test.com/error.png; 6 } 7 }
4、測試
九、對FPM模組進行引數優化
1、Nginx 的 PHP 解析功能實現如果是交由 FPM 處理的,為了提高 PHP 的處理速度,可對
FPM 模組進行引數跳轉。
2、FPM 優化引數:
pm 使用哪種方式啟動 fpm 程序,可以說 static 和 dynamic,前者將產生固定數量的 fpm 程序,後者將以動態的方式產生 fpm 程序
pm.max_children :static 方式下開啟的 fpm 程序數
pm.start_servers :動態方式下初始的 fpm 程序數量
pm.min_spare_servers :動態方式下最大的 fpm 空閒程序數
pm.max_spare_servers :動態方式下最大的 fpm 空閒程序數
3、優化原因:伺服器為雲伺服器,運行了個人論壇,記憶體為1.5G,fpm程序數為20,記憶體消耗近1G,處理比較慢
4、優化引數調整
FPM啟動時有5個程序,最小空閒2個程序,最大空閒8個程序,最多
可以有20個程序存在
1 [root@localhost ~]# vi /usr/local/php/etc/php-fpm.d/www.conf 2 pm = dynamic 3 pm.max_children = 20 4 pm.start_servers = 5 5 pm.min_spare_servers = 2 6 pm.max_spare_servers = 8 7 8 [root@localhost ~]# /usr/local/php/sbin/php-fpm -c /usr/local/php/etc/php-fpm.d/www.conf 9 [root@localhost ~]# netstat -ntap | grep 9000 10 tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 2094/php-fpm: maste