Nginx最佳化與防盜鏈

无敌小鲁班發表於2024-06-06

目錄
  • 1.Nginx服務最佳化
    • (1)配置Nginx隱藏版本號
    • (2)修改Nginx使用者與組
    • (3)配置Nginx網頁快取時間
    • (4)實現Nginx的日誌切割
    • (5)配置Nginx實現連線超時
    • (6)更改Nginx執行程序數
    • (7)配置Nginx實現網頁壓縮功能
    • (8)配置Nginx實現防盜鏈
      • (1)實驗演練
    • (9)nginx常用模組

1.Nginx服務最佳化

(1)配置Nginx隱藏版本號

隱藏Nginx版本號,避免安全漏洞洩漏:修改配置檔案法;修改原始碼法
server_tokens off; ##新增,關閉版本號
nginx.h ##修改原始碼





重新編譯安裝
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
make -j 2 && make install





headers-more-nginx-module-0.34.tar.gz外掛包,解壓到一個目錄,編譯安裝nginx,./configure --add-module='模組路徑' && make -j 2 && make install 修改nginx.conf 檔案,在http配置塊加more_clear_ headers '響應頭欄位';  ————可去除響應頭任何欄位

(2)修改Nginx使用者與組

Nginx執行時程序需要有使用者與組的支援,以實現對網站檔案讀取時進行訪問控制
Nginx預設使用nobody使用者賬號與組賬號
修改的方法:編譯安裝時指定使用者與組;修改配置檔案指定使用者與組
user 使用者名稱 組名;

(3)配置Nginx網頁快取時間

當Nginx將網頁資料返回給客戶端後,可設定快取的時間,以方便在日後進行相同內容的請求時直接返回,避免重複請求,加快了訪問速度
一般針對靜態網頁設定,對動態網頁不設定快取時間
設定方法:修改配置檔案,在http段、或者server段、或者location段加入對特定內容的過期引數
expires 快取時間;

(4)實現Nginx的日誌切割

隨著Nginx執行時間增加,日誌也會增加。為了方便掌握Nginx執行狀態,需要時刻關注Nginx日誌檔案
太大的日誌檔案對監控是一個大災難:定期進行日誌檔案的切割
Nginx自身不具備日誌分割處理的功能,但可以透過Nginx訊號控制功能的指令碼實現日誌的自動切割
透過Linux的計劃任務週期性地進行日誌切割
shell指令碼 + crontab

在linux作業系統中,每個檔案都有很多的時間引數,其中有三個比較主要,分別是ctime,atime,mtime
ctime(status time):
當修改檔案的許可權或者屬性的時候,就會更新這個時間,ctime並不是create time,更像是change time,
只有當更新檔案的屬性或者許可權的時候才會更新這個時間,但是更改內容的話是不會更新這個時間。

atime(accesstime):
當使用這個檔案的時候就會更新這個時間。

mtime(modification time):
當修改檔案的內容資料的時候,就會更新這個時間,而更改許可權或者屬性,mtime不會改變,這就是和ctime的區別。

(5)配置Nginx實現連線超時

為避免同一客戶端長時間佔用連線,造成資源浪費,可設定相應的連線超時引數,實現控制連線訪問時間

超時引數:
Keepalive_timeout 服務端超時時間 客戶端超時時間; ##設定連線保持超時時間
Client_header_timeout ##指定等待客戶端傳送請求頭的超時時間
Client_body_timeout ##設定請求體讀超時時間

keepalive_timeout
指定KeepAlive的超時時間(timeout)。指定一個長連線最多可以保持多長時間,伺服器將會在這個時間後關閉連線。 Nginx的預設值是65秒,有些瀏覽器最多隻保持 60 秒,所以可以設定為 60 秒。若將它設定為0,就禁止了keepalive 連線。
第二個引數(可選的)指定了在響應頭Keep-Alive:timeout=time中的time值。這個頭能夠讓一些瀏覽器主動關閉連線,這樣伺服器就不必去關閉連線了。沒有這個引數,Nginx 不會傳送 Keep-Alive 響應頭。

client_header_timeout
客戶端向服務端傳送一個完整的 request header 的超時時間。如果客戶端在指定時間內沒有傳送一個完整的 request header,Nginx 返回 HTTP 408(Request Timed Out)。

client_body_timeout
指定客戶端與服務端建立連線後傳送 request body 的超時時間。如果客戶端在指定時間內沒有傳送任何內容,Nginx 返回 HTTP 408(Request Timed Out)。

(6)更改Nginx執行程序數

