生产环境Nginx必须默认按“防攻击、防泄露、防误配”构建,包含10项无需重编译即可生效的核心配置:隐藏Server标识、强制HTTPS与HSTS、防御点击劫持与内容注入、启用CSP、限制请求速率与连接数、最小化运行权限、加固SSL/TLS、控制请求体大小与超时、禁用敏感路径与错误页泄露、启用日志审计与异常监控。

生产环境的 Nginx 站点不能只求“能用”,必须默认按“防攻击、防泄露、防误配”来构建。以下 10 项是经过大量线上验证、覆盖基础防护到纵深防御的核心配置,每一项都对应明确威胁场景,且无需重编译或第三方模块即可生效。
隐藏服务器标识与版本号
攻击者常通过 Server 响应头(如 nginx/1.22.1)匹配已知漏洞。关闭该信息是最轻量却最有效的收敛攻击面手段:
- 在
http块中添加:server_tokens off; - 若使用 PHP-FPM,同步在
fastcgi_params中设置:fastcgi_param SERVER_SOFTWARE "nginx"; - 注意:这仅隐藏版本号,不删除
Server: nginx字样;如需彻底移除,需启用headers-more-nginx-module(非默认模块,慎用)
强制 HTTPS 与 HSTS 预加载
明文 HTTP 是中间人攻击的温床。除配置 SSL 证书外,必须强制升级并固化安全策略:
- 在
server块中配置重定向:return 301 https://$host$request_uri; - 在 HTTPS 的
server块中启用 HSTS:add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; - 启用
preload后,可提交至 hstspreload.org 列入主流浏览器预加载列表
防御点击劫持与内容注入
通过响应头限制浏览器行为,从客户端侧阻断常见 UI 层攻击:
-
add_header X-Frame-Options "SAMEORIGIN";—— 禁止被嵌入非同源 iframe -
add_header X-Content-Type-Options "nosniff";—— 阻止 MIME 类型嗅探,防范恶意文件伪装 -
add_header X-XSS-Protection "1; mode=block";—— 启用浏览器 XSS 过滤器(兼容旧浏览器) -
add_header Referrer-Policy "strict-origin-when-cross-origin";—— 平衡隐私与功能,跨域时不泄露完整路径
启用内容安全策略(CSP)
CSP 是防御 XSS 和数据注入的核心防线,需根据实际资源加载方式精细配置:
- 基础策略示例(适用于静态站):
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' https:; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:; font-src 'self'; frame-ancestors 'none';" always; - 务必移除
'unsafe-inline'和'unsafe-eval'(除非确有 JS 内联需求),改用 nonce 或 hash 方式授权 - 上线前建议先用
Content-Security-Policy-Report-Only头收集违规日志,再切为强制模式
限制请求速率与连接数
抵御 CC 攻击和暴力探测的关键在于“控量”,而非单纯封 IP:
- 定义连接限制区:
limit_conn_zone $binary_remote_addr zone=perip:10m; - 单 IP 最大并发连接:
limit_conn perip 30; - 定义请求限流区:
limit_req_zone $binary_remote_addr zone=req:10m rate=15r/s; - 应用限流(允许突发 30 请求,不延迟):
limit_req zone=req burst=30 nodelay; - 对登录、API 等敏感路径,应单独配置更严策略(如
rate=2r/s)
最小化运行权限与文件权限
遵循最小权限原则,避免因配置或代码缺陷导致提权风险:
- 创建无登录能力的专用用户:
useradd -r -s /sbin/nologin nginx - 在
nginx.conf开头指定:user nginx nginx; - 配置目录权限:
chown -R root:root /etc/nginx; chmod -R 755 /etc/nginx - SSL 证书私钥权限必须为
600,且属主为root(Nginx 主进程以 root 启动,worker 降权读取)
加固 SSL/TLS 协议与密钥交换
过时协议(TLSv1.0/1.1)和弱密钥套件是 HTTPS 的最大短板:
- 仅启用现代协议:
ssl_protocols TLSv1.2 TLSv1.3; - 使用强密钥套件(优先 ECDHE + AES-GCM):
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384'; - 禁用服务端密码偏好:
ssl_prefer_server_ciphers off; - 启用 OCSP 装订提升验证效率:
ssl_stapling on; ssl_stapling_verify on;
控制请求体大小与超时行为
防止慢速攻击(Slowloris)、大文件上传滥用及资源耗尽:
- 限制上传体大小:
client_max_body_size 10M;(按业务调整,API 接口建议 ≤2M) - 缩短请求头/体读取超时:
client_header_timeout 10; client_body_timeout 12; - 设置连接空闲超时:
keepalive_timeout 30 30; - 限制请求行与头长度:
client_header_buffer_size 1k; large_client_header_buffers 4 4k;
禁用敏感路径与错误页面泄露
默认的 Nginx 错误页、目录索引、调试接口可能暴露路径结构或版本线索:
- 关闭目录浏览:
autoindex off;(确认未在任何location中开启) - 自定义错误页并隐藏版本:
error_page 404 /404.html; location = /404.html { internal; } - 屏蔽敏感路径访问:
location ~ ^/(.git|\.svn|\.ht|backup|conf|logs|data) { deny all; } - 确保
server_tokens off;已全局启用(再次确认)
启用日志审计与异常监控
安全不是“设完即止”,而是持续可观测。日志是定位入侵的第一现场:
- 记录真实客户端 IP(尤其经 CDN 或反代后):
log_format main '$http_x_forwarded_for - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_real_ip"'; - 分离访问日志与错误日志,确保
error_log级别不低于warn - 对 400、403、499、500 类异常状态码做聚合告警(可用 ELK、Grafana+Loki 或简单脚本实现)
- 定期轮转并压缩日志,保留至少 90 天(满足多数合规要求)


















