Nginx限流配置实战:保护你的个人项目

📅 2026/6/25 13:00:03
Nginx限流配置实战:保护你的个人项目
Nginx限流配置实战保护你的个人项目前段时间我的个人博客上线后有一天突然访问特别慢一看服务器日志好家伙——被爬虫疯狂扫接口一分钟请求了几千次。作为一个99元低配ECS哪经得起这么折腾。赶紧把Nginx限流配上了问题解决。今天就把Nginx限流的几种常用配置分享出来希望对你有帮助。一、为什么要限流个人项目上线后你可能会遇到这些情况爬虫疯狂抓取把你的文章接口当API调恶意刷接口有人用脚本扫你的登录接口瞬时高并发文章突然火了大量用户同时访问资源耗尽低配ECS扛不住大量并发请求限流不是为了让用户用不了而是保护你的服务器不被拖垮。合理的限流配置能让有限的资源服务好真正的用户。二、Nginx限流基础配置Nginx限流主要靠两个模块limit_req请求频率限制和limit_conn并发连接限制。2.1 限制请求频率# 在 http 块定义限流区域 http { # 定义一个名为 mylimit 的限流区域 # 10m 表示存储10MB的客户端IP信息 # rate1r/s 表示每秒只允许1个请求 limit_req_zone $binary_remote_addr zonemylimit:10m rate1r/s; server { location /api/ { # 应用限流 # burst5 表示允许超过限制的5个请求排队 # nodelay 表示排队请求不延迟处理 limit_req zonemylimit burst5 nodelay; proxy_pass http://localhost:8083; } } }参数说明参数作用rate1r/s每秒1个请求超过的会被拒绝burst5允许突发5个请求排队nodelay排队的请求不延迟处理10m存储10MB的IP信息够存几万个IP了2.2 限制并发连接数http { # 定义连接限制区域 limit_conn_zone $binary_remote_addr zoneconnlimit:10m; server { location /api/ { # 每个IP最多10个并发连接 limit_conn connlimit 10; # 超时的请求断开 limit_conn_status 503; } } }三、实际场景配置场景1保护文章接口博客的文章列表和详情接口是爬虫最喜欢抓的http { # 文章接口限流每秒2个请求 limit_req_zone $binary_remote_addr zonearticles:10m rate2r/s; server { location ~ ^/api/posts { limit_req zonearticles burst10 nodelay; proxy_pass http://localhost:8083; } } }场景2保护登录接口登录接口更要严格限流防止暴力破解http { # 登录接口限流每分钟5个请求 limit_req_zone $binary_remote_addr zonelogin:10m rate5r/m; server { location /api/auth/login { limit_req zonelogin burst3 nodelay; # 返回429状态码 limit_req_status 429; proxy_pass http://localhost:8083; } } }场景3限制某个目录的下载如果你的网站有文件下载功能http { limit_conn_zone $binary_remote_addr zonedownload:10m; server { location /download/ { # 每个IP同时只能下载1个文件 limit_conn download 1; # 限制下载速度为 500KB/s limit_rate 500k; } } }四、白名单配置有时候需要给特定IP比如你自己放行http { # 创建一个变量默认为空 geo $limited { default 1; # 你自己的IP不限流 你的服务器IP 0; 你的家庭宽带IP 0; } # 只在 $limited1 时限流 limit_req_zone $binary_remote_addr zoneapi:10m rate1r/s; server { location /api/ { if ($limited) { limit_req zoneapi burst5 nodelay; } proxy_pass http://localhost:8083; } } }五、限流后的友好提示当用户被限流时Nginx默认返回503但你可以自定义返回内容让体验更好server { # 自定义限流返回 error_page 429 /429.html; location /429.html { root /usr/share/nginx/html; internal; } # 或者返回JSON格式 error_page 429 rate_limit_json; location rate_limit_json { default_type application/json; return 200 {code:429,message:请求太频繁请稍后再试}; } }六、验证限流效果配置完后用 curl 测试一下# 快速发送10个请求看有几个被限流foriin$(seq110);docurl-s-o/dev/null-w%{http_code}\nhttp://你的域名/api/postsdone正常情况下你会看到一部分返回200一部分返回429被限流了。七、总结Nginx限流是保护个人项目最简单有效的手段之一配置起来也就几行代码但效果立竿见影。我的云深不知处博客配置了限流之后再也没被爬虫打趴过。如果你也把个人项目部署在某云ECS上建议第一时间配上限流。如果你还没有服务器可以看看某云的低至9.9元ECS活动买个低配的先练手。新用户还有85折首购优惠几十块钱就能跑一年个人项目够用了。如果你还没有服务器或者其它个人开发产品点击「独立开发者的省钱攻略」获取更多福利优惠。关于作者无羡独立开发者专注AI应用开发。 分类全栈开发 关注我获取更多技术分享 个人博客云深不知处 独立开发省钱攻略查看详情 体验我的AI产品一纸云深如果这篇文章对你有帮助欢迎点赞、收藏、关注你的支持是我持续创作的动力点击「阅读原文」查看我的独立开发笔记 点击查看我的个人介绍 点击查看我的小红书主页