在高併發場景,需要啟動更多的Nginx程序以保證快速響應,以處理使用者的請求,避免造成阻塞
修改配置檔案的worker_processes引數:一般設為CPU的個數或者核數;在高併發情況下可設定為CPU個數或者核數的2倍
增加程序數,可減少了系統的開銷,提升了服務速度
預設情況,Nginx的多個程序可能跑在一個CPU上,可以分配不同的程序給不同的CPU處理,充分利用硬體多核多CPU

cat /proc/cpuinfo | grep -c "physical id" #檢視cpu核數 
ps aux | grep nginx	#檢視nginx主程序中包含幾個子程序	
worker_processes 與伺服器CPU數量相同或auto   #修改為cpu的總核數,一般情況不超過8個
worker_cpu_affinity ##工作程序靜態綁核
#將每個worker子程序與特定CPU物理核心繫結,提升cpu利用率,進而提升效能。避免同一個worker子程序在不同的CPU核心上切換或者多個程序跑在一個CPU上,快取失效,降低效能。

(7)配置Nginx實現網頁壓縮功能

Nginx的ngx_http_gzip_module壓縮模組提供對檔案內容壓縮的功能
允許Nginx伺服器將輸出內容在傳送客戶端之前進行壓縮,以節約網站頻寬,提升使用者的訪問體驗,預設已經安裝
可在配置檔案中加入相應的壓縮功能引數對壓縮效能進行最佳化
gzip on; #開啟gzip壓縮功能


#實現網頁圖片的大小壓縮
http_image_filter_module是Nginx提供的整合圖片處理模組,可以用於實時縮放圖片,旋轉圖片,驗證圖片有效性以及獲取圖片寬高以及圖片型別資訊
yum install -y gd-devel  ##yum線上源安裝gd-devel,http_image_filter_module模組需要依賴gd-devel的支援,重新編譯安裝啟動
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module --with-http_image_filter_module 
make -j 2 && make install
image_filter resize 200 200;	#按等比例縮小影像的寬或高至指定大小。如果只想設定一個維度,另一維可以指定為:“-”


#注:Nginx的Gzip壓縮功能雖然好用,但是下面兩類檔案資源不太建議啟用此壓縮功能。
1)圖片/影片型別資源 原因:圖片如jpg、png檔案本身就會有壓縮,所以就算開啟gzip後,壓縮前和壓縮後大小沒有多大區別,所以開啟了反而會白白的浪費資源。
2)大檔案資源 原因:會消耗大量的cpu資源,且不一定有明顯的效果。

(8)配置Nginx實現防盜鏈

在企業網站服務中,一般都要配置防盜鏈功能,以避免網站內容被非法盜用,造成經濟損失
Nginx防盜鏈功能也非常強大。預設情況下,只需要進行簡單的配置,即可實現防盜鏈處理

ewrite if ( $invalid_referer) {rewrite... }

~* \.(jpg|gif|swf)$ :這段正規表示式表示匹配不區分大小寫,以.jpg 或.gif 或.swf 結尾的檔案;
valid_referers :設定信任的網站,可以正常使用圖片;
none:允許沒有http_refer的請求訪問資源(根據Referer的定義,它的作用是指示一個請求是從哪裡連結過來的,如果直接在瀏覽器的位址列中輸入一個資源的URL地址,那麼這種請求是不會包含 Referer 欄位的),如 http://www.kgc.com/game.jpg
我們使用 http://www.kgc.com 訪問顯示的圖片,可以理解成 http://www.kgc.com/game.jpg 這個請求是從 http://www.kgc.com 這個連結過來的。
blocked:允許不是http://開頭的,不帶協議的請求訪問資源; 
*.kgc.com:只允許來自指定域名的請求訪問資源,如 http://www.kgc.com

if語句:如果連結的來源域名不在valid_referers所列出的列表中,$invalid_referer為true,則執行後面的操作,即進行重寫或返回 403 頁面。

(1)實驗演練

盜鏈網站主機(20.0.0.160)



Web源主機(20.0.0.150)



(9)nginx常用模組

http_stub_status_module       訪問狀態統計模組
http_gzip_module              網頁壓縮模組
http_rewrite_module           URL地址重寫模組
http_ssl_module               https安全加密模組
http_auth_basic_module        網頁使用者認證模組
http_fastcgi_module           fastcgi轉發模組
http_image_filter_module      圖片處理模組
http_mp4/flv_module           mp4/flv影片格式模組
http_limit_req_module         限制請求數模組
http_limit_conn_module        限制連線數模組
http_proxy_module             代理轉發模組
http_upstream_*_module        負載均衡模組
stream                        四層代理轉發模組

相關文章