深度解析 Nginx 配置:從性能優化到 HTTPS 安全實踐

引言

Nginx 作為高性能的 Web 服務器和反向代理,其配置靈活性和強大功能備受開發者青睞。本文基于一份生產環境的 Nginx 配置文件,詳細拆解其核心配置邏輯,涵蓋性能優化、HTTPS 安全配置、反向代理及靜態資源處理等關鍵環節,幫助讀者理解如何構建高效可靠的 Nginx 服務。

一、全局配置:進程管理與日志系統

1. 進程管理

user  nginx;
worker_processes  auto;
pid        /var/run/nginx.pid;
  • user nginx:指定 Nginx 工作進程運行的用戶,通常使用非 root 用戶以增強安全性。

  • worker_processes auto:自動根據服務器 CPU 核心數設置工作進程數,充分利用多核性能。生產環境建議設為 CPU 核心數或其 2 倍。

2. 日志系統

error_log  /var/log/nginx/error.log notice;
access_log  /var/log/nginx/access.log buffer=16k flush=1m main;
error_log  /var/log/nginx/error.log error;
  • 錯誤日志

    • error_log /var/log/nginx/error.log notice;:全局錯誤日志級別為?notice,記錄普通警告信息。

    • error_log /var/log/nginx/error.log error;:在?http?塊中覆蓋為?error?級別,僅記錄嚴重錯誤,減少日志冗余。

  • 訪問日志

    • buffer=16k flush=1m:啟用 16KB 緩沖區,每 1 分鐘強制寫入磁盤,減少 I/O 操作,提升高并發下的性能。

    • log_format main:自定義日志格式,包含客戶端 IP、請求時間、狀態碼、用戶代理等關鍵信息,便于后續分析。

二、Events 模塊:連接處理優化

events {worker_connections  1024;
}
  • worker_connections 1024:每個工作進程的最大連接數。計算公式:worker_processes * worker_connections?為 Nginx 最大并發連接數。生產環境可根據內存調整(如 4096),但需注意系統文件句柄限制(可通過?ulimit -n?查看)。

三、HTTP 核心配置:性能與壓縮

1. 基礎性能優化

http {sendfile        on;tcp_nopush     on;keepalive_timeout  65;
}
  • sendfile on:啟用零拷貝傳輸,減少 CPU 消耗,提升靜態文件傳輸效率。

  • tcp_nopush on:配合?sendfile,將多個小數據包合并為一個大數據包發送,減少網絡延遲。

  • keepalive_timeout 65:長連接超時時間,避免無效連接占用資源。

2. Gzip 壓縮配置

gzip on;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css application/javascript application/json;
gzip_disable "msie6|trident";
  • gzip on:啟用壓縮,通常可將文本類資源壓縮至原大小的 1/4。

  • comp_level 6:壓縮級別(1-9),6 為平衡壓縮率與 CPU 消耗的推薦值。

  • min_length 256:僅壓縮大于 256 字節的資源,避免小文件壓縮后體積反而增大。

  • gzip_types:指定壓縮的 MIME 類型,優先壓縮 HTML、CSS、JS、JSON 等文本內容。

  • gzip_disable:禁用對舊瀏覽器(如 IE6)的壓縮,避免兼容性問題。

四、HTTPS 配置:安全通信與性能平衡

1. 強制 HTTPS 重定向

server {listen 80;server_name 域名或IP地址;return 301 https://$host$request_uri;
}
  • 通過 80 端口的?server?塊,將所有 HTTP 請求永久重定向(301)至 HTTPS,確保通信安全。

2. HTTPS 核心配置

server {listen 443 ssl http2;server_name 域名或IP地址;ssl_certificate     ssl證書配置的pem;ssl_certificate_key ssl證書配置的key;ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:...;ssl_prefer_server_ciphers on;
}
  • 協議與加密算法

    • ssl_protocols:僅啟用 TLSv1.2 和 TLSv1.3,禁用不安全的舊協議(如 SSLv3、TLSv1.0)。

    • ssl_ciphers:使用現代加密算法,優先選擇 ECDHE 算法,提供前向保密(FS)。

    • ssl_prefer_server_ciphers on:服務端優先選擇加密算法,增強安全性。

  • 性能優化

    • ssl_session_cache shared:SSL:10m:共享 SSL 會話緩存,減少重復握手開銷。

    • ssl_session_timeout 10m:會話緩存超時時間,合理設置可提升連接復用率。

3. 安全響應頭

