
目前,我有數百個 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
匹配它們。