Nginx 核心安全功能落地教程
本教程针对 8 大核心功能(隐藏版本号、限制危险请求方式、CC 攻击防御、防盗链、动态黑名单、HTTPS 配置、SSL 证书、自动重定向 HTTPS),提供从原理到配置步骤的全流程指导,所有操作均基于生产环境标准。
介绍 Nginx 安全配置的八大核心功能,包括隐藏版本号、限制危险 HTTP 请求方式、CC 攻击防御(限流与连接数)、防盗链、动态黑名单(Fail2ban)、HTTPS 配置、SSL 证书申请及自动重定向。通过具体配置步骤、参数详解和测试验证,帮助管理员提升服务器安全性,防止常见网络攻击。

本教程针对 8 大核心功能(隐藏版本号、限制危险请求方式、CC 攻击防御、防盗链、动态黑名单、HTTPS 配置、SSL 证书、自动重定向 HTTPS),提供从原理到配置步骤的全流程指导,所有操作均基于生产环境标准。
# 备份 Nginx 主配置文件
cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak.$(date +%Y%m%d)
# 备份站点配置目录(如果有)
cp -r /etc/nginx/conf.d /etc/nginx/conf.d.bak.$(date +%Y%m%d)
/etc/nginx/nginx.conf/etc/nginx/conf.d//var/log/nginx/access.log, /var/log/nginx/error.log默认情况下,Nginx 会在 HTTP 响应头和错误页面中暴露完整版本号。隐藏版本号是缩小攻击面的第一步。
在 http 块中添加以下配置:
http {
server_tokens off; # 关闭响应头和错误页面中的版本号显示
fastcgi_param SERVER_SOFTWARE nginx; # 进阶:隐藏 FastCGI/PHP 响应中的服务版本
include /etc/nginx/mime.types;
default_type application/octet-stream;
}
使用 curl 命令查看 HTTP 响应头:
curl -I http://yourdomain.com
预期结果:响应头中 Server 字段仅显示 nginx,无版本号。
HTTP/1.1 协议定义了 8 种请求方法,其中 PUT、DELETE、TRACE、OPTIONS、CONNECT 等方法属于危险方法。限制仅允许业务必需的请求方法,可大幅降低攻击面。
在站点的 server 块中添加配置:
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
# 仅允许 GET、POST、HEAD 三种方法,其他全部返回 405
if ($request_method !~ ^(GET|POST|HEAD)$) {
return 405;
}
}
| 参数 | 含义 |
|---|---|
$request_method | Nginx 内置变量,获取当前请求的 HTTP 方法 |
!~ | 正则匹配符号,表示'不匹配' |
return 405 | 直接返回 405 状态码,拒绝请求 |
curl -I -X GET http://yourdomain.com
curl -I -X PUT http://yourdomain.com
预期结果:GET 返回 200,PUT 返回 405。
Nginx 通过两个原生模块实现 CC 防御:
ngx_http_limit_req_module:限制单 IP 的请求速率ngx_http_limit_conn_module:限制单 IP 的并发连接数在 nginx.conf 的 http 块中添加:
http {
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
}
在站点的 location / 中应用:
server {
location / {
limit_req zone=req_limit burst=5 nodelay;
limit_conn conn_limit 20;
}
}
| 参数 | 含义 |
|---|---|
$binary_remote_addr | 限流键,表示用客户端 IP 作为限流依据 |
zone=req_limit:10m | 定义限流区域名称和内存大小 |
rate=20r/s | 限流速率 |
burst=5 | 允许的突发请求数 |
nodelay | 不延迟处理突发请求 |
使用 ab 工具进行压测,观察日志中是否有 503 状态码。
通过 valid_referers 指令校验请求的 Referer 头,仅允许本站域名和信任域名引用资源。
server {
location ~* \.(jpg|jpeg|png|gif|webp|mp4|avi|flv|pdf|zip)$ {
valid_referers none blocked server_names *.yourdomain.com yourdomain.com;
if ($invalid_referer) {
return 403;
}
expires 7d;
access_log off;
}
}
| 参数 | 含义 |
|---|---|
~* | 正则匹配符号,不区分大小写 |
valid_referers | 定义合法的 Referer 来源列表 |
$invalid_referer | Nginx 内置变量,当 Referer 不合法时值为 1 |
配合 Fail2ban 监控 Nginx 访问日志,自动识别恶意行为并调用 iptables 封禁恶意 IP。
apt install fail2ban -y
systemctl enable fail2ban --now
创建 /etc/fail2ban/jail.d/nginx-security.conf:
[nginx-malicious]
enabled = true
filter = nginx-malicious
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 60
bantime = 3600
action = iptables-multiport[name=nginx, port="http,https"]
创建 /etc/fail2ban/filter.d/nginx-malicious.conf:
[Definition]
failregex = ^<HOST> - .* "(GET|POST|HEAD).*" (403|404) .*$
ignoreregex =
手动模拟恶意请求后,使用 fail2ban-client status nginx-malicious 查看封禁状态。
使用 Let's Encrypt 免费 SSL 证书,配合 Certbot 工具一键申请、自动续期。
apt install certbot python3-certbot-nginx -y
certbot --nginx -d yourdomain.com -d www.yourdomain.com
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
return 301 https://$server_name$request_uri;
}
server {
listen 443 ssl http2;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_stapling on;
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
}
访问 SSL Labs Server Test 测试 SSL 配置,预期结果为 A+ 评级。
整合所有配置到单个站点文件,执行以下命令生效:
nginx -t
systemctl reload nginx
certbot certificatesfail2ban-client status nginx-malicioustail -f /var/log/nginx/access.log
微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online