我遇到的問題是,實際上有 100 個不同的遠端伺服器不斷變化。我使用curl 透過 PHP 連接到這些,PHP 進程在完成後終止,並且無法保持連線開啟。以我目前的知識,我必須在 nginx 配置中設定每一項。以下適用於一台伺服器:
upstream some-server {
server some-server.com:443;
keepalive 20;
}
server {
listen 80;
server_name some-server.com;
location / {
proxy_pass https://some-server;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
唯一的問題是在上游,some-server.com
它是硬編碼的並且不能是變數。
以下是我嘗試製作相同版本的通用版本。它可以正確代理,但不會保留到遠端伺服器的持久連接池:
server {
listen 8889;
location / {
proxy_pass https://$http_host$request_uri;
resolver 8.8.8.8;
proxy_http_version 1.1;
proxy_set_header Connection "";
}
}
upstream https-proxy {
server localhost:8889;
keepalive 20;
}
server {
listen 8891;
location / {
proxy_pass http://https-proxy;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_set_header Host $http_host;
}
}
我的猜測是,持久連接是在連接埠上運行的伺服器之間匯集的8891
,8889
這是毫無意義的。
是否可以使 nginx 代理並池持久連接到任何地方?如果沒有,那麼製作這樣的代理商似乎微不足道。所以也許我不知道更好的解決方案已經存在。
答案1
您猜到了它不能按預期工作的原因。您正在嘗試使用 Nginx 作為轉發代理,儘管您這樣做是可能的,但有許多限制,因為 Nginx 並不是設計用於這種方式。您應該使用 Squid 甚至 Apache mod_proxy,它對轉發代理有更好的支援。
但:
您是否嘗試過在上游定義中使用 $http_host 變量,其中活著指令是?我幾乎可以肯定它不會起作用,但請告訴我:)