1. 设置合理的 client_max_body_size
这个指令限制客户端请求体(如文件上传)的最大大小。设置过小影响正常使用,设置过大则可能被攻击者利用,发送超大请求体来消耗服务器资源。
配置方法:
通常,这个指令可以在 http、server 或 location 块中设置。
http {<br />
# 在http块中设置为全局默认值,例如限制为10M<br />
client_max_body_size 10m;<br />
}</p>
<p>server {<br />
listen 80;<br />
server_name your_domain.com;</p>
<p> # 针对这个server,可以覆盖全局设置,例如限制为20M<br />
client_max_body_size 20m;</p>
<p> location / {<br />
# ... 其他配置 ...<br />
}</p>
<p> location /upload {<br />
# 对于专门的上传接口,可以设置得更大一些<br />
client_max_body_size 50m;<br />
# ... 其他上传配置 ...<br />
}</p>
<p> location /api {<br />
# 对于API,可能不需要太大的请求体<br />
client_max_body_size 1m;<br />
}<br />
}
- 单位:
k(千字节),m(兆字节),g(千兆字节) - 建议:根据您的业务需求设置。如果网站没有文件上传功能,可以设置一个较小的值(如1M)。对于上传功能,设置一个合理的上限。
2. 限制单个 IP 的连接数和请求速率
这是应对CC攻击和扫描非常有效的手段。
A. 限制请求速率
使用 limit_req_zone 和 limit_req 指令。
http {<br /> # 定义限制参数<br /> # $binary_remote_addr 是客户端的二进制IP地址,占用空间更小<br /> # zone=req_per_ip:10m 定义一个名为req_per_ip的共享内存区,用来存储KEY的状态,10MB可以处理约16万个IP的状态<br /> # rate=10r/s 表示每秒允许10个请求<br /> limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;</p> <p> server {<br /> listen 80;<br /> server_name your_domain.com;</p> <p> location / {<br /> # 应用限制<br /> # zone=req_per_ip 使用上面定义的zone<br /> # burst=20 允许超过速率限制后最多有20个请求被放入队列延迟处理<br /> # nodelay 对于burst队列中的请求,不延迟处理,立即按速率处理;如果没有nodelay,则会延迟处理,导致用户等待。<br /> limit_req zone=req_per_ip burst=20 nodelay;</p> <p> # ... 其他配置(例如 proxy_pass, root等) ...<br /> }</p> <p> # 对于静态文件,通常可以放宽或不做限制<br /> location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {<br /> # 不应用请求频率限制<br /> expires 1y;<br /> add_header Cache-Control "public, immutable";<br /> }</p> <p> # 对于登录页面或API,可以设置更严格的限制以防爆破<br /> location /login {<br /> limit_req zone=req_per_ip burst=5 nodelay;<br /> # ... 其他配置 ...<br /> }<br /> }<br /> }B. 限制连接数
使用
limit_conn_zone和limit_conn指令。这对于防止单个IP占用过多连接(如下载)特别有用。
http {<br /> # 定义连接限制参数<br /> # zone=conn_per_ip:10m 定义一个名为conn_per_ip的共享内存区<br /> limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;</p> <p> server {<br /> listen 80;<br /> server_name your_domain.com;</p> <p> # 全局限制每个IP最多保持10个连接<br /> limit_conn conn_per_ip 10;</p> <p> location / {<br /> # ... 其他配置 ...<br /> }</p> <p> # 对于下载区域,可以单独限制更严格的连接数<br /> location /downloads {<br /> limit_conn conn_per_ip 2; # 每个IP同时只能下载2个文件<br /> # ... 其他配置 ...<br /> }<br /> }<br /> }3. 对某些敏感的 URL 路径实施严格的访问控制
通过
location块对管理后台、API接口等敏感路径进行加固。A. IP 白名单(最安全)
只允许受信任的IP访问。
server {<br /> listen 80;<br /> server_name your_domain.com;</p> <p> # 正常网站内容<br /> location / {<br /> # ... 其他配置 ...<br /> }</p> <p> # 保护 WordPress 后台<br /> location /wp-admin {<br /> allow 192.168.1.100; # 替换为您的办公室或家庭IP<br /> allow 203.0.113.50; # 替换为另一个信任的IP<br /> deny all; # 拒绝所有其他IP</p> <p> # 同时可以加上请求速率限制<br /> limit_req zone=req_per_ip burst=5 nodelay;</p> <p> # ... 其他配置(例如 try_files 或 proxy_pass)...<br /> }</p> <p> # 保护 PHPMyAdmin 或其他数据库管理工具<br /> location /phpmyadmin {<br /> allow 192.168.1.100;<br /> deny all;<br /> auth_basic "Admin Login"; # 额外增加一层HTTP基础认证<br /> auth_basic_user_file /etc/nginx/.htpasswd;<br /> }</p> <p> # 保护 API 接口<br /> location /api/v1/admin {<br /> allow 192.168.1.0/24; # 允许整个内网网段<br /> deny all;<br /> limit_req zone=req_per_ip burst=10 nodelay;<br /> }<br /> }B. 密码认证
即使IP泄露,也多一层防护。
生成密码文件:
# 首次创建,-c 参数表示创建文件,后续添加用户不要再使用 -c,否则会覆盖<br /> sudo sh -c "echo -n 'username:' >> /etc/nginx/.htpasswd"<br /> sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"<br /> # 然后输入密码</p> <p># 或者使用 apache2-utils 包中的 htpasswd 命令<br /> sudo apt-get install apache2-utils<br /> sudo htpasswd -c /etc/nginx/.htpasswd username
Nginx 配置:
location /secret-area {<br /> auth_basic "Restricted Area";<br /> auth_basic_user_file /etc/nginx/.htpasswd;<br /> }综合配置示例
一个结合了以上多种措施的 server 块可能看起来像这样:
http {<br /> limit_req_zone $binary_remote_addr zone=req_per_ip:10m rate=10r/s;<br /> limit_conn_zone $binary_remote_addr zone=conn_per_ip:10m;<br /> client_max_body_size 10m;<br /> }</p> <p>server {<br /> listen 80;<br /> server_name your_domain.com;</p> <p> # 全局连接限制<br /> limit_conn conn_per_ip 10;</p> <p> # 根目录,应用请求频率限制<br /> location / {<br /> limit_req zone=req_per_ip burst=20 nodelay;<br /> try_files $uri $uri/ /index.php?$query_string;<br /> }</p> <p> # 静态资源,不限制频率,利用缓存<br /> location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff2)$ {<br /> expires 1y;<br /> add_header Cache-Control "public, immutable";<br /> }</p> <p> # 严格保护后台<br /> location /admin {<br /> allow 192.168.1.100; # 你的IP<br /> deny all;<br /> limit_req zone=req_per_ip burst=5 nodelay;<br /> auth_basic "Admin Panel";<br /> auth_basic_user_file /etc/nginx/.htpasswd;<br /> try_files $uri $uri/ /index.php?$query_string;<br /> }</p> <p> # 保护上传接口,限制文件大小<br /> location /api/upload {<br /> client_max_body_size 20m;<br /> limit_req zone=req_per_ip burst=5 nodelay;<br /> # ... 处理上传的逻辑 ...<br /> }<br /> }重要提醒:
- 测试:在应用这些配置到生产环境之前,请在测试环境中充分验证,确保不会误伤正常用户。
- 重载配置:每次修改 Nginx 配置后,使用
sudo nginx -t测试配置语法是否正确,然后使用sudo systemctl reload nginx重载配置使其生效。- 根据业务调整:所有数字(如速率、连接数、文件大小)都需要根据您网站的实际流量和业务需求进行调整。
通过这些 Nginx 层面的防护,您可以大大降低被恶意扫描和攻击的风险,与 Fail2ban 形成互补的防御体系。
「点点赞赏,手留余香」
声明:本文为原创文章,版权归旷野小站所有,欢迎分享本文,转载请保留出处!
你可能也喜欢
- ♥ Linux的一些常用命令04/15
- ♥ ubuntu22.04服务器版系统root用户不能登录的解决11/01
- ♥ docker-compose部署lnmp架构12/06
- ♥ nextcloud运行缓慢的优化12/17
- ♥ wordpress网站文章迁移并保留URL和分类标签的方法11/12
- ♥ Nginx连接与请求速率限制详解10/03