Nginx 優化與防盜鏈全解析:從性能調優到資源保護

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 源碼后重新編譯,適合對安全要求極高的場景:

  1. 修改源碼定義

    vim /opt/nginx-1.12.0/src/core/nginx.h  # 替換為你的源碼路徑
    

    修改版本號和服務器類型:

    #define NGINX_VERSION "1.1.1"        // 自定義版本號
    #define NGINX_VER "IIS/" NGINX_VERSION  // 偽裝成IIS服務器
    
  2. 重新編譯安裝

    cd /opt/nginx-1.12.0/  # 進入源碼目錄
    # 重新配置編譯參數(保持與原安裝一致)
    ./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_stub_status_module
    make && make install  # 編譯并安裝
    
  3. 開啟版本顯示驗證
    編輯配置文件,確保 server_tokens on;(默認開啟):

    http {server_tokens on;  # 開啟后顯示偽裝的版本和類型
    }
    

    重啟 Nginx 后,curl -I 響應頭將顯示 Server: IIS/1.1.1,實現深度偽裝。

二、權限優化:修改運行用戶與組

Nginx 默認以 root 用戶啟動(主進程),子進程也繼承 root 權限,若服務器被入侵,攻擊者可能獲得高權限。建議創建低權限用戶運行 Nginx 子進程。

2.1 操作步驟

  1. 創建nginx用戶組(若未創建):

    useradd -r -M -s /sbin/nologin nginx  # 創建系統用戶,無登錄權限
    
  2. 修改配置文件

    vim /usr/local/nginx/conf/nginx.conf
    

    在配置文件頂部指定運行用戶和組:

    user nginx nginx;  #  user 用戶名 組名;(默認注釋,取消注釋并修改)
    worker_processes  1;  # 進程數,后續會優化
    # 其他配置...
    
  3. 重啟驗證

    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 驗證緩存效果

  1. 重啟 Nginx

    systemctl restart nginx
    
  2. 瀏覽器驗證

    • 訪問 http://www.kgc.com/game.jpg(替換為你的靜態資源)。
    • 打開瀏覽器「開發者工具」→「網絡」→ 選中資源,查看「響應頭」,若包含 Cache-Control: max-age=86400(86400秒=1天),說明緩存配置生效。

四、日志管理:日志切割

