关于 Nginx 处理请求方法的猜想

2022-02-16 17:37:39 +08:00
 Coolxiaobai

Nginx 处理 http 请求时,rewrite 模块可以获取到客户端请求方法,照官方文档,if 模块可以在 server 指令块或者 location 指令块中。

猜想:比如为某个只有 GET 方法的后端接口配置一个 if 模块过滤时,非 GET 方法,直接 return 状态码加报错信息,和不过滤,直接放这个请求到具体的 location 块,让后端去处理。前面这个会不会性能更好点,请大佬不吝赐教。。。

  if ($request_method = GET){
    return 203 "method:$request_method 方法不合规\n";
    break;
  }

2173 次点击
所在节点    NGINX
9 条回复
nl101531
2022-02-16 17:46:30 +08:00
1. nginx 一般会把特定域名下的全部请求按照比较通用的规则转发到指定后端服务器,比如 xxx.com/api 都转发到后端,没怎么见过一个方法配置一个 location 的,所以在这里做判断就不合适了。
2. 这种方式两者有耦合,你后端加个方法,这里还要更新
3. 这种算是异常场景,异常本身就是少数,没必要考虑性能损耗
0ZXYDDu796nVCFxq
2022-02-16 17:57:36 +08:00
性能没啥关系
总不能报异常了还大量请求吧

这种业务逻辑应该放后端
Coolxiaobai
2022-02-16 18:00:35 +08:00
@nl101531 #1 确实是个奇葩场景,平常基本不会遇见。哈哈。不管它了
ch2
2022-02-16 18:00:54 +08:00
对于你要处理的这种异常,无论是 nginx 还是哪一个后端服务,都是 hello world 级别的小儿科
nginx 单核能一秒拒绝好几 W 个这种 GET ,除非你的后端服务是老古董级别的 ASP.NET ,否则都是轻轻松松
当且仅当系统要处理的异常请求占比非常高的时候,这两种才有区别,否则你没必要考虑什么性能问题,不必过早上各种乱七八糟的优化
Coolxiaobai
2022-02-16 18:02:31 +08:00
@gstqc #2 安全方面考虑的话,攻击者应该也不会拿一个无效的请求方法大量请求。。。确实没必要了😂
Coolxiaobai
2022-02-16 18:04:12 +08:00
@ch2 #4 嗯嗯,没想着优化,也没遇到这个场景,只是在翻译文档时有感而已。。。
Kasumi20
2022-02-16 18:07:06 +08:00
性能肯定更好啊,都少了一步流程了,减少了一次 TCP 传输
Dreax
2022-02-16 18:38:49 +08:00
eason1874
2022-02-16 20:30:00 +08:00
limit_except +1

毫无疑问,在前端 Nginx 拒绝,性能更好。算是一个优化点,不过也不是多关键的优化,机器够用的时候,可有可无

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/834311

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX