目前,我有数百个 Web 应用程序分布在大约 20 台服务器上,并且在这些运行的 Pound 和 Haproxy 前面有一个反向代理。 Pound 正在执行 http 到 https 重定向和 SSL 加密,然后转发到 Haproxy,Haproxy 为每个站点设置了一条规则,以转发到运行 Tomcat 的后端服务器之一。所有站点都位于同一域,例如 www.domain.com/webapp1、www.domain.com/webapp2
Pound 和 Haproxy 最初是由我们的托管提供商设置的,由于对 Pound 感到沮丧,我现在正在考虑用 Nginx 替换此设置。我已经让 Nginx 在开发环境中运行,执行 https 重定向和 SSL,并且设置了一些规则来代理到后端。
我真的只是在寻求一些建议,看看这是否是解决此问题的最佳方法,或者我是否最好让 Haproxy 处理所有规则并仅将 Nginx 配置为 Pound 的替代品。
我担心的是,我将使用数百个转发规则(如下所示)配置 Nginx,最终会出现性能问题。欢迎任何建议,谢谢。
location /webapp1/ {
proxy_pass http://10.1.9.11:8080;
}
location /webapp2/ {
proxy_pass http://10.1.9.11:8080;
}
location /webapp3/ {
proxy_pass http://10.1.9.12:8080;
}
答案1
我对此了解不多,haproxy
但我知道足以nginx
解决您对性能问题的担忧。
请注意,nginx
配置被编译为struct
友好的格式并保存在内存中,不会在每次请求时读取该文件。因此,数百个location /...
配置的运行速度几乎与调用相同的次数一样strlen()
快strncmp()
。与套接字设置相比,这是可以忽略不计的。
网址是在匹配开始之前标准化=
因此,除非您使用运算符之一 ( , ~
, *~
, ^~
),否则匹配并没有什么真正聪明的地方。
您可以使用正则表达式匹配(~
,*~
),然后使用一些if
逻辑来在服务器之间做出决定upstream
,但是这将是一个缓慢的解决方案。
另一方面,如果您确实有至少一个正则表达式位置,那么您应该考虑使用^~
运算符。请参阅马丁·雷蒙德 (Martin Redmond) 对 SO 的旧但仍然相关的答案关于不同的运算符以及如何nginx
匹配它们。