connect () fehlgeschlagen (111: Verbindung abgelehnt), während eine Verbindung zum Upstream hergestellt wird

85

502 GatewayBeim Zugriff auf eine PHP-Datei in einem Verzeichnis ( http://example.com/dev/index.php) treten Fehler auf . Die Protokolle sagen einfach Folgendes:

2011/09/30 23:47:54 [error] 31160#0: *35 connect() failed (111: Connection refused) while connecting to upstream, client: xx.xx.xx.xx, server: domain.com, request: "GET /dev/ HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "domain.com"

Das habe ich noch nie erlebt. Was ist die Lösung für diese Art von 502 GatewayFehler?

Dies ist der nginx.conf:

user www-data;
worker_processes 4;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {

    ##
    # Basic Settings
    ##

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}
MacMac
quelle
1
'Verbindung abgelehnt' bedeutet, dass das Backend den Port 9000 nicht überwacht oder dessen Warteschlange voll ist. Dieses Problem hängt mit dem Backend itsef zusammen. Können Sie localhost 9000 telneten? Sie sollten auch Ihre Backend- und PHP-Protokolle überprüfen.
Andrew
Mein Beitrag wurde aktualisiert. Ich konnte nicht zu localhost 9000
telneten.
Derselbe Fehler, mit dem ich Sie konfrontiert habe. Diese Eingabe der Linkbeschreibung hier kann Ihnen helfen
Tripathi29

Antworten:

43

Es hört sich so an, als hätten Sie das Backend für Nginx noch nicht gestartet und konfiguriert. Starten Sie php-fpmund fügen Sie nginx.confim httpKontext Folgendes hinzu :

server {
    listen 127.0.0.1;
    server_name localhost;

    error_log /var/log/nginx/localhost.error_log info;

    root /var/www/localhost/htdocs;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;

        fastcgi_intercept_errors        on;
        error_page 404 /error/404.php;
    }
}
Quanten
quelle
3
Danke Mann, es hat funktioniert, ich habe nicht php-fpminstalliert. Prost.
MacMac
6
Du bist ein reines Genie. Ich kann nicht glauben, dass 1,0000000 Millionen Guides, die ich darüber gelesen habe, NIEMAND erwähnt, dass Sie ein "listen 127.0.0.1" setzen müssen, um das Backend zu aktivieren. Du hast mich vor einem Albtraum gerettet !!!
Sie sollten in Betracht ziehen, den Unix-Socket zu verwenden. Sieh es mit an netstat -lund sieh nach /var/run/php5-fpm.sock(die Konfiguration dafür befindet sich normalerweise in /etc/php5/fpm/pool.d/www.conf. fastcgi_pass unix:<socket>
JohannesM
2
Sie werden listen = /var/run/php5-fpm.sockdrinnen haben /etc/php5/fpm/pool.d/www.conf. aber du wirst wollen listen = 9000und ;listen = /var/run/php5-fpm.sock. wenn du wie ich wärst (oder alternativ kannst du dir den weisen Hinweis von Johannes fastcgi_pass unix:/var/run/php5-fpm.sock;nginx.conf
M.
Das gleiche Problem mit PHP 7.2 haben. Was meinst du mit Hinzufügen der Datei im httpd-Kontext? Wäre dies eine zusätzliche Conf-Datei im Ordner / etc / nginx / sites-available / oder was?
PeterKA
47

Diese Antwort ist nur für diejenigen, die eine solche Fehlermeldung erhalten:

connect () fehlgeschlagen (111: Verbindung verweigert) beim Herstellen einer Verbindung mit dem Upstream-Client .... fastcgi: // [:: 1]: 9000

Schreiben Sie Ihre Nginx-Konfiguration neu, um IP und nicht DNS zu verwenden. Zum Beispiel 127.0.0.1anstelle von localhostoder entfernen Sie den IPv6-Alias ​​aus / etc / hosts.

Quake1TF
quelle
3
Du hast mir die richtige Richtung gezeigt! Ich listen 80dachte, die Verwendung von just war in Ordnung (und es gibt viele Beispiele dafür), aber ich hätte nicht gedacht, dass dies sowohl IPv4- ( 127.0.0.1) als auch IPv6- ( [::1]) Adressen impliziert .
Glarrain
5
Ich musste ändern von listen 80 default_serverzu listen 0.0.0.0:80.
12.
Können Sie erklären, warum dies helfen sollte?
Kaiser
1
In den meisten Linux-Distributionen ist IPv6 im Netzwerk aktiviert, aber nicht alle Pakete sind für die Verwendung mit IPv6 konfiguriert. Meiner Meinung nach gibt der System-Resolver zuerst die IPv6-Adresse zurück, wenn Nginx die Verbindung zum Upstream herstellt. Php-fpm (Centos 7.x) hatte keine solchen Einstellungen von Box. Und die meisten Anleitungen erklären alles in der ipv4-Version und vergessen dabei die ipv6-Zukünfte, die deaktiviert oder verwendet werden sollten.
Quake1TF
Whooah, also [:: 1] ist die IPv6-Adresse von localhost! :) Vielen Dank!
Lechup
4

Habe auch solche Fehler. Problem war mein abstraktes Backend, das auf zwei Server verweist. php-fpmwar nur eine Auflistung zu Sockel ...

# Upstream to abstract backend connection(s) for php
upstream php {
        server unix:/var/run/php5-fpm.sock;
        #server 127.0.0.1:9000;
} 

server {
    [...]

    location ~ \.php$ {
            # NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini

            # With php5-fpm:
            fastcgi_pass php;
            fastcgi_index index.php;
            fastcgi_intercept_errors on;
            include fastcgi_params;
    }
}
KumZ
quelle
1

Hatte das gleiche Problem mit Proxy-Anfragen an einen Node-Server, der auf Port 5000 lauscht. Anfragen ergaben sich mit 200 OKaber gelegentlich 502 Bad Gatewayzufällig. NGINX zeigte den Fehler:

connect() failed (111: Connection refused) while connecting to upstream, client: ..., server: ...

Meine Lösung:

  1. Set Knoten HTTP - Server zu hören , indem Sie localhost als Host ausschließlich für ipv4:server.listen(5000, 'localhost');
  2. IPv6 Listen Direktiven ( listen [::]:80;oder listen [::]:443 ssl default_server;) entfernt.
  3. Der Standortblock proxy_pass wurde geändert, um IPs zu verwenden: proxy_pass http://127.0.0.1:5000(nicht proxy_pass http://localhost:5000).

Hoffe das hilft jemandem.

Niko Solihin
quelle
0

In meinem Fall war der Fehler ein fehlerhafter Speicherort für die Datei error_log für den Dienst php5.6-fpm und daher konnte der Dienst php-fpm nicht gestartet werden und nginx konnte keine Verbindung dazu herstellen . Sie finden es in /etc/php/5.6/fpm/php.ini(Sie können 5.6 durch die Version ersetzen, die Sie ausführen).

George Donev
quelle
-1

Gerade heute bin ich auf dieses Problem gestoßen, und für mich war es ein Problem mit geringem Arbeitsspeicher während einer Hochlastperiode. Das Problem wurde behoben, indem der Instanztyp erhöht wurde.

Romesh D. Niriella
quelle
-4

Ich hatte das gleiche Problem und fügte die Listen-Anweisung hinzu

listen 127.0.0.1;

arbeitete für mich.

Interessanterweise habe ich andere Server-Blöcke, die ohne diese ziemlich glücklich laufen!

Rob Ganly
quelle
3
Dies wurde bereits vor drei Jahren beantwortet und akzeptiert.
Sven