1. 程式人生 > 實用技巧 >Nginx優化與防盜鏈

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.2
4 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