Nginx动静防护需分层设防:静态资源禁执行、强缓存、防盗链、防篡改;动态接口强制代理、限流鉴权、HTTPS/TLS1.3加固;运行时最小权限、去敏感头、自定义错误页。

全面加固和优化 Nginx 的静态与动态防护边界,核心在于区分处理、分层设防、精准控制。静态资源(HTML/CSS/JS/图片等)可缓存、可压缩、应严格限制访问路径;动态请求(如 /api/、/admin/、PHP 脚本)需校验、限流、隔离后端,并杜绝直接暴露执行逻辑。两者混用或策略错配,是多数安全事件的起点。
一、明确动静分离的配置边界
必须在 location 级别做硬性隔离,避免正则误匹配或 fallback 导致越权:
- 静态资源统一走
root或alias,禁用任何脚本执行能力:
location ~* \.(js|css|png|jpg|gif|ico|svg|woff2?|ttf|eot)$ {
expires 1y;
add_header Cache-Control "public, immutable";
add_header X-Content-Type-Options "nosniff";
# 关键:禁止执行,即使上传了 .php 文件也不解析
types { }
default_type text/plain;
} - 动态接口路径强制代理,且不继承静态规则:
location ^~ /api/ {
proxy_pass http://backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
# 禁止将原始请求头中的危险字段透传给后端
proxy_hide_header X-Powered-By;
proxy_hide_header Server;
} - 彻底阻断非法脚本访问(尤其防止上传目录执行):
location ~* \.(php|pl|py|sh|rb|lua|jsp|asp)$ {
return 403;
}
放在所有location块最上方,确保优先匹配。
二、静态侧强化:防盗链、防爬、防篡改
静态资源不是“只读”就安全,需主动防御恶意利用:
- 启用 Referer 白名单防盗链(适用于图片、JS/CSS):
valid_referers none blocked server_names *.example.com;
if ($invalid_referer) {
return 403;
} - 对敏感静态资源(如后台 HTML、配置文件)加路径级访问控制:
location /admin/ {
auth_basic "Restricted Area";
auth_basic_user_file /etc/nginx/.htpasswd;
} - 强制静态响应头加固:
add_header X-Frame-Options "DENY";
add_header X-XSS-Protection "1; mode=block";
add_header Content-Security-Policy "default-src 'self'; img-src 'self' data:; script-src 'self' 'unsafe-inline';";
三、动态侧加固:限流、鉴权、协议收敛
动态请求是攻击主入口,防护要落在请求生命周期前端:
- 基于 IP 和用户标识双维度限流:
limit_req_zone $binary_remote_addr zone=ip_limit:10m rate=10r/s;
limit_req_zone $arg_token zone=token_limit:10m rate=5r/s;
location /api/v1/ {
limit_req zone=ip_limit burst=20 nodelay;
limit_req zone=token_limit burst=5;
} - 关闭动态路径的目录浏览与自动索引:
location /api/ {
autoindex off;
index index.php;
# 防止路径遍历
if ($request_uri ~ "\.\./") { return 400; }
} - 强制 HTTPS + HTTP/2 + TLS 1.3,并禁用不安全协议:
ssl_protocols TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
四、运行时边界收窄:权限、模块、响应头
让 Nginx 进程本身不具备越界能力,是从根源上守住边界:
- 以最小权限用户运行(非 root、非 nobody):
user nginx nginx;(提前创建无登录权限的nginx用户) - 关闭所有非必要模块与响应头:
server_tokens off;
more_clear_headers "X-Powered-By" "X-Runtime" "X-AspNet-Version";(需加载headers-more模块) - 错误页完全自定义,隐藏 Nginx 标识:
error_page 404 /404.html;
location = /404.html {
internal;
root /usr/share/nginx/html;
}


