add_header X-Content-Type-Options nosniff;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";
  • X-Content-Type-Options nosniff:防止瀏覽器誤判資源 MIME 類型,避免 XSS 攻擊。

  • X-Frame-Options DENY:禁止頁面被嵌入到 iframe 中,防范點擊劫持。

  • Strict-Transport-Security:強制瀏覽器使用 HTTPS 連接,有效期 1 年(max-age=31536000),包含子域名。

五、反向代理與動態服務

1. 反向代理至 FastAPI 服務

location / {proxy_pass http://fastapi:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";
}
  • 請求頭透傳

    • X-Real-IP?和?X-Forwarded-For:傳遞客戶端真實 IP,便于后端服務記錄和驗證。

    • Upgrade?和?Connection:支持 WebSocket 協議升級,確保動態服務兼容性。

  • 超時設置

    • proxy_connect_timeout 30s:連接上游服務器的超時時間。

    • proxy_read_timeout 86400s:讀取上游響應的超時時間(長連接場景可設為大值)。

六、靜態資源處理

location /static/ {expires 3h;add_header Cache-Control "max-age=10800, public";alias /path/to/static/files/;  # 需替換為實際路徑try_files $uri =404;
}
  • 緩存控制

    • expires 3h?和?Cache-Control: max-age=10800:強制瀏覽器緩存靜態資源 3 小時,減少重復請求。

  • 路徑映射

    • alias:將?/static/?前綴替換為實際文件路徑(如?/var/www/static/),避免?root?導致的路徑重復問題。

  • 錯誤處理try_files $uri =404?確保不存在的文件直接返回 404,提升響應速度。

七、配置驗證與最佳實踐

1. 語法檢查

nginx -t  # 驗證配置文件語法正確性

2. 性能調優建議

  • 連接數優化:根據服務器內存調整?worker_connections(公式:worker_processes * worker_connections <= 系統最大文件句柄數)。

  • SSL 證書管理:使用 Let’s Encrypt 自動續簽證書,避免證書過期導致服務中斷。

  • 日志分析:結合 ELK Stack 或 Prometheus 分析訪問日志,監控異常請求和慢響應。

八、示例nginx.conf文件

user  nginx;
worker_processes  auto;error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;events {worker_connections  1024;
}http {include       /etc/nginx/mime.types;default_type  application/octet-stream;log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log  /var/log/nginx/access.log buffer=16k flush=1m main;error_log  /var/log/nginx/error.log error;sendfile        on;tcp_nopush     on;keepalive_timeout  65;# 壓縮文件配置gzip on;gzip_comp_level 6;gzip_min_length 256;gzip_buffers 16 8k;gzip_http_version 1.1;gzip_vary on;# 壓縮文件類型gzip_typestext/plaintext/csstext/javascriptapplication/javascriptapplication/jsonapplication/xmlapplication/xml+rssapplication/xhtml+xml;# 禁用對舊瀏覽器的壓縮gzip_disable "msie6|trident";include /etc/nginx/conf.d/*.conf;# 關鍵配置server {listen 80;server_name 域名或IP地址;return 301 https://$host$request_uri;}server {listen 443 ssl http2;server_name 域名或IP地址;# SSL 證書配置ssl_certificate    ssl證書配置的pem;ssl_certificate_key    ssl證書配置的key;# SSL 安全配置(優化后)ssl_protocols TLSv1.2 TLSv1.3;ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;ssl_prefer_server_ciphers on;ssl_session_cache shared:SSL:10m;ssl_session_timeout 10m;ssl_session_tickets off;error_page 497 https://$host$request_uri;# 安全頭add_header X-Content-Type-Options nosniff;add_header X-Frame-Options DENY;add_header X-XSS-Protection "1; mode=block";add_header Strict-Transport-Security "max-age=31536000; includeSubDomains;";# 反向代理location / {# 使用服務名或網絡別名代替本地地址,不支持httpsproxy_pass http://fastapi:8000;# 基礎請求頭設置proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;# WebSocket 支持proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";# 超時設置 (根據實際需求調整)proxy_connect_timeout 30s;proxy_read_timeout 86400s;proxy_send_timeout 30s;# 可選: 緩沖區設置proxy_buffering on;proxy_buffer_size 4k;proxy_buffers 4 32k;}# 靜態資源location /static/ {expires 3hadd_header Cache-Control "max-age=10800, public";alias 文件路徑try_files $uri =404;}}
}

九、總結

