Universeller persistenter Verbindungspool-Proxy mit Nginx

Universeller persistenter Verbindungspool-Proxy mit Nginx

Mein Problem ist, dass es buchstäblich 100 verschiedene Remote-Server gibt, die sich ständig ändern. Ich verbinde mich mit PHP über curl mit diesen, dieser PHP-Prozess bricht nach Abschluss ab und es gibt keine Möglichkeit, die Verbindung offen zu halten. Nach meinem derzeitigen Kenntnisstand müsste ich jeden einzelnen in der Nginx-Konfiguration einrichten. Folgendes funktioniert für einen Server:

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 "";
    }
}

Das einzige Problem besteht darin, dass es im Upstream some-server.comfest codiert ist und keine Variable sein kann.

Im Folgenden versuche ich, eine universelle Version davon zu erstellen. Die Proxyfunktion funktioniert einwandfrei, aber es wird kein dauerhafter Verbindungspool zum Remote-Server aufrechterhalten:

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;
    }
}

Ich vermute, dass die dauerhafte Verbindung zwischen meinen auf dem Port laufenden Servern gebündelt wird 8891, 8889was sinnlos ist.

Ist es möglich, einen Nginx-Proxy zu erstellen und dauerhafte Verbindungen zu jedem beliebigen Ort zu bündeln? Falls nicht, scheint die Erstellung eines solchen Proxys trivial. Vielleicht gibt es also bereits eine bessere Lösung, die ich nicht kenne.

Antwort1

Sie haben den Grund erraten, warum es nicht wie beabsichtigt funktioniert. Sie versuchen, Nginx als Forward-Proxy zu verwenden, und obwohl dies auf Ihre Art möglich ist, gibt es viele Einschränkungen, da Nginx nicht für diese Verwendung konzipiert ist. Sie sollten Squid oder sogar Apache mod_proxy verwenden, das Forward-Proxying besser unterstützt.

ABER:

Haben Sie versucht, die Variable $http_host in der Upstream-Definition zu verwenden, wo diebleib am LebenDirektive ist? Ich bin fast sicher, dass es nicht funktionieren wird, aber lass es mich wissen :)

verwandte Informationen