安全与风控
需要配置或优化 Nginx 反向代理、负载均衡…
为 Web 服务生成高性能、安全的 Nginx 配置,涵盖反向代理、负载均衡、缓存、限流与 SSL/TLS。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
需要配置或优化 Nginx 反向代理、负通用
解决思路
- 定义架构:确定是反向代理、负载均衡还是静态文件服务
- 配置安全:设置 SSL/TLS、安全响应头、限流
- 优化性能:配置缓存、压缩、缓冲区
- 设置 upstream:配置后端服务器池
- 添加监控:配置访问日志与指标
- 测试配置:校验并重载
- 主配置 nginx.conf:设置 user nginx、worker_processes auto、worker_rlimit_nofile 65535、pid /run/nginx.pid,并 include /etc/nginx/modules-enabled/*.conf
- events 块:设置 worker_connections 4096、multi_accept on、use epoll
- http 基础设置:sendfile on、tcp_nopush on、tcp_nodelay on、keepalive_timeout 65、types_hash_max_size 2048、server_tokens off
- 缓冲区设置:client_body_buffer_size 16k、client_header_buffer_size 1k、client_max_body_size 50m、large_client_header_buffers 4 8k
- 超时设置:client_body_timeout 12、client_header_timeout 12、send_timeout 10
- MIME 类型:include /etc/nginx/mime.types,default_type application/octet-stream
- 日志:定义 main 与 json 两种 log_format,access_log 使用 json 格式,error_log 设为 warn
- Gzip 压缩:gzip on、gzip_vary on、gzip_proxied any、gzip_comp_level 5、gzip_min_length 256,并列出 gzip_types 覆盖的 MIME 类型
- Brotli 压缩:若模块可用则启用 brotli on、brotli_comp_level 6 并配置 brotli_types
- SSL 设置:ssl_protocols TLSv1.2 TLSv1.3、ssl_prefer_server_ciphers on、指定 ssl_ciphers、ssl_session_cache shared:SSL:10m、ssl_session_timeout 1d、ssl_session_tickets off、ssl_stapling on、ssl_stapling_verify on
- 全局安全响应头:add_header X-Frame-Options SAMEORIGIN、X-Content-Type-Options nosniff、X-XSS-Protection 1; mode=block、Referrer-Policy strict-origin-when-cross-origin,均带 always
- 限流区域:limit_req_zone 定义 general 10r/s、api 100r/s、login 5r/m,limit_conn_zone 定义 addr
- 代理缓存路径:proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=STATIC:10m inactive=7d use_temp_path=off max_size=1g
- include 站点配置:/etc/nginx/conf.d/*.conf 与 /etc/nginx/sites-enabled/*
- 反向代理 upstream:定义 backend 使用 least_conn、keepalive 32,配置多个 server 及 weight 与 backup;定义 api 使用 ip_hash、keepalive 64,配置 max_fails 与 fail_timeout
- HTTP 跳转 HTTPS:监听 80,保留 /.well-known/acme-challenge/ 路径,其余 return 301 https://$host$request_uri
- HTTPS server 块:listen 443 ssl http2,配置 ssl_certificate、ssl_certificate_key、ssl_trusted_certificate
- HTTPS 安全头:添加 Strict-Transport-Security、Content-Security-Policy、Permissions-Policy
- HTTPS 限流:limit_req zone=general burst=20 nodelay,limit_conn addr 10
- 设置 root 与 error_page 500 502 503 504 /50x.html
- 静态文件 location:alias 到目录,expires 1y,add_header Cache-Control public, immutable,access_log off
- Next.js 静态文件:location /_next/static/ 配置 alias、expires 1y、Cache-Control public, immutable、access_log off
- 代理到 backend:proxy_pass http://backend,proxy_http_version 1.1,设置 Host、X-Real-IP、X-Forwarded-For、X-Forwarded-Proto、X-Forwarded-Host、X-Forwarded-Port 头
- WebSocket 支持:设置 Upgrade $http_upgrade 与 Connection upgrade
- Keepalive:设置 proxy_set_header Connection ""
- 代理超时:proxy_connect_timeout 60s、proxy_send_timeout 60s、proxy_read_timeout 60s
- 代理缓冲:proxy_buffering on、proxy_buffer_size 4k、proxy_buffers 8 4k、proxy_busy_buffers_size 8k
- 代理缓存:proxy_cache STATIC、proxy_cache_valid 200 1h、proxy_cache_valid 404 1m、proxy_cache_bypass $http_cache_control,并添加 X-Cache-Status 头
- API location:limit_req zone=api burst=50 nodelay,proxy_pass http://api/,设置转发头,proxy_read_timeout 120s,proxy_cache off,Cache-Control no-store
- 登录接口限流:location /api/auth/login 使用 limit_req zone=login burst=5 nodelay 并代理到 api
- WebSocket 端点:location /ws 代理到 backend,设置 Upgrade/Connection 头,proxy_read_timeout 与 proxy_send_timeout 设为 3600s
- 健康检查端点:location /health 关闭 access_log,return 200 'OK',设置 Content-Type text/plain
- 拒绝敏感文件:location ~ /\. 与 location ~ ^/(\.env|composer\.json|package\.json|yarn\.lock) 均 deny all
- 负载均衡 upstream:选择 least_conn 或 ip_hash 或 hash $request_uri consistent,配置 server 的 weight、max_fails、fail_timeout、backup,keepalive 100
- 负载均衡 server 块:listen 443 ssl http2,配置证书,proxy_pass 到 upstream,proxy_http_version 1.1,proxy_set_header Connection "",设置转发头
- 故障转移:proxy_next_upstream error timeout http_500 http_502 http_503 http_504,proxy_next_upstream_tries 3,proxy_next_upstream_timeout 10s
- FastCGI 缓存:fastcgi_cache_path 定义路径与 keys_zone,fastcgi_cache_key 使用 $scheme$request_method$host$request_uri
- 代理缓存路径:proxy_cache_path 定义 PROXY 与 MICRO 区域,设置 levels、keys_zone、inactive、max_size、use_temp_path
- 缓存绕过 map:map $request_uri $cache_bypass 对 /api/ 与 /admin/ 设为 1
- 静态资源缓存:location 匹配图片/CSS/JS/字体,proxy_cache PROXY,proxy_cache_valid 200 30d、404 1m,proxy_cache_use_stale,proxy_cache_background_update on,proxy_cache_lock on,添加 X-Cache-Status 与 Cache-Control public, max-age=2592000, immutable,expires 30d
- HTML 微缓存:location / 使用 proxy_cache MICRO,proxy_cache_valid 200 1s,proxy_cache_bypass 与 proxy_no_cache 使用 $cache_bypass,proxy_cache_use_stale updating,proxy_cache_background_update on,添加 X-Cache-Status
- 安全加固:map $http_user_agent $bad_bot 匹配 malicious/scanner/bot,geo $blocked_ip 定义允许与阻止的 IP 段
- 按请求方法限流:map $request_method $limit_key 对 POST 使用 $binary_remote_addr,定义 limit_req_zone post_limit 5r/s
- 拒绝恶意请求:if ($bad_bot) 与 if ($blocked_ip) 返回 403
- 阻止攻击模式:location 匹配 eval\(|base64_|javascript: 与 \.\./|\.\.\\ 返回 403
- 限制 POST:location / 使用 limit_req zone=post_limit burst=10 nodelay
- Fail2ban 集成:对 /api/auth 单独写 access_log 到 /var/log/nginx/auth.log
- Docker 配置:events worker_connections 1024,http include mime.types,access_log /dev/stdout,error_log /dev/stderr warn,upstream app 指向 app:3000,server 监听 80 并代理
- Dockerfile:FROM nginx:alpine,COPY nginx.conf 与 default.conf,EXPOSE 80 443,HEALTHCHECK 使用 wget --spider http://localhost/health
- 测试配置:nginx -t、nginx -t -c /etc/nginx/nginx.conf、nginx -T
- 重载配置:nginx -s reload
- 用 curl 测试:curl -I https://example.com,curl -w "@curl-format.txt" -o /dev/null -s https://example.com
- 测试 SSL:openssl s_client -connect example.com:443 -servername example.com
- 测试 HTTP/2:curl --http2 -I https://example.com
- 最佳实践:worker_processes 设为 auto,upstream 启用 keepalive,文本内容启用 gzip,仅使用 TLS 1.2+,添加 HSTS/CSP 等安全头,配置限流,按流量模式调优缓冲区,静态内容使用代理缓存
- 输出检查清单:worker 进程优化、gzip 压缩、现代加密的 SSL/TLS、安全头(HSTS/CSP/X-Frame-Options)、限流区域、upstream keepalive、JSON 日志、健康检查端点、静态文件缓存、代理缓冲调优、错误页配置、用 nginx -t 测试配置
适用边界 · 注意事项
- 不适用于非 Nginx 的 Web 服务器(如 Apache、Caddy、Traefik)
- 不适用于需要 Nginx Plus 专有功能(如主动健康检查、sticky cookie)但未购买许可证的场景
- 不适用于无法修改服务器配置文件或没有 root 权限的环境