本文拆解的 Nginx 配置涵蓋了性能優化、HTTPS 安全、反向代理及靜態資源管理的核心邏輯。關鍵亮點包括:

  • 通過?sendfile、Gzip 壓縮和長連接配置提升性能;

  • 嚴格的 HTTPS 配置與安全響應頭增強數據傳輸安全;

  • 靈活的反向代理與 WebSocket 支持適配現代應用架構。

實際部署時,需根據業務場景調整參數(如超時時間、緩存策略),并定期進行安全審計和性能壓測,確保 Nginx 服務穩定高效運行。

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

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

相關文章

傳送文件利器wormhole的使用方法

傳送文件利器wormhole的使用方法 wormhole文件傳送工具是基于python的一個快捷的傳送工具&#xff0c;在安裝此工具之前首先要部署好python環境。 安裝的過程如下&#xff1a; 1.部署好python 環境 LINUX系統自帶PYTHON環境&#xff0c;直接安裝即可。 WINDOWS系統需要安裝py…

LangChain輸出格式化實踐:提升測試工程師LLM開發效率的完整指南

引言 在基于LangChain的LLM測試開發中&#xff0c;輸出格式化是連接大模型推理能力與自動化測試系統的關鍵環節。通過結構化輸出&#xff08;如JSON&#xff09;&#xff0c;測試工程師可快速將LLM生成的測試用例、缺陷報告等結果對接至CI/CD流水線。本文系統解析LangChain內置…

Go 語言 + Word 文檔模板:WordZero 引擎如何讓企業文檔處理效率提升 300%?

前言 在企業級應用開發中&#xff0c;自動化生成Word文檔一直是個令人頭疼的需求。傳統的方案要么依賴于復雜的Office COM組件&#xff0c;要么使用功能有限的第三方庫。今天為大家介紹一個純Go語言實現的Word操作庫——WordZero&#xff0c;特別是其強大的模板引擎功能&#…

Eclipse 修改字符集

Eclipse 修改字符集 在軟件開發過程中,字符集的設置對于代碼的正確顯示和運行至關重要。Eclipse 作為一款流行的集成開發環境(IDE),提供了方便的字符集修改功能。本文將詳細講解如何在 Eclipse 中修改字符集,以確保項目文件的正確處理。 1. 引言 在 Java 開發中,常見的…

C++ 游戲開發詳細流程

&#x1f9e0; 第一階段&#xff1a;項目規劃與架構設計 關鍵詞&#xff1a;系統性、模塊化、可擴展性 1.1 目標明確 游戲類型&#xff1a;2D / 2.5D / 3D / VR平臺選擇&#xff1a;PC、主機、移動設備多人/單人&#xff1a;是否含網絡模塊&#xff08;決定是否使用 socket、U…

使用Docker-NVIDIA-GPU開發配置:解決 Docker NVIDIA 運行時錯誤方法

問題描述 運行 Docker 命令時,系統提示 docker: Error response from daemon: unknown or invalid runtime name: nvidia,表明 Docker 無法識別 NVIDIA 運行時。這一錯誤通常出現在使用 --runtime=nvidia 和 --gpus 參數時,意味著 NVIDIA 容器運行時未正確安裝或配置。NVID…

3516cv610在sample_aiisp上多創一路編碼流,方法

3516cv610在sample_aiisp上多創一路編碼流&#xff0c;方法 首先確保 vpss grp0有視頻流 最好保證 已經有一路視頻流能推出來 多創一路編碼流思路為 將 vpss grp0又綁定給 vpss_chn1 vpss_chn1有綁定給 venc_chn1 這樣我們就多創了一路視頻流。 這里思路完全正確 可以實現…

【燒腦算法】不定長滑動窗口:從動態調整到精準匹配以靈活特性實現高效破題

目錄 求最長/最大 2730. 找到最長的半重復子字符串 2779. 數組的最大美麗值 1838. 最高頻元素的頻數 2516. 每種字符至少取 K 個 2831. 找出最長等值子數組 求最短/最小 1234. 替換子串得到平衡字符串 2875. 無限數組的最短子數組 76. 最小覆蓋子串 632. 最小區間 …

第七十篇 從餐廳后廚到電影院選座:生活場景拆解Java并發編程核心

目錄 一、并發基礎&#xff1a;餐廳后廚的協作藝術1.1 廚師與線程&#xff08;Thread&#xff09;1.2 共享資源競爭&#xff1a;唯一的炒鍋1.3 線程狀態轉換&#xff1a;廚師工作流 二、線程同步&#xff1a;電影院選座中的鎖機制2.1 同步鎖&#xff08;synchronized&#xff0…

