從安全加固到性能調(diào)優(yōu)詳解Nginx中生產(chǎn)環(huán)境配置的完全指南
一、基礎(chǔ)安全配置
1. 隱藏 Nginx 版本信息
http {
server_tokens off;
}
解決的問題:防止攻擊者通過版本號查找已知漏洞(如 nginx/1.18.0 暴露后可直接搜索該版本的 CVE)。
驗(yàn)證:
curl -I http://your-site.com # 沒有 server_tokens 時(shí):Server: nginx/1.18.0 # 開啟后:Server: nginx
2. 限制請求方法與大小
server {
# 只允許常見 HTTP 方法
if ($request_method !~ ^(GET|POST|PUT|DELETE|HEAD|OPTIONS|PATCH)$) {
return 405;
}
# 限制請求體大?。ǚ乐箰阂馍蟼鞒笪募谋M內(nèi)存)
client_max_body_size 10M;
client_body_buffer_size 128k;
# 限制請求頭大小(防止 Slowloris 攻擊)
large_client_header_buffers 4 16k;
}
| 配置 | 解決的問題 |
|---|---|
client_max_body_size | 防止惡意上傳超大文件導(dǎo)致內(nèi)存耗盡 |
client_body_buffer_size | 控制請求體緩沖區(qū),超出部分寫入臨時(shí)文件 |
large_client_header_buffers | 防止通過超長請求頭進(jìn)行的 DoS 攻擊 |
3. 禁用不安全的 HTTP 方法
location / {
# 顯式拒絕 TRACE 和 TRACK 方法(可能用于 XST 攻擊)
if ($request_method ~ ^(TRACE|TRACK)$) {
return 405;
}
}
二、HTTPS / SSL 安全配置
4. 強(qiáng)制 HTTPS 跳轉(zhuǎn)
server {
listen 80;
server_name example.com;
# 301 永久重定向到 HTTPS
return 301 https://$host$request_uri;
}
解決的問題:確保所有流量走加密通道,防止中間人竊 聽。
5. 現(xiàn)代 TLS 配置
server {
listen 443 ssl http2;
ssl_certificate /path/to/fullchain.pem;
ssl_certificate_key /path/to/privkey.pem;
# 只啟用安全的 TLS 版本
ssl_protocols TLSv1.2 TLSv1.3;
# 強(qiáng)加密套件,優(yōu)先使用 ECDHE 實(shí)現(xiàn)前向保密
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305;
ssl_prefer_server_ciphers on;
# 會(huì)話復(fù)用,減少 TLS 握手開銷
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
# OCSP Stapling,加速證書驗(yàn)證
ssl_stapling on;
ssl_stapling_verify on;
resolver 1.1.1.1 8.8.8.8 valid=300s;
}
| 配置 | 解決的問題 |
|---|---|
ssl_protocols TLSv1.2 TLSv1.3 | 禁用存在漏洞的 SSLv2/3 和 TLSv1.0/1.1 |
ssl_ciphers | 只使用強(qiáng)加密算法,防止降級攻擊 |
ssl_session_cache | 復(fù)用 TLS 會(huì)話,減少握手延遲 |
ssl_stapling | 服務(wù)器主動(dòng)提供證書吊銷狀態(tài),避免客戶端額外查詢 |
6. HSTS(HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
解決的問題:告訴瀏覽器永遠(yuǎn)用 HTTPS 訪問該域名(包括子域名),防止 SSL 剝離攻擊。
注意:確保 HTTPS 完全配置好再開啟,否則會(huì)導(dǎo)致網(wǎng)站無法通過 HTTP 訪問。
三、安全響應(yīng)頭(Security Headers)
7. 完整的 Security Headers 配置
# 防止點(diǎn)擊劫持 add_header X-Frame-Options "SAMEORIGIN" always; # 防止 MIME 類型嗅探(如把 .jpg 當(dāng)腳本執(zhí)行) add_header X-Content-Type-Options "nosniff" always; # 啟用 XSS 過濾器(現(xiàn)代瀏覽器已廢棄,但仍建議保留兼容) add_header X-XSS-Protection "1; mode=block" always; # 控制 Referer 信息泄露 add_header Referrer-Policy "no-referrer-when-downgrade" always; # 內(nèi)容安全策略(CSP),限制資源加載來源 add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; connect-src 'self'; frame-ancestors 'self';" always; # 限制瀏覽器功能權(quán)限 add_header Permissions-Policy "geolocation=(), microphone=(), camera=(), payment=()" always;
| 響應(yīng)頭 | 解決的問題 |
|---|---|
X-Frame-Options | 點(diǎn)擊劫持(Clickjacking) |
X-Content-Type-Options | MIME 嗅探攻擊 |
X-XSS-Protection | 反射型 XSS(瀏覽器層面) |
Referrer-Policy | Referer 信息泄露(如從含 token 的 URL 跳轉(zhuǎn)) |
Content-Security-Policy | XSS、數(shù)據(jù)注入、惡意資源加載 |
Permissions-Policy | 限制不必要的瀏覽器 API 權(quán)限 |
8. CSP frame-ancestors 替代 X-Frame-Options
# 更靈活的方案:允許指定域名嵌入 add_header Content-Security-Policy "frame-ancestors 'self' https://partner.example.com;" always;
解決的問題:X-Frame-Options 只能設(shè) DENY 或 SAMEORIGIN,無法指定具體域名。frame-ancestors 可以精確控制哪些網(wǎng)站可以嵌入你的頁面。
四、防盜鏈與訪問控制
9. 圖片/資源防盜鏈
location ~* \.(gif|jpg|jpeg|png|bmp|swf|flv|mp4|ico)$ {
# 允許空 Referer 和本域名
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
# 返回 403 或重定向到警告圖
return 403;
# 或:rewrite ^/ https://example.com/forbidden.png break;
}
}
解決的問題:防止其他網(wǎng)站直接引用你的圖片/視頻資源,消耗你的帶寬和流量。
10. IP 黑名單/白名單
# 黑名單:拒絕特定 IP
location /admin {
deny 192.168.1.100;
deny 10.0.0.0/24;
allow all;
}
# 白名單:只允許特定 IP 訪問
location /api/internal {
allow 192.168.1.0/24;
allow 10.0.0.5;
deny all;
}
11. 目錄遍歷防護(hù)
location ~ /\. {
# 拒絕訪問隱藏文件(.git, .env, .htaccess 等)
deny all;
access_log off;
log_not_found off;
}
location ~* \.(git|svn|htaccess|env)$ {
deny all;
}
解決的問題:防止攻擊者訪問 .git 目錄、.env 文件等敏感文件泄露源代碼或密鑰。
五、限流與防攻擊
12. 請求速率限制(Rate Limiting)
http {
# 定義限流區(qū)域:按 IP 限制,10MB 內(nèi)存存儲(chǔ)狀態(tài),每秒 10 個(gè)請求
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
# 針對登錄接口更嚴(yán)格
limit_req_zone $binary_remote_addr zone=login:10m rate=1r/s;
# 按 IP 限制并發(fā)連接數(shù)
limit_conn_zone $binary_remote_addr zone=addr:10m;
}
server {
location / {
# 突發(fā) 20 個(gè)請求,不延遲處理(超出直接 503)
limit_req zone=general burst=20 nodelay;
# 限制單個(gè) IP 最多 10 個(gè)并發(fā)連接
limit_conn addr 10;
}
location /api/login {
# 登錄接口更嚴(yán)格:每秒 1 次
limit_req zone=login burst=5 nodelay;
}
}
| 配置 | 解決的問題 |
|---|---|
limit_req | 防止接口被暴 力刷、爬蟲過度抓取 |
limit_conn | 防止單個(gè) IP 占用過多連接資源 |
burst | 允許短時(shí)間突發(fā)請求,平滑處理 |
nodelay | 不排隊(duì),超出直接拒絕(降低延遲) |
13. 防 Slowloris / Slow POST 攻擊
http {
# 讀取客戶端請求頭的超時(shí)時(shí)間
client_header_timeout 10s;
# 讀取客戶端請求體的超時(shí)時(shí)間
client_body_timeout 10s;
# 發(fā)送響應(yīng)的超時(shí)時(shí)間
send_timeout 10s;
}
解決的問題:Slowloris 攻擊通過緩慢發(fā)送請求頭/體占用連接,導(dǎo)致正常用戶無法連接。
六、性能優(yōu)化配置
14. Gzip / Brotli 壓縮
http {
# Gzip 壓縮
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types
text/plain
text/css
text/javascript
application/javascript
application/json
application/xml
image/svg+xml;
# Brotli 壓縮(需要編譯 ngx_brotli 模塊,壓縮率比 gzip 高 15-25%)
# brotli on;
# brotli_comp_level 5;
# brotli_types text/plain text/css application/javascript application/json;
}
解決的問題:減少傳輸體積,提升頁面加載速度。文本類資源通??蓧嚎s 60-80%。
15. 靜態(tài)資源緩存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot|otf)$ {
# 強(qiáng)緩存:30 天
expires 30d;
add_header Cache-Control "public, immutable";
# 禁用日志減少 I/O
access_log off;
}
location ~* \.(html|htm)$ {
# HTML 不緩存或短時(shí)間緩存
expires -1;
add_header Cache-Control "no-store, no-cache, must-revalidate";
}
| 配置 | 解決的問題 |
|---|---|
expires 30d | 強(qiáng)緩存,瀏覽器 30 天內(nèi)不再請求 |
immutable | 聲明資源永不改變,連條件請求(304)都跳過 |
access_log off | 靜態(tài)資源訪問不記錄日志,減少磁盤 I/O |
16. 高效文件傳輸
http {
# 內(nèi)核態(tài)直接傳輸文件,零拷貝
sendfile on;
# 累積到一定大小再發(fā)送(配合 sendfile)
tcp_nopush on;
# 立即發(fā)送小數(shù)據(jù)包(降低延遲)
tcp_nodelay on;
}
解決的問題:
sendfile:避免數(shù)據(jù)在用戶態(tài)和內(nèi)核態(tài)之間拷貝,大幅提升靜態(tài)文件傳輸性能tcp_nopush+tcp_nodelay:平衡吞吐量和延遲
17. 長連接優(yōu)化
http {
# 長連接保持時(shí)間
keepalive_timeout 30s;
# 單個(gè)長連接最大請求數(shù)
keepalive_requests 1000;
# 與后端服務(wù)保持長連接(反向代理場景)
upstream backend {
server 127.0.0.1:8080;
keepalive 32; # 保持 32 個(gè)空閑連接
}
}
解決的問題:減少 TCP 握手開銷,提升高并發(fā)下的性能。
七、反向代理配置
18. 完整的反向代理配置
upstream backend {
server 127.0.0.1:3000 weight=5;
server 127.0.0.1:3001 weight=5;
server 127.0.0.1:3002 backup; # 備用節(jié)點(diǎn)
keepalive 32;
}
server {
listen 80;
server_name api.example.com;
location / {
proxy_pass http://backend;
# 傳遞真實(shí)客戶端 IP
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;
# 代理相關(guān)優(yōu)化
proxy_http_version 1.1;
proxy_set_header Connection "";
# 超時(shí)配置
proxy_connect_timeout 5s;
proxy_send_timeout 10s;
proxy_read_timeout 10s;
# 緩沖區(qū)
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
}
| 配置 | 解決的問題 |
|---|---|
X-Forwarded-For | 后端服務(wù)獲取真實(shí)客戶端 IP(而非 Nginx IP) |
X-Forwarded-Proto | 后端服務(wù)知道原始請求是 HTTP 還是 HTTPS |
proxy_buffering | 緩沖后端響應(yīng),優(yōu)化傳輸效率 |
keepalive | 與后端保持長連接,減少 TCP 建立開銷 |
八、日志配置
19. 結(jié)構(gòu)化日志與性能監(jiān)控
http {
# 自定義日志格式(含性能指標(biāo))
log_format performance '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'rt=$request_time '
'uct="$upstream_connect_time" '
'uht="$upstream_header_time" '
'urt="$upstream_response_time"';
# JSON 格式(便于 ELK / Grafana 解析)
log_format json_combined escape=json '{'
'"time":"$time_iso8601",'
'"remote_addr":"$remote_addr",'
'"request":"$request",'
'"status":$status,'
'"request_time":$request_time,'
'"upstream_response_time":"$upstream_response_time",'
'"body_bytes_sent":$body_bytes_sent,'
'"http_referer":"$http_referer",'
'"http_user_agent":"$http_user_agent"'
'}';
# 主日志
access_log /var/log/nginx/access.log performance buffer=32k flush=5s;
# API 專用 JSON 日志
access_log /var/log/nginx/api.log json_combined;
}
解決的問題:便于排查慢請求、監(jiān)控后端服務(wù)健康狀態(tài)、對接日志分析系統(tǒng)。
九、完整配置模板
# /etc/nginx/nginx.conf
user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
events {
worker_connections 4096;
use epoll;
multi_accept on;
}
http {
# 基礎(chǔ)設(shè)置
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 30;
keepalive_requests 1000;
types_hash_max_size 2048;
server_tokens off;
# 緩沖區(qū)
client_body_buffer_size 128k;
client_max_body_size 10m;
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
# 超時(shí)
client_header_timeout 10s;
client_body_timeout 10s;
send_timeout 10s;
# 壓縮
gzip on;
gzip_vary on;
gzip_proxied any;
gzip_comp_level 6;
gzip_min_length 256;
gzip_types text/plain text/css text/javascript application/javascript application/json application/xml image/svg+xml;
# MIME 類型
include /etc/nginx/mime.types;
default_type application/octet-stream;
# 日志
log_format performance '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'rt=$request_time uct="$upstream_connect_time" '
'uht="$upstream_header_time" urt="$upstream_response_time"';
access_log /var/log/nginx/access.log performance buffer=32k flush=5s;
error_log /var/log/nginx/error.log warn;
# 限流
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;
# 安全響應(yīng)頭
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Referrer-Policy "no-referrer-when-downgrade" always;
add_header Permissions-Policy "geolocation=(), microphone=(), camera=()" always;
# 引入站點(diǎn)配置
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
}
總結(jié)速查表
| 類別 | 配置 | 解決的核心問題 |
|---|---|---|
| 信息隱藏 | server_tokens off | 版本信息泄露 |
| 傳輸安全 | ssl_protocols TLSv1.2 TLSv1.3 | 中間人攻擊、協(xié)議降級 |
| 劫持防護(hù) | X-Frame-Options / frame-ancestors | 點(diǎn)擊劫持 |
| 注入防護(hù) | X-Content-Type-Options / CSP | XSS、MIME 嗅探 |
| 資源盜用 | valid_referers | 帶寬被盜 |
| 暴 力破解 | limit_req / limit_conn | 接口被刷、DDoS |
| 連接耗盡 | 各種 timeout | Slowloris 攻擊 |
| 傳輸優(yōu)化 | gzip / sendfile / keepalive | 加載慢、高延遲 |
| 緩存策略 | expires / Cache-Control | 重復(fù)請求、帶寬浪費(fèi) |
建議:配置修改后務(wù)必執(zhí)行 nginx -t 檢查語法,再用 nginx -s reload 平滑重載,避免服務(wù)中斷。
到此這篇關(guān)于從安全加固到性能調(diào)優(yōu)詳解Nginx中生產(chǎn)環(huán)境配置的完全指南的文章就介紹到這了,更多相關(guān)Nginx生產(chǎn)環(huán)境配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Nginx Proxy 代理測試的實(shí)現(xiàn)
本文主要介紹了Nginx Proxy 代理測試的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02
采用ngxtop實(shí)現(xiàn)nginx實(shí)時(shí)訪問數(shù)據(jù)統(tǒng)計(jì)
這篇文章主要介紹了采用ngxtop實(shí)現(xiàn)nginx實(shí)時(shí)訪問數(shù)據(jù)統(tǒng)計(jì),需要的朋友可以參考下2014-07-07
Nginx?Proxy?Manager的具體實(shí)現(xiàn)
Nginx?Proxy?Manager?就是一個(gè)?Nginx?的代理管理器,本文主要介紹了Nginx?Proxy?Manager的具體實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-05-05
Nginx出現(xiàn)504 Gateway Time-out的解決方法
nginx訪問出現(xiàn)504 Gateway Time-out,一般是由于程序執(zhí)行時(shí)間過長導(dǎo)致響應(yīng)超時(shí),本文就來介紹一下解決方法,感興趣的可以了解一下2023-10-10
一段萬能的nginx接口實(shí)現(xiàn)反向代理配置
這篇文章主要介紹了一段萬能的nginx接口實(shí)現(xiàn)反向代理配置,詳細(xì)的介紹了什么是反向代理及其接口反向代理的實(shí)現(xiàn),非常具有實(shí)用價(jià)值,需要的朋友可以參考下2018-10-10
關(guān)于nginx 實(shí)現(xiàn)jira反向代理的問題
這篇文章主要介紹了關(guān)于nginx 實(shí)現(xiàn)jira反向代理的問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-09-09
nginx快速部署一個(gè)網(wǎng)站服務(wù)(多域名+多端口)
本文主要介紹了nginx快速部署一個(gè)網(wǎng)站服務(wù),并實(shí)現(xiàn)多域名和多端口,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-10-10
nginx實(shí)現(xiàn)多個(gè)域名和集群的方法步驟
本文主要介紹了nginx實(shí)現(xiàn)多個(gè)域名和集群的方法步驟,需要配置Nginx作為反向代理服務(wù)器,將來自不同域名的請求轉(zhuǎn)發(fā)到集群中的相應(yīng)后端服務(wù)器,感興趣的可以了解一下2024-04-04

