Nginx 限流+HTTPS安全配置笔记

lishihuan大约 5 分钟

Nginx 限流+HTTPS安全配置笔记

一、配置核心内容(最终版)

1. 全局配置(/etc/nginx/nginx.conf)

user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;

include /usr/share/nginx/modules/*.conf;

events {
    worker_connections 1024;
}

http {
    log_format  main  '$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  main;

    sendfile            on;
    tcp_nopush          on;
    tcp_nodelay         on;
    keepalive_timeout   65;
    # 全局限流规则:单IP每秒最多2次请求(测试完成后调整为10r/s)
    limit_req_zone $binary_remote_addr zone=test:10m rate=2r/s;
    types_hash_max_size 2048;

    include             /etc/nginx/mime.types;
    default_type        application/octet-stream;

    include /etc/nginx/conf.d/*.conf;

    server {
        listen       80 default_server;
        listen       [::]:80 default_server;
        server_name  _;
        root         /usr/share/nginx/html;

        include /etc/nginx/default.d/*.conf;

        location / {}
        error_page 404 /404.html;
        location = /40x.html {}
        error_page 500 502 503 504 /50x.html;
        location = /50x.html {}
    }
}

2. 站点配置(/etc/nginx/conf.d/test.cn.conf)

# HTTP强制跳转HTTPS
server {
    listen 80;
    server_name test.cn www.test.cn;
    return 301 https://$host$request_uri;
}

# HTTPS主配置
server {
    listen 443 ssl http2;
    server_name test.cn www.test.cn;

    # SSL证书配置
    ssl_certificate /etc/nginx/ssl/test.cn.pem;
    ssl_certificate_key /etc/nginx/ssl/test.cn.key;

    # HTTPS安全加固
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
    # HSTS强制HTTPS
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    # 防XSS/点击劫持
    add_header X-XSS-Protection "1; mode=block" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-Frame-Options "DENY" always;

    # 限流规则(写在server块,对所有location生效)
    limit_req zone=test burst=20 nodelay;

    # 敏感文件拦截
    location ~ /\.(git|env|svn|hg) {
        deny all;
        access_log off;
        log_not_found off;
    }
    location ~* \.(bak|sql|rar|zip|7z|ini|conf)$ {
        deny all;
        access_log off;
        log_not_found off;
    }

    # 静态资源缓存
    location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
        expires 30d;
        add_header Cache-Control "public, max-age=2592000";
        proxy_cache_bypass $http_pragma;
        proxy_cache_revalidate on;
    }

    # 博客主路径
    location / {
        root   /home/notes_book/dist/;
        try_files $uri $uri/ /index.html;
        index  index.html index.htm;
        expires 1d;
    }

    # family_menu子路径
    location /family_menu/ {
        alias   /home/family_menu/;
        try_files $uri $uri/ /family_menu/index.html;
        index  index.html index.htm;
        expires 1d;
        allow all;
    }

    # 日志配置
    access_log /var/log/nginx/test.cn.access.log;
    error_log /var/log/nginx/test.cn.error.log;
}

二、核心功能与使用场景

配置项核心功能适用场景
limit_req_zone + limit_req限制单IP请求频率(默认2r/s)1. 防单IP高频刷页面/爬虫;2. 防CC攻击(小流量);3. 防扫描器批量扫目录;4. 保护小服务器不被高频请求拖垮
HTTP→HTTPS强制跳转所有HTTP请求重定向到HTTPS1. 避免明文传输;2. 提升网站安全评级;3. 防止运营商劫持HTTP流量
HSTS + HTTPS加固1. 强制浏览器永久用HTTPS;2. 禁用老旧TLS协议1. 防SSL剥离攻击;2. 防中间人篡改;3. 提升HTTPS安全性
敏感文件拦截禁止访问.git/.bak等敏感文件1. 防止泄露代码/配置信息;2. 降低被黑客利用敏感文件的风险
静态资源缓存浏览器缓存静态文件(30天)1. 减少服务器请求量;2. 提升页面加载速度;3. 减轻服务器压力

重点场景说明

  • 核心适用场景:个人静态博客(VuePress/Hexo)、小流量静态网站、无后台/数据库的轻量站点;
  • 不适用场景:高并发动态站点(需结合CDN/高防)、分布式攻击防护(需专业WAF)。

三、配置优势

  1. 轻量无副作用:仅拦截高频机器请求,正常用户(每秒≤2次请求)完全无感;
  2. 安全兜底:覆盖静态站点99%的安全风险(HTTPS劫持、敏感文件泄露、高频刷量);
  3. 易维护:限流规则写在server块,对所有路径生效,无需重复配置;
  4. 高性能:Nginx原生模块实现,不消耗额外服务器资源;
  5. SEO友好:301永久重定向HTTP→HTTPS,不影响搜索引擎收录。

四、测试验证方法

1. 核心验证

步骤1:执行批量请求命令【云服务中执行】

# 发送100个密集请求,触发限流
for i in {1..100}; do curl -I -s https://www.test.cn | grep "HTTP/"; done

预期结果:

  • 前20条(burst=20)显示 HTTP/1.1 200 OK
  • 后续请求显示 HTTP/1.1 503 Service Temporarily Unavailable(限流生效)。

步骤2:查看日志确认

# 查看503拦截记录
grep "503" /var/log/nginx/test.cn.access.log

预期结果:出现含503状态码的日志,说明限流成功拦截。

2. 本机辅助测试(Windows BAT脚本)

脚本内容(无弹窗、实时显示结果)

@echo off
setlocal enabledelayedexpansion

:: 一次性启动50个curl进程,并发请求(瞬间打满阈值)
for /L %%i in (1,1,50) do (
    start /min cmd /c "curl -I -s https://www.test.cn | findstr "HTTP/" >> test_result.txt"
)

:: 等待2秒,让请求完成
timeout /t 2 /nobreak >nul

:: 清理临时文件
:: del test_result.txt
taskkill /f /im cmd.exe /fi "windowtitle eq Administrator:  cmd.exe" >nul 2>&1

结果说明:

  • 若本机测不出503:是公网延迟/Windows并发限制导致,不代表配置失效,以服务器本地测试为准;
  • 若服务器本地能测出503:证明限流在真实攻击场景下100%生效。

3. 其他功能验证

(1)HTTPS验证

# 检查HTTPS协议是否仅启用TLS1.2/1.3
curl -v https://www.test.cn 2>&1 | grep "SSL connection"

预期结果:显示 SSL connection using TLSv1.3TLSv1.2

(2)敏感文件拦截验证

# 访问.git文件,应返回403
curl -I https://www.test.cn/.git

预期结果:HTTP/1.1 403 Forbidden

五、注意事项

  1. 限流阈值调整:个人博客建议 rate=10r/s(更宽松),小服务器可设 rate=2r/s
  2. CDN适配:若开启CDN,需将 $binary_remote_addr 改为 $http_x_forwarded_for(获取真实IP);
  3. 证书续期:SSL证书到期前需及时替换,否则HTTPS失效;
  4. 配置重载:修改配置后必须执行 nginx -t && nginx -s reload 生效;
  5. 日志清理:定期清理Nginx日志,避免占用磁盘空间。

六、核心结论

  1. 该配置能防护个人静态博客99%的真实攻击(单IP高频刷量、爬虫、扫描器);
  2. 本机测试不出503是环境限制,不影响真实攻击场景下的防护效果;
  3. 配置轻量、易维护,是小流量静态站点的最优安全兜底方案。