Nginx 優化與防盜鏈全解析:從性能調優到資源保護
文章目錄
- Nginx 優化與防盜鏈全解析:從性能調優到資源保護
- 一、基礎安全優化:隱藏版本號
- 1.1 查看當前版本號
- 1.2 兩種隱藏/修改方案
- 方案一:修改配置文件(快速隱藏)
- 方案二:修改源碼(深度偽裝)
- 二、權限優化:修改運行用戶與組
- 2.1 操作步驟
- 三、性能優化:緩存時間設置
- 3.1 配置緩存規則
- 3.2 驗證緩存效果
- 四、日志管理:日志切割
- 4.1 編寫日志切割腳本
- 4.2 配置定時執行
- 五、連接優化:超時參數配置
- 5.1 核心超時參數說明
- 5.2 配置超時參數
- 六、并發優化:調整進程數與CPU親和性
- 6.1 查看CPU核數
- 6.2 配置進程數與CPU親和性
- 6.3 調整系統文件描述符限制
- 七、傳輸優化:配置網頁壓縮
- 7.1 配置壓縮參數
- 7.2 驗證壓縮效果
- 八、資源保護:配置防盜鏈
- 8.1 防盜鏈核心原理
- 8.2 配置防盜鏈規則
- 參數說明:
- 8.3 實操驗證(兩臺服務器對比)
- 1. 源服務器配置
- 2. 盜鏈服務器配置
Nginx 作為高性能的 HTTP 和反向代理服務器,在實際生產環境中需要通過 性能優化提升并發處理能力、降低資源消耗,同時通過 防盜鏈配置保護服務器上的靜態資源(如圖片、視頻、文檔等)不被非法站點盜用。本文將詳細拆解 Nginx 的核心優化手段與防盜鏈配置方案,并附完整實操代碼。
一、基礎安全優化:隱藏版本號
Nginx 默認會在響應頭中暴露服務器版本號(如 Server: nginx/1.24.0
),攻擊者可能利用特定版本的漏洞發起攻擊。隱藏或修改版本號可降低被針對性攻擊的風險。
1.1 查看當前版本號
通過 curl
命令查看響應頭中的版本信息:
curl -I http://192.168.10.23 # 替換為你的Nginx服務器IP
響應中會包含類似 Server: nginx/1.12.0
的字段,即當前版本號。
1.2 兩種隱藏/修改方案
方案一:修改配置文件(快速隱藏)
通過 server_tokens
指令關閉版本號顯示,無需重新編譯,適合快速部署:
vim /usr/local/nginx/conf/nginx.conf # 編輯主配置文件
在 http
塊中添加 server_tokens off;
:
http {include mime.types;default_type application/octet-stream;server_tokens off; # 關閉版本號顯示# 其他配置...
}
重啟 Nginx 使配置生效:
systemctl restart nginx # 若使用systemd管理;若無則用 /usr/local/nginx/sbin/nginx -s reload
再次執行 curl -I
命令,響應頭中 Server: nginx
將不再顯示版本號。
方案二:修改源碼(深度偽裝)
若需偽裝成其他服務器(如 IIS、Apache),需修改 Nginx 源碼后重新編譯,適合對安全要求極高的場景:
-
修改源碼定義:
vim /opt/nginx-1.12.0/src/core/nginx.h # 替換為你的源碼路徑
修改版本號和服務器類型:
#define NGINX_VERSION "1.1.1" // 自定義版本號 #define NGINX_VER "IIS/" NGINX_VERSION // 偽裝成IIS服務器
-
重新編譯安裝:
cd /opt/nginx-1.12.0/ # 進入源碼目錄 # 重新配置編譯參數(保持與原安裝一致) ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module make && make install # 編譯并安裝
-
開啟版本顯示驗證:
編輯配置文件,確保server_tokens on;
(默認開啟):http {server_tokens on; # 開啟后顯示偽裝的版本和類型 }
重啟 Nginx 后,
curl -I
響應頭將顯示Server: IIS/1.1.1
,實現深度偽裝。
二、權限優化:修改運行用戶與組
Nginx 默認以 root
用戶啟動(主進程),子進程也繼承 root
權限,若服務器被入侵,攻擊者可能獲得高權限。建議創建低權限用戶運行 Nginx 子進程。
2.1 操作步驟
-
創建nginx用戶組(若未創建):
useradd -r -M -s /sbin/nologin nginx # 創建系統用戶,無登錄權限
-
修改配置文件:
vim /usr/local/nginx/conf/nginx.conf
在配置文件頂部指定運行用戶和組:
user nginx nginx; # user 用戶名 組名;(默認注釋,取消注釋并修改) worker_processes 1; # 進程數,后續會優化 # 其他配置...
-
重啟驗證:
systemctl restart nginx ps aux | grep nginx # 查看進程權限
輸出中主進程(
master process
)為root
,子進程(worker process
)為nginx
,符合權限最小化原則。
三、性能優化:緩存時間設置
對于靜態資源(圖片、CSS、JS 等),設置瀏覽器緩存可減少重復請求,降低服務器帶寬消耗,提升用戶訪問速度。動態資源(如 PHP 生成的頁面)不建議設置緩存。
3.1 配置緩存規則
編輯 Nginx 配置文件,在 server
塊中添加靜態資源緩存規則:
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.kgc.com; # 替換為你的域名location / {root html;index index.html index.htm;}# 對圖片類型設置1天緩存location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {root html;expires 1d; # 緩存時間:1d(天)、1h(小時)、30m(分鐘)}# 對CSS、JS設置12小時緩存location ~ \.(css|js)$ {root html;expires 12h;}
}
3.2 驗證緩存效果
-
重啟 Nginx:
systemctl restart nginx
-
瀏覽器驗證:
- 訪問
http://www.kgc.com/game.jpg
(替換為你的靜態資源)。 - 打開瀏覽器「開發者工具」→「網絡」→ 選中資源,查看「響應頭」,若包含
Cache-Control: max-age=86400
(86400秒=1天),說明緩存配置生效。
- 訪問
四、日志管理:日志切割
Nginx 日志默認寫入單個文件(access.log
、error.log
),長期運行會導致日志文件過大,難以查看和分析。通過日志切割定期歸檔舊日志,刪除過期日志,可優化磁盤空間占用。
4.1 編寫日志切割腳本
創建 fenge.sh
腳本,實現日志歸檔、重建和清理:
vim /opt/fenge.sh
#!/bin/bash
# 日志切割腳本
# 1. 定義變量
day=$(date -d "-1 day" "+%Y%m%d") # 前一天的日期(如20241001)
logs_path="/var/log/nginx" # 日志歸檔目錄
pid_path="/usr/local/nginx/logs/nginx.pid" # Nginx主進程PID文件# 2. 若歸檔目錄不存在則創建
[ -d $logs_path ] || mkdir -p $logs_path# 3. 移動舊日志到歸檔目錄并命名
mv /usr/local/nginx/logs/access.log ${logs_path}/kgc-access-${day}.log
mv /usr/local/nginx/logs/error.log ${logs_path}/kgc-error-${day}.log# 4. 向Nginx發送USR1信號,重建新日志文件
kill -USR1 $(cat $pid_path)# 5. 刪除30天前的舊日志,釋放磁盤空間
find $logs_path -name "kgc-*.log" -mtime +30 -exec rm -rf {} \;
4.2 配置定時執行
-
添加執行權限:
chmod +x /opt/fenge.sh
-
測試腳本:
/opt/fenge.sh ls /var/log/nginx # 查看是否生成歸檔日志
-
設置crontab定時任務:
每天凌晨1點自動執行腳本:crontab -e
添加以下內容:
0 1 * * * /opt/fenge.sh # 分 時 日 月 周 腳本路徑
五、連接優化:超時參數配置
HTTP 的 Keep-Alive
模式可復用 TCP 連接,減少握手開銷,但連接長時間閑置會占用服務器資源。合理設置超時參數可平衡性能與資源消耗。
5.1 核心超時參數說明
參數 | 作用 | 建議值 |
---|---|---|
keepalive_timeout | 保持連接的超時時間,超時后服務器關閉連接 | 65s |
client_header_timeout | 等待客戶端發送請求頭的超時時間,超時返回408錯誤 | 80s |
client_body_timeout | 等待客戶端發送請求體的超時時間,超時返回408錯誤 | 80s |
send_timeout | 服務器向客戶端發送響應的超時時間,超時后關閉連接 | 60s |
5.2 配置超時參數
編輯 Nginx 配置文件,在 http
塊中添加超時設置:
vim /usr/local/nginx/conf/nginx.conf
http {include mime.types;default_type application/octet-stream;# 連接超時配置keepalive_timeout 65 180; # 第一個值:連接超時;第二個值:響應頭中Keep-Alive: timeout=180client_header_timeout 80;client_body_timeout 80;send_timeout 60;# 其他配置...
}
重啟 Nginx 使配置生效。
六、并發優化:調整進程數與CPU親和性
Nginx 采用「主進程+多子進程」模型,子進程(worker_processes
)負責處理客戶端請求。合理設置子進程數與 CPU 親和性,可充分利用多核 CPU 資源,提升并發處理能力。
6.1 查看CPU核數
cat /proc/cpuinfo | grep -c "physical id" # 查看物理CPU數
cat /proc/cpuinfo | grep -c "core id" # 查看總核心數(推薦以此為參考)
6.2 配置進程數與CPU親和性
編輯配置文件,在 user
指令后修改進程相關設置:
vim /usr/local/nginx/conf/nginx.conf
user nginx nginx;
worker_processes 2; # 子進程數,建議設置為CPU核心數或2倍(如4核設為4或8)# CPU親和性:綁定子進程到指定CPU核心(避免進程切換開銷)
# 2核CPU:01(第一個核心)、10(第二個核心)
# 4核CPU:0001、0010、0100、1000
worker_cpu_affinity 01 10;# 每個子進程的最大連接數(需結合系統ulimit調整)
events {worker_connections 10240; # 默認1024,可提升至10240(需系統支持)
}
6.3 調整系統文件描述符限制
Nginx 處理連接需占用文件描述符,默認系統限制可能過低,需調整:
-
臨時調整:
ulimit -n 65535 # 臨時設置最大文件描述符為65535
-
永久調整:
vim /etc/security/limits.conf
添加以下內容:
* soft nofile 65535 * hard nofile 65535 nginx soft nofile 65535 nginx hard nofile 65535
重啟系統后生效。
七、傳輸優化:配置網頁壓縮
Nginx 的 ngx_http_gzip_module
模塊可對響應內容(HTML、CSS、JS、圖片等)進行 Gzip 壓縮,減少傳輸數據量,提升加載速度。該模塊默認已安裝。
7.1 配置壓縮參數
編輯 Nginx 配置文件,在 http
塊中添加壓縮設置:
vim /usr/local/nginx/conf/nginx.conf
http {# 開啟Gzip壓縮gzip on;# 最小壓縮文件大小(小于1k不壓縮,避免小文件壓縮開銷大于收益)gzip_min_length 1k;# 壓縮緩沖區(4個64k緩沖區)gzip_buffers 4 64k;# 支持的HTTP版本(1.1兼容性更好)gzip_http_version 1.1;# 壓縮級別(1-9,級別越高壓縮率越高但CPU消耗越大,推薦6)gzip_comp_level 6;# 告訴客戶端服務器支持壓縮(配合緩存服務器使用)gzip_vary on;# 壓縮類型(指定需要壓縮的文件格式)gzip_types text/plain text/javascript application/x-javascript text/css text/xml application/xml application/xml+rss image/jpg image/jpeg image/png image/gif application/x-httpd-php application/json;
}
7.2 驗證壓縮效果
-
重啟 Nginx:
systemctl restart nginx
-
瀏覽器驗證:
- 訪問
http://www.kgc.com
,打開「開發者工具」→「網絡」→ 選中資源,查看「響應頭」。 - 若包含
Content-Encoding: gzip
,說明壓縮生效。
- 訪問
八、資源保護:配置防盜鏈
防盜鏈通過驗證 Referer
字段(表示請求來源),禁止非法站點盜用服務器上的靜態資源(如圖片、視頻),避免帶寬被濫用。
8.1 防盜鏈核心原理
Referer
字段記錄了請求的來源域名,Nginx 通過 valid_referers
指令定義「信任的來源」,若來源不在信任列表中,則執行重定向或返回403錯誤。
8.2 配置防盜鏈規則
編輯 Nginx 配置文件,在 server
塊中添加防盜鏈規則:
vim /usr/local/nginx/conf/nginx.conf
server {listen 80;server_name www.kgc.com;# 對圖片、視頻等資源設置防盜鏈location ~* \.(jpg|jpeg|png|gif|swf|mp4|flv)$ {root html;# 定義信任的來源(允許這些來源訪問資源)valid_referers none blocked *.kgc.com kgc.com;# 若來源非法($invalid_referer為true)if ($invalid_referer) {# 方案1:重定向到自定義錯誤圖片rewrite ^/ http://www.kgc.com/error.png;# 方案2:直接返回403禁止訪問# return 403;}}# 其他配置...
}
參數說明:
~* \.(jpg|...)$
:不區分大小寫匹配指定格式的資源;valid_referers
:信任的來源列表:none
:允許直接在瀏覽器地址欄輸入資源URL(無Referer);blocked
:允許Referer為空或被瀏覽器隱藏的請求;*.kgc.com
:允許所有子域名(如blog.kgc.com
);kgc.com
:允許主域名;
$invalid_referer
:內置變量,若來源不在信任列表則為true
。
8.3 實操驗證(兩臺服務器對比)
假設存在兩臺服務器:
- 源服務器:192.168.10.23(
www.kgc.com
,存放合法資源game.jpg
和錯誤圖片error.png
); - 盜鏈服務器:192.168.10.80(
www.benet.com
,試圖盜用game.jpg
)。
1. 源服務器配置
- 準備資源:將
game.jpg
、error.png
放入/usr/local/nginx/html
; - 配置 hosts(本地解析):
echo "192.168.10.23 www.kgc.com" >> /etc/hosts
- 重啟 Nginx。
2. 盜鏈服務器配置
- 編輯盜鏈頁面:
vim /usr/local/nginx/html/index.html
<html> <body><h1>盜鏈測試</h1>