我遇到的问题是,实际上有 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 变量,其中活着指令是什么?我几乎可以肯定它不会起作用,但请告诉我 :)