Nginx安全配置实战:8大核心功能详解
Nginx 核心安全功能超详细落地教程
本教程针对你指定的 8 大核心功能(隐藏版本号、限制危险请求方式、CC 攻击防御、防盗链、动态黑名单、HTTPS 配置、SSL 证书、自动重定向 HTTPS),提供从原理→配置步骤→参数详解→测试验证→常见问题排查的全流程超详细指导,所有操作均基于生产环境标准,确保可直接落地。
📋 前置准备(必做)
1. 环境确认
- 确保 Nginx 版本≥1.20(稳定版,支持所有安全模块)
- 操作系统:CentOS/RHEL 7+/Debian 10+/Ubuntu 20.04+
- 拥有服务器 root 权限或 sudo 权限
- 已准备好域名(如
yourdomain.com),且 DNS 已解析到服务器 IP
2. 配置文件备份(防止操作失误)
bash
运行
# 备份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) 3. 核心配置文件路径说明
- 主配置文件:
/etc/nginx/nginx.conf(全局配置) - 站点配置目录:
/etc/nginx/conf.d/(单个站点配置存放处) - 日志文件路径:
- 访问日志:
/var/log/nginx/access.log - 错误日志:
/var/log/nginx/error.log
- 访问日志:
一、隐藏 Nginx 版本号(最基础必做)
1.1 原理说明
默认情况下,Nginx 会在HTTP 响应头和 ** 错误页面(如 404、500)** 中暴露完整版本号(如nginx/1.18.0),攻击者可利用版本号对应的已知 CVE 漏洞发起定向攻击。隐藏版本号是缩小攻击面的第一步。
1.2 配置步骤
步骤 1:修改主配置文件 nginx.conf
# 打开主配置文件 vim /etc/nginx/nginx.conf 在http块中添加 / 修改以下配置:
http { # -------------------------- 隐藏版本号核心配置 -------------------------- server_tokens off; # 关闭响应头和错误页面中的版本号显示 # 进阶:隐藏FastCGI/PHP响应中的服务版本(PHP业务必加) fastcgi_param SERVER_SOFTWARE nginx; # 其他原有配置(如include、log_format等)保留不变 include /etc/nginx/mime.types; default_type application/octet-stream; # ... 其他原有配置 ... } 步骤 2:(进阶)完全隐藏 / 修改 Server 响应头
如果需要完全隐藏 Server 头(不显示nginx字样),需使用第三方模块ngx_http_headers_more_module,但该模块默认不编译进 Nginx,需重新编译安装(本教程暂不涉及编译,若需此功能可单独补充)。
1.3 测试验证
使用curl命令查看 HTTP 响应头,确认无版本号:
curl -I http://yourdomain.com 预期结果:响应头中Server字段仅显示nginx,无版本号(如下所示):
HTTP/1.1 200 OK Server: nginx # ✅ 仅显示nginx,无版本号 Date: Mon, 16 Mar 2026 10:00:00 GMT Content-Type: text/html Content-Length: 612 Last-Modified: Mon, 16 Mar 2026 09:00:00 GMT Connection: keep-alive ETag: "65f4a1b0-264" Accept-Ranges: bytes 1.4 常见问题排查
- 问题:配置后错误页面仍显示版本号?解决:确保
server_tokens off放在http块的最前面,且执行了nginx -t && systemctl reload nginx。
二、限制危险 HTTP 请求方式
2.1 原理说明
HTTP/1.1 协议定义了 8 种请求方法,其中GET、POST、HEAD是网站业务常用的,而PUT、DELETE、TRACE、OPTIONS、CONNECT等方法属于危险方法,可能被用于:
- PUT/DELETE:篡改 / 删除服务器文件
- TRACE:反射型 XSS 攻击
- CONNECT:建立隧道代理
限制仅允许业务必需的请求方法,可大幅降低攻击面。
2.2 配置步骤
在站点的 443 端口 server 块(或 80 端口 server 块)中添加配置:
# 打开站点配置文件(假设为yourdomain.conf) vim /etc/nginx/conf.d/yourdomain.conf 在server块中添加:
server { listen 443 ssl http2; server_name yourdomain.com www.yourdomain.com; root /var/www/html; index index.html index.php; # -------------------------- 限制危险请求方式核心配置 -------------------------- # 仅允许GET、POST、HEAD三种方法,其他全部返回405(Method Not Allowed) if ($request_method !~ ^(GET|POST|HEAD)$) { return 405; } # 其他配置(如SSL、限流等)后续添加 } 2.3 参数详解
表格
| 参数 | 含义 | |||
|---|---|---|---|---|
$request_method | Nginx 内置变量,获取当前请求的 HTTP 方法 | |||
!~ | 正则匹配符号,表示 “不匹配” | |||
| `^(GET | POST | HEAD)$` | 正则表达式,^表示开头,$表示结尾,` | ` 表示 “或”,仅匹配这三种方法 |
return 405 | 直接返回 405 状态码,拒绝请求 |
2.4 测试验证
使用curl发送不同的请求方法,验证限制是否生效:
# 1. 测试GET方法(应正常返回200) curl -I -X GET http://yourdomain.com # 2. 测试POST方法(应正常返回200/404等业务状态码) curl -I -X POST http://yourdomain.com # 3. 测试PUT方法(应返回405) curl -I -X PUT http://yourdomain.com # 4. 测试DELETE方法(应返回405) curl -I -X DELETE http://yourdomain.com 2.5 常见问题排查
- 问题:API 接口需要 PUT/DELETE 方法怎么办?解决:在正则中添加对应方法,如
^(GET|POST|HEAD|PUT|DELETE)$,但建议仅对特定 API 路径放行,不要全局放行。
三、CC 攻击防御(请求限流 + 连接数限制)
3.1 原理说明
CC 攻击(Challenge Collapsar)是一种常见的 DDoS 攻击,攻击者通过大量肉鸡 / 代理 IP 向服务器发送高频请求,耗尽服务器资源(CPU、内存、带宽),导致网站无法访问。
Nginx 通过两个原生模块实现 CC 防御:
ngx_http_limit_req_module:限制单 IP 的请求速率(如每秒最多 20 个请求)ngx_http_limit_conn_module:限制单 IP 的并发连接数(如最多同时 20 个连接)
3.2 配置步骤
步骤 1:在nginx.conf的http块中定义限流规则
vim /etc/nginx/nginx.conf 在http块的最前面(server块之外)添加:
http { # -------------------------- CC攻击防御:定义限流规则 -------------------------- # 1. 请求速率限制:单IP每秒最多20个请求,内存区域10m(可支持约16万个IP) # 语法:limit_req_zone $限流键 zone=区域名:内存大小 rate=速率; limit_req_zone $binary_remote_addr zone=req_limit:10m rate=20r/s; # 2. 登录接口专用限流(可选,更严格):单IP每分钟最多5次请求 limit_req_zone $binary_remote_addr zone=login_limit:10m rate=5r/m; # 3. 并发连接数限制:单IP最多同时20个连接 limit_conn_zone $binary_remote_addr zone=conn_limit:10m; # 其他原有配置保留不变 server_tokens off; include /etc/nginx/mime.types; # ... } 步骤 2:在站点的server块中应用限流规则
vim /etc/nginx/conf.d/yourdomain.conf 在server块的location /中应用:
server { listen 443 ssl http2; server_name yourdomain.com www.yourdomain.com; root /var/www/html; # -------------------------- 应用全局限流规则 -------------------------- location / { # 应用请求速率限制:burst=5表示允许突发5个请求,nodelay表示不延迟,直接处理 limit_req zone=req_limit burst=5 nodelay; # 应用并发连接数限制 limit_conn conn_limit 20; # 其他原有配置(如proxy_pass、root等)保留 } # -------------------------- 登录接口专用严格限流(可选) -------------------------- location /login/ { limit_req zone=login_limit burst=2 nodelay; # 可叠加IP白名单,放行运维IP # allow 192.168.1.0/24; # deny all; } } 3.3 参数超详细详解
(1)limit_req_zone参数
表格
| 参数 | 含义 | 示例 |
|---|---|---|
$binary_remote_addr | 限流键,表示用 “客户端 IP” 作为限流依据,$binary_表示存储为二进制,节省内存 | 也可用$server_name(按域名限流) |
zone=req_limit:10m | 定义限流区域名称为req_limit,内存大小为 10m1m 内存可存储约 1.6 万个 IP 的状态信息 | zone=login_limit:5m |
rate=20r/s | 限流速率,r/s表示 “每秒请求数”,r/m表示 “每分钟请求数” | rate=5r/m(每分钟 5 次) |
(2)limit_req参数
表格
| 参数 | 含义 | 作用 |
|---|---|---|
zone=req_limit | 指定使用哪个限流区域(需与limit_req_zone定义的名称一致) | - |
burst=5 | 允许的突发请求数:当请求速率超过rate时,允许额外排队 5 个请求 | 避免正常用户的突发请求被误杀 |
nodelay | 不延迟处理突发请求:若不加此参数,突发请求会被延迟处理;加了则直接处理,超过的部分直接拒绝 | 提升用户体验,避免请求卡顿 |
3.4 测试验证
使用ab工具(Apache Bench)进行压测,验证限流是否生效:
# 1. 安装ab工具 # Debian/Ubuntu apt install apache2-utils -y # CentOS/RHEL yum install httpd-tools -y # 2. 压测:发送100个请求,并发10个 ab -n 100 -c 10 http://yourdomain.com/ 预期结果:
- 查看访问日志
/var/log/nginx/access.log,大部分请求返回 200,超过限流的请求返回 503(Service Unavailable) - 查看错误日志
/var/log/nginx/error.log,会出现limiting requests的记录
3.5 常见问题排查
- 问题:正常用户被误杀怎么办?解决:适当调大
rate和burst参数,如rate=30r/s burst=10 - 问题:CDN 场景下,
$binary_remote_addr获取的是 CDN 节点 IP,不是真实用户 IP?解决:需配置ngx_http_realip_module模块,获取真实用户 IP 作为限流键(可单独补充配置)
四、防盗链
4.1 原理说明
盗链是指其他网站直接引用你网站的静态资源(图片、视频、PDF 等),消耗你的服务器带宽和流量,却不给你带来任何访问量。
Nginx 通过valid_referers指令实现防盗链:校验请求的Referer头(表示请求来源),仅允许本站域名和信任域名引用资源,其他来源直接拒绝。
4.2 配置步骤
在站点的server块中添加配置:
vim /etc/nginx/conf.d/yourdomain.conf 添加:
server { listen 443 ssl http2; server_name yourdomain.com www.yourdomain.com; root /var/www/html; # -------------------------- 防盗链核心配置 -------------------------- # 匹配需要防盗链的资源后缀(按需添加) location ~* \.(jpg|jpeg|png|gif|webp|mp4|avi|flv|pdf|zip)$ { # 定义合法的Referer来源 valid_referers none blocked server_names *.yourdomain.com yourdomain.com *.baidu.com *.google.com; # 可选:允许搜索引擎引用 # 如果Referer不合法,返回403 if ($invalid_referer) { return 403; # 或返回一张防盗链图片(更友好): # rewrite ^/ https://yourdomain.com/antisteal.jpg; } # 静态资源缓存7天,减少服务器压力 expires 7d; # 不记录防盗链日志,减少磁盘IO access_log off; } } 4.3 参数详解
表格
| 参数 | 含义 |
|---|---|
~* | 正则匹配符号,~表示区分大小写,*表示不区分大小写 |
valid_referers | 定义合法的 Referer 来源列表 |
none | 允许没有 Referer 头的请求(如直接在浏览器输入图片 URL) |
blocked | 允许 Referer 头被防火墙 / 代理修改的请求(如 Referer 头不以http://开头) |
server_names | 允许当前server_name中定义的所有域名(即yourdomain.com和www.yourdomain.com) |
$invalid_referer | Nginx 内置变量,当 Referer 不合法时,值为 1,否则为空 |
4.4 测试验证
使用curl发送不同 Referer 头的请求,验证防盗链是否生效:
# 1. 测试合法Referer(本站域名):应正常返回200 curl -I -e "https://www.yourdomain.com/article.html" https://www.yourdomain.com/img/test.jpg # 2. 测试非法Referer(其他网站):应返回403 curl -I -e "https://www.evil.com/steal.html" https://www.yourdomain.com/img/test.jpg # 3. 测试无Referer:应正常返回200 curl -I https://www.yourdomain.com/img/test.jpg (-e参数用于设置 Referer 头)
4.5 常见问题排查
- 问题:微信 / 小程序内图片无法显示?解决:在
valid_referers中添加微信相关域名,或临时允许none和blocked - 问题:想让盗链者看到防盗链图片,而不是 403?解决:将
return 403替换为rewrite ^/ https://yourdomain.com/antisteal.jpg;,需提前准备好防盗链图片
五、动态黑名单(Fail2ban 自动封禁恶意 IP)
5.1 原理说明
Nginx 原生没有动态黑名单功能,需配合Fail2ban实现:Fail2ban 通过监控 Nginx 访问日志,自动识别恶意行为(如多次 403/404、扫描器攻击、暴力破解),并调用iptables自动封禁恶意 IP,一段时间后自动解封。
5.2 配置步骤
步骤 1:安装 Fail2ban
# Debian/Ubuntu apt update && apt install fail2ban -y # CentOS/RHEL yum install epel-release -y && yum install fail2ban -y # 启动Fail2ban并设置开机自启 systemctl enable fail2ban --now # 查看Fail2ban状态 systemctl status fail2ban 步骤 2:配置 Nginx 防护规则(Jail 文件)
Jail 文件是 Fail2ban 的核心配置,定义 “监控哪个日志、用什么规则、封禁多久”。
# 创建Nginx专用Jail配置文件 cat > /etc/fail2ban/jail.d/nginx-security.conf <<EOF [nginx-malicious] # 启用该Jail enabled = true # 指定过滤器规则(后续创建) filter = nginx-malicious # 监控的Nginx访问日志路径 logpath = /var/log/nginx/access.log # 最大重试次数:10次恶意请求 maxretry = 10 # 时间窗口:1分钟内(60秒) findtime = 60 # 封禁时长:1小时(3600秒),永久封禁设为-1 bantime = 3600 # 封禁动作:调用iptables封禁HTTP/HTTPS端口 action = iptables-multiport[name=nginx, port="http,https"] EOF 步骤 3:配置过滤器规则(Filter 文件)
Filter 文件定义 “什么样的请求属于恶意请求”,通过正则匹配日志内容。
# 创建Nginx恶意请求过滤器 cat > /etc/fail2ban/filter.d/nginx-malicious.conf <<EOF [Definition] # 恶意请求正则:匹配403/404状态码,或扫描器UA # <HOST>是Fail2ban内置变量,自动提取日志中的IP failregex = ^<HOST> - .* "(GET|POST|HEAD).*" (403|404) .*$ ^<HOST> - .* "(GET|POST|HEAD).*" .* "(sqlmap|nmap|nikto|scanner|python-requests)".*$ # 忽略的请求(空表示不忽略) ignoreregex = EOF 步骤 4:重启 Fail2ban 生效
# 测试Fail2ban配置是否正确 fail2ban-client -t # 重启Fail2ban systemctl restart fail2ban # 查看Jail是否启用 fail2ban-client status 预期结果:Status中会显示nginx-malicious Jail 已启用。
5.3 参数超详细详解
(1)Jail 文件参数
表格
| 参数 | 含义 | 示例 |
|---|---|---|
maxretry = 10 | 1 分钟内(findtime)最多允许 10 次恶意请求,超过则封禁 | 登录接口可设为5 |
findtime = 60 | 时间窗口,单位秒,恶意请求的统计周期 | 可设为300(5 分钟) |
bantime = 3600 | 封禁时长,单位秒,-1表示永久封禁 | 严重攻击可设为86400(1 天) |
(2)Filter 文件参数
表格
| 参数 | 含义 |
|---|---|
failregex | 恶意请求正则,<HOST>会自动匹配日志中的 IP 地址 |
ignoreregex | 忽略的请求正则,比如可忽略内网 IP 的 404 请求 |
5.4 测试验证
手动模拟恶意请求,验证 Fail2ban 是否自动封禁:
# 1. 模拟10次404请求(用curl循环发送) for i in {1..10}; do curl -I http://yourdomain.com/nonexistent$i.html; done # 2. 等待10秒后,查看Fail2ban封禁状态 fail2ban-client status nginx-malicious 预期结果:Banned IP list中会显示你的测试 IP(注意:测试时不要用生产服务器的公网 IP,避免被封禁!)
5.5 常用 Fail2ban 命令
表格
| 命令 | 作用 |
|---|---|
fail2ban-client status nginx-malicious | 查看 Nginx Jail 的封禁状态 |
fail2ban-client set nginx-malicious unbanip 123.xxx.xxx.xxx | 手动解封指定 IP |
fail2ban-client set nginx-malicious banip 123.xxx.xxx.xxx | 手动封禁指定 IP |
tail -f /var/log/fail2ban.log | 查看 Fail2ban 日志 |
5.6 常见问题排查
- 问题:Fail2ban 不封禁 IP?解决:
- 检查
logpath是否正确,访问日志是否有内容
- 检查
- 问题:误封正常用户 IP?解决:
- 调大
maxretry和findtime参数 - 在
ignoreregex中添加正常用户的特征,或添加 IP 白名单
- 调大
检查failregex是否匹配日志格式,用fail2ban-regex测试:bash运行
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-malicious.conf 六、HTTPS 配置 + SSL 证书 + 自动重定向 HTTPS
6.1 原理说明
HTTP 是明文传输,数据在网络中裸奔,容易被窃听、篡改、劫持;HTTPS 是 HTTP+SSL/TLS,通过加密传输保证数据安全,是网站的标配。
本章节使用Let’s Encrypt 免费 SSL 证书,配合Certbot 工具一键申请、自动续期,无需付费。
6.2 配置步骤
步骤 1:安装 Certbot 工具
# Debian/Ubuntu apt update && apt install certbot python3-certbot-nginx -y # CentOS/RHEL yum install epel-release -y && yum install certbot python3-certbot-nginx -y 步骤 2:一键申请 SSL 证书并自动配置 Nginx
# 执行Certbot命令,按提示操作 certbot --nginx -d yourdomain.com -d www.yourdomain.com 操作提示:
- 输入邮箱地址(用于接收证书过期提醒)
- 同意服务条款(输入
A) - 是否分享邮箱(输入
N) - 是否自动重定向 HTTP 到 HTTPS(输入
2,选择 “Redirect”)
Certbot 自动完成的操作:
- 申请 SSL 证书(有效期 3 个月)
- 在
/etc/nginx/conf.d/yourdomain.conf中自动添加 SSL 配置 - 自动配置 HTTP 到 HTTPS 的 301 重定向
- 自动添加定时任务,实现证书自动续期
步骤 3:手动优化 SSL 配置(提升安全性)
Certbot 自动生成的配置足够安全,但我们可以进一步优化,达到 A + 评级。
vim /etc/nginx/conf.d/yourdomain.conf 将 SSL 配置部分替换为以下优化版:
server { # -------------------------- 80端口:自动重定向到HTTPS -------------------------- listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; return 301 https://$server_name$request_uri; # 301永久重定向 } server { # -------------------------- 443端口:HTTPS核心配置 -------------------------- listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com; root /var/www/html; index index.html index.php; # 1. SSL证书路径(Certbot自动生成,无需修改) ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem; # 2. 安全协议:仅启用TLSv1.2和TLSv1.3,禁用所有弱协议 ssl_protocols TLSv1.2 TLSv1.3; # 3. 强加密套件:仅启用前向保密(Forward Secrecy)的强加密算法 ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; # 优先使用服务器端加密套件 # 4. SSL会话优化:减少握手开销,提升性能 ssl_session_cache shared:SSL:10m; # 10m缓存可支持约40000个并发会话 ssl_session_timeout 1d; ssl_session_tickets off; # 禁用会话票据,提升前向保密性 # 5. OCSP Stapling:证书状态查询,加速握手+保护隐私 ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 114.114.114.114 valid=300s; # DNS服务器 resolver_timeout 5s; # 6. HSTS强制HTTPS:防SSL降级攻击,让浏览器始终用HTTPS访问 add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; } 步骤 4:验证证书自动续期
Let’s Encrypt 证书有效期 3 个月,Certbot 会自动添加定时任务续期,我们可以手动测试:
# 测试续期(不会真的续期,仅测试) certbot renew --dry-run 预期结果:显示Congratulations, all renewals succeeded.
6.3 参数详解
(1)HSTS 参数
表格
| 参数 | 含义 |
|---|---|
max-age=63072000 | HSTS 生效时间,单位秒,63072000 秒 = 2 年 |
includeSubDomains | 所有子域名也启用 HSTS |
preload | 允许提交到浏览器 HSTS 预加载列表(可选,需到hstspreload.org提交) |
always | 必须添加,确保错误响应也携带 HSTS 头 |
(2)301 重定向参数
return 301 https://$server_name$request_uri;:301:永久重定向,SEO 权重会传递到 HTTPS 站点$server_name:自动获取当前域名$request_uri:自动获取完整的请求路径(包括参数)
6.4 测试验证
(1)测试自动重定向
curl -I http://yourdomain.com 预期结果:返回301 Moved Permanently,且Location头指向 HTTPS 地址。
(2)测试 SSL 安全性
访问SSL Labs Server Test,输入你的域名,测试 SSL 配置,预期结果为 A + 评级。
6.5 常见问题排查
- 问题:Certbot 申请证书失败?解决:
- 确保域名 DNS 已正确解析到服务器 IP
- 确保服务器 80 和 443 端口已开放(防火墙放行)
- 检查 Nginx 是否正在运行,且 80 端口未被占用
- 问题:HTTPS 访问显示 “不安全”?解决:
- 检查证书是否过期:
certbot certificates - 检查
ssl_certificate和ssl_certificate_key路径是否正确 - 检查网站是否有 HTTP 资源(如图片、JS),需全部替换为 HTTPS
- 检查证书是否过期:
七、最终整体配置校验与生效
7.1 整合所有配置到单个站点文件
为了方便你使用,以下是整合了所有 8 大功能的完整站点配置文件,可直接复制使用(需替换标注为「用户修改」的内容):
# /etc/nginx/conf.d/yourdomain.conf # 整合:隐藏版本号、限制请求方式、CC防御、防盗链、HTTPS、自动重定向 # -------------------------- 80端口:自动重定向到HTTPS -------------------------- server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; # 用户修改:替换为你的域名 return 301 https://$server_name$request_uri; } # -------------------------- 443端口:核心安全配置 -------------------------- server { listen 443 ssl http2; listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com; # 用户修改:替换为你的域名 root /var/www/html; # 用户修改:替换为你的网站根目录 index index.html index.php; # -------------------------- 1. HTTPS与SSL证书配置 -------------------------- ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem; # 用户修改:替换为证书路径 ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem; # 用户修改:替换为证书路径 ssl_trusted_certificate /etc/letsencrypt/live/yourdomain.com/chain.pem; # 用户修改:替换为证书路径 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:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_session_tickets off; ssl_stapling on; ssl_stapling_verify on; resolver 8.8.8.8 114.114.114.114 valid=300s; resolver_timeout 5s; add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always; # -------------------------- 2. 限制危险请求方式 -------------------------- if ($request_method !~ ^(GET|POST|HEAD)$) { return 405; } # -------------------------- 3. CC攻击防御 -------------------------- location / { limit_req zone=req_limit burst=5 nodelay; limit_conn conn_limit 20; } # -------------------------- 4. 防盗链 -------------------------- location ~* \.(jpg|jpeg|png|gif|webp|mp4|avi|flv|pdf)$ { valid_referers none blocked server_names *.yourdomain.com yourdomain.com; # 用户修改:替换为你的域名 if ($invalid_referer) { return 403; } expires 7d; access_log off; } # -------------------------- 5. 敏感文件禁止访问(补充安全) -------------------------- location ~ /\. { deny all; return 404; access_log off; } location ~* \.(bak|sql|ini|conf|log|sh)$ { deny all; return 404; access_log off; } } 7.2 配置生效与测试
# 1. 测试Nginx配置语法(必须通过才能重载) nginx -t # 预期结果:syntax is ok 和 test is successful # 2. 平滑重载Nginx(不中断业务) systemctl reload nginx # 3. 整体功能测试(按前面各章节的测试方法逐一验证) 八、日常运维与监控
定期检查 SSL 证书有效期:
certbot certificates定期查看 Fail2ban 封禁状态:
fail2ban-client status nginx-malicious 定期查看 Nginx 日志:
# 查看访问日志 tail -f /var/log/nginx/access.log # 查看错误日志 tail -f /var/log/nginx/error.log 