Nginx 作为当今最流行的 Web 服务器之一,承载着全球超过三分之一的网站流量。然而,许多站长在安装 Nginx 后直接使用默认配置上线,这给服务器留下了诸多安全隐患。本文将基于实际运维经验,详细介绍 Nginx 的安全加固方案,帮助新手站长构建生产级的安全防护体系。
一、隐藏版本号与服务器标识
Nginx 默认会在响应头中暴露版本号,攻击者可以利用这个信息搜索对应版本的已知漏洞。隐藏版本号是最基础的安全措施:
server_tokens off;
在 http 区块中加入这一行即可关闭版本号显示。此外,还可以修改默认的 Server 头信息,让攻击者无法判断你运行的是 Nginx 还是其他服务器软件。需要重新编译 Nginx 并修改 src/http/ngx_http_header_filter_module.c 中的 server_string 变量,或者使用第三方模块如 headers-more-nginx-module:
more_set_headers "Server: Apache";
二、限制请求速率与并发连接
未做限流的 Nginx 极易被恶意爬虫或 CC 攻击耗尽资源。建议配置请求速率限制和连接数限制:
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
server {
location / {
limit_req zone=req_limit burst=10 nodelay;
limit_conn conn_limit 20;
}
location /wp-login.php {
limit_req zone=req_limit burst=3 nodelay;
}
}
针对后台登录页面,速率限制应该更加严格,防止暴力破解。对于 API 接口,建议根据接口类型设置不同的限制策略,读接口可以放宽,写接口应严格限制。
三、配置 SSL/TLS 安全策略
随着 HTTPS 的普及,TLS 配置的安全性直接影响网站的整体安全等级。以下是推荐的安全配置:
ssl_protocols TLSv1.2 TLSv1.3; 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 on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; ssl_session_tickets off;
务必禁用 SSLv3、TLSv1.0 和 TLSv1.1,这些协议已被证实存在安全漏洞(如 POODLE、BEAST 攻击)。建议使用 Mozilla SSL Configuration Generator 生成与你的服务器环境匹配的安全配置。
四、HTTP 安全头配置
合理配置 HTTP 安全头可以有效防御 XSS、点击劫持等常见 Web 攻击:
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 "strict-origin-when-cross-origin" always; add_header Permissions-Policy "camera=(), microphone=(), geolocation=()" always;
Content-Security-Policy(CSP)头配置较为复杂,建议根据站点的实际资源加载情况逐步收紧。可以先设置为报告模式(Content-Security-Policy-Report-Only),待确认无误后再强制生效。
五、防止目录遍历与敏感文件泄露
默认配置下,Nginx 可能会暴露网站目录结构或泄露敏感文件:
# 关闭目录列表
autoindex off;
# 禁止访问隐藏文件
location ~ /\. {
deny all;
access_log off;
log_not_found off;
}
# 禁止访问敏感配置文件
location ~ (wp-config\.php|\.env|composer\.lock|\.git) {
deny all;
}
# 限制上传目录的 PHP 执行
location /wp-content/uploads/ {
location ~ \.php$ {
deny all;
}
}
对于 WordPress 或 Typecho 站点,特别要注意 wp-config.php 或 config.inc.php 的保护,这些文件包含数据库密码等敏感信息。
六、配置访问控制与 IP 白名单
后台管理页面应该只允许信任的 IP 地址访问:
location /admin/ {
allow 192.168.1.0/24;
allow your_office_ip;
deny all;
}
如果没有固定 IP,可以考虑结合 HTTP 基本认证(Auth Basic)增加一层保护:
location /admin/ {
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
}
七、日志审计与监控
安全加固的最后一环是日志监控。合理配置 Nginx 日志格式并定时分析:
log_format security '$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 security;
可以使用 goaccess 或 fail2ban 等工具对日志进行实时分析。fail2ban 配合 Nginx 日志可以自动封禁异常 IP:
# /etc/fail2ban/jail.local [Nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 5 bantime = 3600 [Nginx-botsearch] enabled = true port = http,https filter = nginx-botsearch logpath = /var/log/nginx/access.log maxretry = 2 bantime = 86400
总结
Nginx 安全加固是一个持续的过程,没有一劳永逸的方案。建议站长定期关注 Nginx 官方的安全公告(nginx.org/en/security.html)和 CVE 数据库,及时更新版本。同时,安全配置需要与业务需求平衡,过于严格的限制可能导致正常用户无法访问。建议在测试环境充分验证后再应用到生产服务器。记住:安全不是一次性的配置,而是持续运营的理念。每个站长都应该把安全当成日常运维的一部分,这样才能真正保护好自己和用户的数凭。