
配置方式:前后分离,nginx 分发静态文件,然后将 /api/路由反向代理到后端,前端无跨域。
需求:后端 api 很多,想要使用 nginx 的限频功能,但是不同 api 频率不一样。
现在的写法
#上文省略 location ^~ /api/ { proxy_pass http://127.0.0.1:3333; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; limit_req zOne=allips burst=20 nodelay; } 现在的写法就是全路由统一反向代理,然后公用一个 limit_req ,比如如果有/api/a1?=...和/api/b2?=...这两个 api ,是否 nginx 上需要分别设置各自的路由,各自的反向代理,和各自的 limit_req 的 zone ?如果 api 特别多的话是不是 zone 增多会导致内存爆炸啊。。
1 des 2022-02-01 10:09:25 +08:00 via iPhone 用 map 应该可以 |
2 ilylx2008 2022-02-01 11:31:23 +08:00 来个中间件 |
3 0ZXYDDu796nVCFxq 2022-02-01 11:47:12 +08:00 via Android 规则不多就多搞几个 location 和 zone zone 的计数器占不了多少内存 |
4 LeeReamond OP @gstqc 规则比较多,复写能工作但我感觉这好像不是正确的配置方式。另外一个问题是使用 limit_req 功能是不是就不能使用 cf 代理了 |
5 allenforrest 2022-02-01 12:58:28 +08:00 类似这样? limit_req_zone $request_uri zOne=addr2:50m rate=10r/s; limit_req zOne=addr2 burst=20 nodelay; limit_req_status 503; |
6 adoal 2022-02-01 12:59:43 +08:00 via iPhone 靠纯 nginx 的配置可以做到,不过麻烦,不如上一个 API 网关,kong 或者 apisix |
7 learningman 2022-02-01 13:08:41 +08:00 location 块可以重复生效的吧,limit 写在具体的 block 里行不 |
8 ryd994 2022-02-01 13:19:19 +08:00 via Android 5 楼的思路是对的。但是第一行忘了加入$binary_remote_addr ,结果就是整个 url 不论 IP 加在一起限速。也没有拆分前缀,往 uri 加额外字符就可以绕过了。要用的话你可以在 location 里用 regex match 然后用 named capture ,捕捉 url 的第一小节。 cf 代理可以用,cf 会设置 x-forwarded-for 和 client-ip ,用好 ngx_http_realip_module ,只信任来自 cloudflare 的 client ip 即可。 |
9 ryd994 2022-02-01 13:22:11 +08:00 via Android 还有,如果 API 不多的话可以用嵌套 location 。这样就不应反复写代理配置,每个 location 里再写一遍 limit 即可。 还有,你这 location 写的什么玩意?/api/这不就是固定匹配,用什么 regex ?(当然你按我上面说的话那还是得用 regex 去捕捉 api 名称) |
10 wellsc 2022-02-01 13:33:52 +08:00 via iPhone ng 受限于单点,上 openresty lua redis 吧 |
11 ManjusakaL 2022-02-01 14:35:46 +08:00 via iPhone 直接上个 openresty 系列的网关吧 |
12 youyoumarco 2022-02-03 13:16:33 +08:00 apisix 走起 |