Nginx 限流+HTTPS安全配置笔记
大约 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请求重定向到HTTPS | 1. 避免明文传输;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)。
三、配置优势
- 轻量无副作用:仅拦截高频机器请求,正常用户(每秒≤2次请求)完全无感;
- 安全兜底:覆盖静态站点99%的安全风险(HTTPS劫持、敏感文件泄露、高频刷量);
- 易维护:限流规则写在server块,对所有路径生效,无需重复配置;
- 高性能:Nginx原生模块实现,不消耗额外服务器资源;
- 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.3 或 TLSv1.2。
(2)敏感文件拦截验证
# 访问.git文件,应返回403
curl -I https://www.test.cn/.git
预期结果:HTTP/1.1 403 Forbidden。
五、注意事项
- 限流阈值调整:个人博客建议
rate=10r/s(更宽松),小服务器可设rate=2r/s; - CDN适配:若开启CDN,需将
$binary_remote_addr改为$http_x_forwarded_for(获取真实IP); - 证书续期:SSL证书到期前需及时替换,否则HTTPS失效;
- 配置重载:修改配置后必须执行
nginx -t && nginx -s reload生效; - 日志清理:定期清理Nginx日志,避免占用磁盘空间。
六、核心结论
- 该配置能防护个人静态博客99%的真实攻击(单IP高频刷量、爬虫、扫描器);
- 本机测试不出503是环境限制,不影响真实攻击场景下的防护效果;
- 配置轻量、易维护,是小流量静态站点的最优安全兜底方案。