我应该在 nginx 中使用 rewrite 还是 return 还是 proxy_pass 吗?

我应该在 nginx 中使用 rewrite 还是 return 还是 proxy_pass 吗?

Apache 文档非常清楚地表明这mod_rewrite应该只是最后的手段。对于nginx,陷阱部分有例子,其中request_uri基本没有改变。


情况是这样的:

  • 我们(研究所的一个部门)有一个主网络服务器,即将升级(运行 Debian 6)。为了处理升级,我设置了一个 nginx 服务器,它将已知运行正常的部分代理到升级后的服务器,其他部分代理到旧服务器。
  • 旧服务器有许多ProxyPass规则(其大量工作是代理)。我希望将它们全部转移到nginx,因为据我所知,nginx在代理方面性能更高。
  • 大量用户的用户主目录由另一台服务器提供服务。对于这些用户,但有波浪号和非波浪号版本可用(即,http://my.site/muruhttp://my.site/~muru将代理到http://other.server/~muru,但http://other.server/muru不存在)。
  • 许多文件夹被代理到同一服务器上的不同文件夹。(例如,http://my.site/local-club将被代理到http://my.site/~local-club)。

我的主要问题是:

  • 假设 A 和 B 都被代理到不同服务器上的 C,我应该使用rewritelocationreturn请求重定向BA,还是继续代理两者?
  • 假设 A 和 B 都在同一台服务器上,并且 B 被代理到 A,我应该使用重写还是返回将 B 重定向到 A?

重定向(和return)的好处是可以清楚地表明两个目录之间的关系。


我的rewrite规则如下:

rewrite ^/B(/.*) /A$1 permanent;

规则如下return

location ~ ^/B(/.*) {
    return 301 /A$1;
}

和:

location ~ ^/~(A|D|E|F..)/ {
    proxy_pass https://other.server;
    proxy_redirect default;
}

答案1

这并不重要,除非你的 nginx 服务器每秒要处理数千个请求,并且你想避免每个请求都花费 CPU 时间进行重写正则表达式匹配。现在,我想说使用最清晰的方式编写配置文件,直到达到此限制,然后如果你没有预算来扩展你的基础设施,那么是时候考虑欺骗你的配置以适应你的流量了。返回的缺点是,如果你有多个重定向,你最终会得到一个位置包装一个返回指令。使用重写,你可以在一个通用位置包装多个,并在第一个参数中测试更具体的模式。

更新:通用位置中多个重定向的示例:

location /B {
    rewrite ^/B/foo/(.*)$ /A/newfoo/$1 permanent;
    rewrite ^/B/bar/(.*)$ /A/newbar/$2 permanent;
    rewrite ^/B/(.*)$ /A/$1 permanent;
}

相关内容