nginx - connect () ist beim Auslastungstest im Upstream fehlgeschlagen

6

Ich habe einige Lasttests mit wrkmeinem Nginx-Reverse-Proxy durchgeführt -> mein Web-App-Setup und ich habe festgestellt, dass Nginx ab 1000 gleichzeitigen Verbindungen 502s und die folgende Fehlermeldung zurückgibt:

2015/04/17 20:45:26 [crit] 6068#0: *1116212677 connect() to \
127.0.0.1:3004 failed (99: Cannot assign requested address) \
while connecting to upstream, client: xxx.xxx.xx.165, server: \
foo.bar.com, request: "GET /my/route HTTP/1.1", upstream: \
"http://127.0.0.1:3004/my/route", host: "foo.bar.com"

der wrkbefehl lautete:

wrk -t10 -c500 -d5m "https://foo.bar.com/my/route" -H "Accept: application/json"

Ich versuche herauszufinden, was hier falsch gelaufen sein könnte. Meine Webanwendung wartet auf Anfragen, die von nginx an Port 3004 weitergeleitet werden. Läuft nginx über keine Ports mehr? Ist die Webanwendung nicht in der Lage, diese vielen Anfragen zu bearbeiten? Werden Anfragen abgelaufen? Ich bin mir nicht sicher und würde gerne mehr darüber erfahren.

Alexandr Kurilin
quelle
1
Anscheinend sind Ihnen die lokalen Ports aufgrund von Sockets im Status TIME-WAIT ausgegangen. Sie können versuchen, einen größeren lokalen Portbereich zu verwenden, das Keepalive für Verbindungen festzulegen oder Unix-Sockets für die Verbindung mit Backends zu verwenden. Siehe serverfault.com/questions/649262/…
Federico Sierra,
Weitere Informationen erhalten Sie unter github.com/lebinh/ngxtop . NgxTop zeigt viel mehr Metriken an, die auf diesen Protokollen basieren.
JayMcTee

Antworten:

1

Bereits hier beantwortet: https://stackoverflow.com/questions/14144396/nginx-proxy-connect-to-ip80-failed-99-cannot-assign-requested-address

Die Meldung weist darauf hin, dass Ihnen die lokalen Sockets / Ports ausgehen.

Versuchen Sie, die Netzwerkgrenzen zu erhöhen:

echo "10240 65535" > /proc/sys/net/ipv4/ip_local_port_range
sysctl net.ipv4.tcp_timestamps=1
sysctl net.ipv4.tcp_tw_recycle=0
sysctl net.ipv4.tcp_tw_reuse=1
sysctl net.ipv4.tcp_max_tw_buckets=10000

Alternativ können Sie Unix-Sockets ausprobieren, um festzustellen, ob dies hilfreich ist.

user2743554
quelle
0

Übersicht über Netzwerk-Sockets Wenn eine Verbindung über TCP hergestellt wird, wird sowohl auf dem lokalen als auch auf dem Remote-Host ein Socket erstellt. Die Remote-IP-Adresse und der Remote-Port gehören zur Serverseite der Verbindung und müssen vom Client festgelegt werden, bevor er die Verbindung überhaupt herstellen kann. In den meisten Fällen wählt der Client automatisch, welche lokale IP-Adresse für die Verbindung verwendet werden soll. Manchmal wird sie jedoch von der Software ausgewählt, die die Verbindung herstellt. Schließlich wird der lokale Port zufällig aus einem definierten Bereich ausgewählt, der vom Betriebssystem zur Verfügung gestellt wird. Der Port wird dem Client nur für die Dauer der Verbindung zugeordnet und wird daher als kurzlebig bezeichnet. Wenn die Verbindung beendet wird, kann der kurzlebige Port wieder verwendet werden.

Lösung Aktivieren von Keepalive-Verbindungen

Verwenden Sie die Keepalive-Direktive, um Keepalive-Verbindungen von NGINX zu Upstream-Servern zu aktivieren. Definieren Sie dabei die maximale Anzahl von Keepalive-Verbindungen im Leerlauf zu Upstream-Servern, die im Cache jedes Arbeitsprozesses erhalten bleiben. Wenn diese Anzahl überschritten wird, werden die zuletzt verwendeten Verbindungen geschlossen. Ohne Keepalives erhöhen Sie den Aufwand und sind sowohl bei Verbindungen als auch bei kurzlebigen Ports ineffizient.

http {
    upstream backend {
        server 10.0.0.100:1234;
        server 10.0.0.101:1234;
 }

    server {
        # ...
        location / {
            # ...
            proxy_pass http://backend;
            proxy_bind $split_ip;
            proxy_set_header X-Forwarded-For $remote_addr;
        }
    }

    split_clients "$remote_addr$remote_port" $split_ip {
        10%  10.0.0.210;
        10%  10.0.0.211;
        10%  10.0.0.212;
        10%  10.0.0.213;
        10%  10.0.0.214;
        10%  10.0.0.215;
        10%  10.0.0.216;
        10%  10.0.0.217;
        10%  10.0.0.218;
        *    10.0.0.219;
    }
}

mehr: https://www.nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus/

Mont
quelle