嵌入式學習--江協stm32day1

失蹤人口回歸了&#xff0c;stm32的學習比起51要慢一些&#xff0c;因為涉及插線&#xff0c;可能存在漏插&#xff0c;不牢固等問題。 相對于51直接對寄存器的設置&#xff0c;stm32因為是32位修改起來比較麻煩&#xff0c;江協課程是基于標準庫的&#xff0c;是對封裝函數進…

vue+elementUi+axios實現分頁(MyBatis、Servlet)

vueelementUiaxios實現分頁 文章目錄 vueelementUiaxios實現分頁1.代碼實現【HTML】**【Servlet層】****【Service層】****【Dao層】** 2.總結步驟3.實現要點4.注意事項4.注意事項 注&#xff1a;此項目 前端為 html、 后端采用 mybatis、servlet實現 1.代碼實現 【HTML】…

vue-10( 動態路由匹配和路由參數)

動態路由匹配和路由參數 動態路由匹配是 Vue Router 的一個強大功能&#xff0c;它允許你創建靈活且可重用的路由。您可以使用參數來捕獲 URL 的動態段&#xff0c;而不是為每個可能的值定義特定路由。這在處理具有唯一標識符的資源&#xff08;如用戶配置文件、產品詳細信息或…

劫持進程注入

劫持進程注入和遠程線程注入的區別就是 遠程線程注入是向一個正在運行中的進程注入 而劫持進程注入則是自己打開一個進程(以掛起的方式) 然后再進行注入的操作 這樣做的原因是當進程在掛起的狀態時他的所有線程都是處于未啟用的階段 這樣就可以避免目標進程的反注入線程的…

uni-app學習筆記二十--pages.json頁面路由pages設置

uni-app 通過 pages 節點配置應用由哪些頁面組成&#xff0c;pages 節點接收一個數組&#xff0c;數組每個項都是一個對象&#xff0c;其屬性值如下&#xff1a; 屬性類型默認值描述pathString配置頁面路徑styleObject配置頁面窗口表現&#xff0c;配置項參考下方 pageStylene…

VScode編譯調試debug,gpu的cuda程序,Nsight

進行下面操作的前提是&#xff0c;我們的環境已經能跑簡單的CUDA程序了。 一、安裝Nsight 二、創建launch.json文件 {"version": "0.2.0","configurations": [{"name": "CUDA C: Launch","type": "cuda-gdb…

鏈表題解——合并兩個有序鏈表【LeetCode】

1. 算法思路 這段代碼的核心思想是 合并兩個有序鏈表。具體步驟如下&#xff1a; 初始化哨兵節點&#xff1a; 創建一個哨兵節點 dummy&#xff0c;用于簡化鏈表操作&#xff0c;避免處理頭節點的特殊情況。使用指針 cur 指向 dummy&#xff0c;用于構建新的鏈表。 遍歷兩個鏈…

K8S集群主機網絡端口不通問題排查

一、環境&#xff1a; k8s: v1.23.6 docker: 20.10.14 問題和故障現象&#xff1a;devops主機集群主機節點到端口8082不通&#xff08;網絡策略已經申請&#xff0c;并且網絡策略已經實施完畢&#xff09;&#xff0c;而且網絡實施人員再次確認&#xff0c;網絡策…

qemu安裝risc-V 64

參考這篇文章https://developer.aliyun.com/article/1323996&#xff0c;其中在wsl下面安裝可能會報錯環境變量中有空格。 # clean_path.sh#!/bin/bash# 備份舊 PATH OLD_PATH"$PATH"# 過濾掉包含空格、制表符、換行的路徑 CLEAN_PATH"" IFS: read -ra PA…

python爬蟲:RoboBrowser 的詳細使用

更多內容請見: 爬蟲和逆向教程-專欄介紹和目錄 文章目錄 一、RoboBrowser概述1.1 RoboBrowser 介紹1.2 安裝 RoboBrowser1.3 與類似工具比較二、基本用法2.1 創建瀏覽器對象并訪問網頁2.2 查找元素2.3 填寫和提交表單三、高級功能3.1 處理文件上傳3.2 處理JavaScript重定向3.3…

CTFSHOW-WEB-36D杯

給你shell 這道題對我這個新手還是有難度的&#xff0c;花了不少時間。首先f12看源碼&#xff0c;看到?view_source&#xff0c;點進去看源碼 <?php //Its no need to use scanner. Of course if you want, but u will find nothing. error_reporting(0); include "…