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 防御:

  1. ngx_http_limit_req_module:限制单 IP 的请求速率(如每秒最多 20 个请求)
  2. ngx_http_limit_conn_module:限制单 IP 的并发连接数(如最多同时 20 个连接)

3.2 配置步骤

步骤 1:在nginx.confhttp块中定义限流规则
复制代码
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 常见问题排查

  • 问题 :正常用户被误杀怎么办?解决 :适当调大rateburst参数,如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.comwww.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中添加微信相关域名,或临时允许noneblocked
  • 问题 :想让盗链者看到防盗链图片,而不是 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?解决

    1. 检查logpath是否正确,访问日志是否有内容

    2. 检查failregex是否匹配日志格式,用fail2ban-regex测试:

      bash

      运行

      复制代码
      fail2ban-regex /var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-malicious.conf
  • 问题 :误封正常用户 IP?解决

    1. 调大maxretryfindtime参数
    2. 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

操作提示

  1. 输入邮箱地址(用于接收证书过期提醒)
  2. 同意服务条款(输入A
  3. 是否分享邮箱(输入N
  4. 是否自动重定向 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 申请证书失败?解决
    1. 确保域名 DNS 已正确解析到服务器 IP
    2. 确保服务器 80 和 443 端口已开放(防火墙放行)
    3. 检查 Nginx 是否正在运行,且 80 端口未被占用
  • 问题 :HTTPS 访问显示 "不安全"?解决
    1. 检查证书是否过期:certbot certificates
    2. 检查ssl_certificatessl_certificate_key路径是否正确
    3. 检查网站是否有 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. 整体功能测试(按前面各章节的测试方法逐一验证)

八、日常运维与监控

  1. 定期查看 Nginx 日志

    复制代码
    # 查看访问日志
    tail -f /var/log/nginx/access.log
    # 查看错误日志
    tail -f /var/log/nginx/error.log
  2. 定期查看 Fail2ban 封禁状态

    复制代码
    fail2ban-client status nginx-malicious
  3. 定期检查 SSL 证书有效期

    复制代码
    certbot certificates
相关推荐
汽车仪器仪表相关领域2 小时前
全工况精准标定 + 智能安全防护,建筑机械防坠生命线:GZCVL T‑II 安全防坠器测试系统实战全解
功能测试·测试工具·安全·单元测试·汽车·压力测试·可用性测试
物联网软硬件开发-轨物科技2 小时前
【轨物洞见】电力运维的“减法”革命:轨物科技如何定义智能开关柜“一键顺控”新范式
运维·人工智能·科技
Figo_Cheung2 小时前
Figo《量子几何学:从希尔伯特空间到全息时空的统一理论体系》(十二)——量子通信:几何安全的网络架构
网络·安全·几何学
Xzq2105092 小时前
Linux高级IO
linux·运维·服务器
北城笑笑2 小时前
Vue 99 ,Vue 项目代理配置规范:跨域解决、路径重写与多环境适配最佳实践( 企业级避坑指南 )
运维·前端·nginx·vue
minji...2 小时前
Linux 进程控制(四)自主Shell命令行解释器.
linux·运维·服务器·数据结构·c++
文刀竹肃2 小时前
长亭 Xray Web 漏洞扫描器
网络·安全·web安全·网络安全
历程里程碑2 小时前
Linux 38 网络协议:从独立主机到全球互通
java·linux·运维·服务器·网络·c++·职场和发展
ISU(考研版)2 小时前
从零开始复现 ThinkPHP RCE:Docker + Burp Suite 实战
运维·docker·容器