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是否正确,访问日志是否有内容 -
检查
failregex是否匹配日志格式,用fail2ban-regex测试:bash
运行
fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-malicious.conf
-
-
问题 :误封正常用户 IP?解决 :
- 调大
maxretry和findtime参数 - 在
ignoreregex中添加正常用户的特征,或添加 IP 白名单
- 调大
六、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. 整体功能测试(按前面各章节的测试方法逐一验证)
八、日常运维与监控
-
定期查看 Nginx 日志 :
# 查看访问日志 tail -f /var/log/nginx/access.log # 查看错误日志 tail -f /var/log/nginx/error.log -
定期查看 Fail2ban 封禁状态 :
fail2ban-client status nginx-malicious -
定期检查 SSL 证书有效期 :
certbot certificates
