Nginx 处理 http 请求时,rewrite 模块可以获取到客户端请求方法,照官方文档,if 模块可以在 server 指令块或者 location 指令块中。
猜想:比如为某个只有 GET 方法的后端接口配置一个 if 模块过滤时,非 GET 方法,直接 return 状态码加报错信息,和不过滤,直接放这个请求到具体的 location 块,让后端去处理。前面这个会不会性能更好点,请大佬不吝赐教。。。
if ($request_method = GET){
return 203 "method:$request_method 方法不合规\n";
break;
}
1
nl101531 2022-02-16 17:46:30 +08:00
1. nginx 一般会把特定域名下的全部请求按照比较通用的规则转发到指定后端服务器,比如 xxx.com/api 都转发到后端,没怎么见过一个方法配置一个 location 的,所以在这里做判断就不合适了。
2. 这种方式两者有耦合,你后端加个方法,这里还要更新 3. 这种算是异常场景,异常本身就是少数,没必要考虑性能损耗 |
2
0ZXYDDu796nVCFxq 2022-02-16 17:57:36 +08:00 via Android
性能没啥关系
总不能报异常了还大量请求吧 这种业务逻辑应该放后端 |
3
Coolxiaobai OP @nl101531 #1 确实是个奇葩场景,平常基本不会遇见。哈哈。不管它了
|
4
ch2 2022-02-16 18:00:54 +08:00
对于你要处理的这种异常,无论是 nginx 还是哪一个后端服务,都是 hello world 级别的小儿科
nginx 单核能一秒拒绝好几 W 个这种 GET ,除非你的后端服务是老古董级别的 ASP.NET ,否则都是轻轻松松 当且仅当系统要处理的异常请求占比非常高的时候,这两种才有区别,否则你没必要考虑什么性能问题,不必过早上各种乱七八糟的优化 |
5
Coolxiaobai OP @gstqc #2 安全方面考虑的话,攻击者应该也不会拿一个无效的请求方法大量请求。。。确实没必要了😂
|
6
Coolxiaobai OP @ch2 #4 嗯嗯,没想着优化,也没遇到这个场景,只是在翻译文档时有感而已。。。
|
7
Kasumi20 2022-02-16 18:07:06 +08:00
性能肯定更好啊,都少了一步流程了,减少了一次 TCP 传输
|
8
Dreax 2022-02-16 18:38:49 +08:00
|
9
eason1874 2022-02-16 20:30:00 +08:00
limit_except +1
毫无疑问,在前端 Nginx 拒绝,性能更好。算是一个优化点,不过也不是多关键的优化,机器够用的时候,可有可无 |