使用 nginx 的通用持久连接池代理

使用 nginx 的通用持久连接池代理

我遇到的问题是,实际上有 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;
    }
}

我的猜测是,持久连接是在端口上运行的服务器之间汇集的88918889这是毫无意义的。

是否可以创建 nginx 代理并池化到任何地方的持久连接?如果不能,创建这样的代理似乎很简单。所以也许已经存在一个我不知道的更好的解决方案。

答案1

您猜对了为什么它不能按预期工作。您正在尝试使用 Nginx 作为正向代理,尽管按照您的方式是可行的,但仍存在许多限制,因为 Nginx 并非设计用于这种方式。您应该使用 Squid 或 Apache mod_proxy,它们对正向代理的支持更好。

但:

您是否尝试过在上游定义中使用 $http_host 变量,其中活着指令是什么?我几乎可以肯定它不会起作用,但请告诉我 :)

相关内容