Nginx 日志默認寫入單個文件(access.logerror.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 配置定時執行

  1. 添加執行權限

    chmod +x /opt/fenge.sh
    
  2. 測試腳本

    /opt/fenge.sh
    ls /var/log/nginx  # 查看是否生成歸檔日志
    
  3. 設置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 處理連接需占用文件描述符,默認系統限制可能過低,需調整:

  1. 臨時調整

    ulimit -n 65535  # 臨時設置最大文件描述符為65535
    
  2. 永久調整

    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 驗證壓縮效果

  1. 重啟 Nginx

    systemctl restart nginx
    
  2. 瀏覽器驗證

    • 訪問 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. 源服務器配置
  1. 準備資源:將 game.jpgerror.png 放入 /usr/local/nginx/html
  2. 配置 hosts(本地解析):
    echo "192.168.10.23 www.kgc.com" >> /etc/hosts
    
  3. 重啟 Nginx。
2. 盜鏈服務器配置
  1. 編輯盜鏈頁面:
    vim /usr/local/nginx/html/index.html
    
    <html>
    <body><h1>盜鏈測試</h1>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/96325.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/96325.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/96325.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

HOT100--Day20--39. 組合總和,22. 括號生成,79. 單詞搜索

HOT100–Day20–39. 組合總和&#xff0c;22. 括號生成&#xff0c;79. 單詞搜索 每日刷題系列。今天的題目是《力扣HOT100》題單。 題目類型&#xff1a;回溯。 關鍵&#xff1a;掌握排列&#xff0c;組合。記得回溯。可以重復選的話&#xff0c;下一層index從哪里開始&#x…

高并發場景下的“命令執行”注入繞道記

環境&#xff1a;CentOS 8 OpenResty 1.21 PHP-FPM 8.0 背景&#xff1a;營銷團隊上線了一個“圖片裁剪”接口&#xff0c;參數直接拼進 shell_exec&#xff0c;結果被打成“礦機”。1. 發現&#xff1a;流量突增 30 倍&#xff0c;卻不見數據庫慢查詢 iftop -i eth0出站 1.8…

【modbus學習】

Modbus通信&#xff08;源于施耐德&#xff09;串行鏈路&#xff1a;RTU&#xff08;傳輸大量數據&#xff0c;適合工業&#xff09;、ASCII&#xff08;少量數據&#xff0c;適合計算機&#xff09;TCP/IP&#xff1a;TCP&#xff08;傳輸嚴謹&#xff0c;效率低&#xff09;、…

Redis單線程模型為什么快?

Redis的單線程模型指的是redis只使用一個線程來出來所有的命令式指令&#xff0c;但是不是意味著redis內部就只使用一個線程來處理所有的任務。都知道redis是一個客戶端-服務器的程序&#xff0c;那么redis就只有一個服務器&#xff0c;但是有多個客戶端&#xff0c;就像mysql一…

前端安全攻防:XSS, CSRF 等常見威脅的防范與檢測指南

在如今高度互聯的 Web 應用世界里&#xff0c;前端安全不再是可有可無的選項&#xff0c;而是構建可信賴、健壯應用的基石。隨著 Web 技術的發展&#xff0c;攻擊者們也變得越來越狡猾&#xff0c;前端遭受的攻擊手段層出不窮。其中&#xff0c;跨站腳本攻擊 (XSS) 和跨站請求偽…

Scikit-learn Python機器學習 - 特征降維 壓縮數據 - 特征選擇 - 移除低方差特征(VarianceThreshold)

鋒哥原創的Scikit-learn Python機器學習視頻教程&#xff1a; 2026版 Scikit-learn Python機器學習 視頻教程(無廢話版) 玩命更新中~_嗶哩嗶哩_bilibili 課程介紹 本課程主要講解基于Scikit-learn的Python機器學習知識&#xff0c;包括機器學習概述&#xff0c;特征工程(數據…

C#(鏈表創建與原地反轉)

鏈表創建&#xff08;C#&#xff09; 在C#中&#xff0c;鏈表可以通過自定義節點類實現。每個節點包含數據域和指向下一個節點的引用。 public class ListNode {public int val;public ListNode next;public ListNode(int val0, ListNode nextnull) {this.val val;this.next…

Android --- AOSP源碼導入Android Studio

AOSP代碼量龐大&#xff0c;為了開發的方便&#xff0c;我們需要導入到android studio中&#xff0c;其中關鍵的一 項就是配置跳轉。尤其是對于Framework開發來說生成 ipr,iml 工程文件make idegen ./development/tools/idegen/idegen.sh會生成如下文件首先需要修改ipr和iml文件…

游戲中的設計模式——第一篇 設計模式簡介

前言 對于設計模式&#xff0c;相信很多開發者并不陌生&#xff0c;我在學習過程中希望把自己的一些總結和心得體會與你分享。 本專欄主要將重點放在設計模式在游戲中的應用&#xff0c;會結合大家熟悉的游戲場景和功能闡述設計模式在該處應用的好處。因為設計模式很多&#xf…

SpringBoot + RustFS 實現文件切片極速上傳技術

本文將手把手教你如何通過 SpringBoot 和 RustFS 構建高性能文件切片上傳系統&#xff0c;解決大文件傳輸的痛點&#xff0c;實現秒傳、斷點續傳和分片上傳等高級功能。 目錄 一、為什么選擇 RustFS SpringBoot&#xff1f; 二、環境準備與部署 2.1 安裝 RustFS 2.2 Sprin…

在Word和WPS文字中便捷切換英文段落大小寫

在Word和WPS文字中編輯英文段落時&#xff0c;有時候英文字母的大小寫不規范&#xff0c;或者需要把某一段全部改為大寫字母怎么辦&#xff1f;使用ShiftF3組合鍵即可快速在三種模式中切換&#xff1a;全部大寫、全部小寫、首字母大寫——其中首字母大寫的Word是每一句話的第一…

成都金牛區哪里租好辦公室?國際數字影像產業園享稅收優惠

在成都金牛區租賃優質辦公室&#xff0c;國際數字影像產業園憑借其享有的稅收優惠政策&#xff0c;成為了許多企業的首選之地。稅收優惠對于租賃辦公室的企業來說&#xff0c;是一筆不小的成本節省。國際數字影像產業園針對入駐企業提供的稅收優惠政策&#xff0c;能在企業運營…

CSS `:is()` `:where()` 實戰指南:簡化選擇器,提升可維護性

&#x1f3af; CSS :is() & :where() 實戰指南&#xff1a;簡化選擇器&#xff0c;提升可維護性你是否在項目中寫過一大串重復的選擇器&#xff1f;比如&#xff1a; h1, h2, h3, h4, h5, h6 { margin-bottom: 1rem; }這樣的代碼既冗長又難維護。 現在 CSS 提供了 :is() 和…

Linux I/O 訪問架構深入分析

Linux I/O 訪問架構深入分析 目錄 概述I/O 架構層次核心數據結構I/O 處理流程VFS 虛擬文件系統塊設備I/O字符設備I/O內存映射I/O異步I/O機制I/O調度器調試工具與方法性能優化策略 概述 Linux I/O 系統是一個多層次、高度抽象的架構&#xff0c;旨在為應用程序提供統一的文件訪問…

Linux:6_基礎IO

基礎IO 一.理解"文件" 文件分類 1.內存級(被打開)文件 2.磁盤級文件 1. 狹義理解 文件在磁盤里磁盤是永久性存儲介質&#xff0c;因此文件在磁盤上的存儲是永久性的磁盤是外設 (即是輸出設備也是輸入設備)磁盤上的文件本質是對文件的所有操作&#xff0c;都是對外…

Coze源碼分析-資源庫-刪除插件-前端源碼-核心邏輯

刪除插件邏輯 1. 刪除操作入口組件 刪除插件操作主要通過 usePluginConfig hook 中的 renderActions 方法實現&#xff0c;該方法返回 TableAction 組件來處理表格行的操作。 文件位置&#xff1a;frontend/packages/studio/workspace/entry-base/src/pages/library/hooks/u…

第一代:嵌入式本地狀態(Flink 1.x)

最初的架構將狀態以 JVM Heap 對象的形式存儲在 TaskManager 的內存中。對于小規模數據集&#xff0c;這種方式效果良好&#xff0c;但隨著狀態大小的增長超出內存&#xff0c;將所有狀態保存在內存中變得成本高昂且不穩定。 為了解決狀態規模增長的問題&#xff0c;引入了一種…

跨境金融數據對接實踐:印度NSE/BSE股票行情API集成指南

跨境金融數據對接實踐&#xff1a;印度NSE/BSE股票行情API集成指南 關鍵詞&#xff1a;印度股票數據對接 NSE實時行情 BSE證券接口 金融API開發 Python請求示例一、印度股市數據源技術解析&#xff08;核心價值&#xff09; 印度兩大交易所數據獲取難點&#xff1a; 時區差異&a…

AFSim2.9.0學習筆記 —— 1、AFSim及完整工具介紹(文末附:完整afsim2.9.0源碼、編譯好的完整工具包、中文教材等)

&#x1f514; AFSim2.9.0 相關技術、疑難雜癥文章合集&#xff08;掌握后可自封大俠 ?_?&#xff09;&#xff08;記得收藏&#xff0c;持續更新中…&#xff09; AFSim介紹 AFSim&#xff08;Advanced Framework for Simulation Integration & Modeling【高級仿真集成與…

ArcGIS學習-18 實戰-降雨量空間分布插值分析

設置環境加載要素投影查看要素&#xff0c;發現均不是投影數據&#xff0c;但都是地理坐標都是WGS1984使用工具進行批量投影然后新建空地圖&#xff0c;重新加載確認圖層的投影與柵格數據一致插值樣條法得到反距離權重法插值得到克里金法插值得到