connect () a échoué (111: connexion refusée) lors de la connexion en amont

85

Je rencontre des 502 Gatewayerreurs lors de l'accès à un fichier PHP dans un répertoire ( http://example.com/dev/index.php). Les journaux dit simplement ceci:

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"

Je n'ai jamais vécu cela auparavant. Quelle est la solution pour ce type d' 502 Gatewayerreur?

C'est le 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
la source
1
"Connexion refusée" signifie que le serveur n'écoute pas le port 9000 ou que sa file d'attente est saturée. Ce problème est lié au backend itsef. Pouvez-vous telnet localhost 9000? Vous devriez également vérifier votre backend et php logs.
Andrew
Mis à jour mon post. Je ne pouvais pas téléphoner à localhost 9000.
MacMac
La même erreur que je vous faisais face, cette description entrer lien ici peut vous aider
Tripathi29

Réponses:

43

On dirait que vous n’avez pas démarré et configuré le backend pour Nginx. Commencez php-fpmet ajoutez les éléments suivants à nginx.conf, dans le httpcontexte:

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;
    }
}
quanta
la source
3
Merci mec, ça a marché, je n'ai pas php-fpminstallé. À votre santé.
MacMac
6
Tu es pur génie. Je ne peux pas croire que 1.0000000 millions de guides que j'ai lus à ce sujet, NOBODY mentionne que vous devez mettre un "listen 127.0.0.1" pour activer le backend. Tu m'as sauvé d'un cauchemar !!!
vous devriez envisager d'utiliser le socket Unix. Affichez-le avec netstat -let voyez pour /var/run/php5-fpm.sock(la configuration correspondante est normalement dans /etc/php5/fpm/pool.d/www.conf. fastcgi_pass unix:<socket>
JohannesM
2
vous aurez à l' listen = /var/run/php5-fpm.sockintérieur /etc/php5/fpm/pool.d/www.conf. mais vous voudrez listen = 9000et ;listen = /var/run/php5-fpm.sock. si vous étiez comme moi (sinon vous pouvez aussi écouter un conseil judicieux de Johannes M. qui, je suppose, vous laisserait quelque chose comme fastcgi_pass unix:/var/run/php5-fpm.sock;quelque part dans votre monde nginx.conf)
n611x007
Avoir le même problème avec PHP 7.2. Qu'entendez-vous par ajouter le fichier dans le contexte httpd? S'agit-il d'un fichier de configuration supplémentaire dans le dossier / etc / nginx / sites-available / ou quoi?
PeterKA
47

Cette réponse est seulement pour ceux qui ont une erreur comme celle-ci:

connect () a échoué (111: connexion refusée) lors de la connexion au client en amont .... fastcgi: // [:: 1]: 9000

Réécrivez votre configuration nginx pour utiliser ip, pas dns. Par exemple, 127.0.0.1au lieu de localhost, supprimez l’alias ipv6 de / etc / hosts.

Quake1TF
la source
3
Tu m'as orienté dans la bonne direction! Je pensais que l’utilisation listen 80était juste (et il y a beaucoup d’exemples avec cela) mais je ne pensais pas que cela impliquait les adresses IPv4 ( 127.0.0.1) et IPv6 ( [::1]).
Glarrain
5
Je devais changer de listen 80 default_serverà listen 0.0.0.0:80.
Envoyé
Pouvez-vous préciser pourquoi cela devrait aider?
Kaiser
1
Ipv6 étant activé dans la mise en réseau de la plupart des distributions linux, tous les paquets configurés pour l’utilisation d’ipv6 ne sont pas configurés. À mon avis, lorsque nginx initie une connexion en amont, le résolveur système renvoie d'abord l'adresse ipv6. Php-fpm (centos 7.x) n'avait pas de tels paramètres de la boîte. Et la plupart des guides expliquent tout dans la version ipv4, en oubliant les futurs ipv6 qui devraient être désactivés ou utilisés.
Quake1TF
Whooah, donc [:: 1] est l'adresse IPhôte de l'hôte local! :) Merci!
Lechup
4

Vous avez des erreurs comme ça aussi. Le problème était mon backend abstrait référençant deux serveurs. php-fpmétait seulement la liste à la prise ...

# 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
la source
1

Avait le même problème avec les requêtes envoyées par proxy à un serveur de nœud qui écoute sur le port 5000. Les requêtes résultent avec 200 OKmais parfois de 502 Bad Gatewaymanière aléatoire. NGINX a montré l'erreur:

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

Ma solution:

  1. Configurez le serveur HTTP du noeud pour qu’il écoute strictement ipv4 en incluant localhost en tant qu’hôte:server.listen(5000, 'localhost');
  2. Suppression des directives d'écoute ipv6 ( listen [::]:80;ou listen [::]:443 ssl default_server;).
  3. Bloc de localisation modifié proxy_pass pour utiliser les adresses IP: proxy_pass http://127.0.0.1:5000(pas proxy_pass http://localhost:5000).

J'espère que ça aide quelqu'un.

Niko Solihin
la source
0

Dans mon cas, l'erreur était un mauvais emplacement pour le fichier error_log du service php5.6-fpm et le service php-fpm ne parvenait pas à démarrer et nginx n'était pas en mesure de s'y connecter . Vous pouvez le trouver dans /etc/php/5.6/fpm/php.ini(vous pouvez remplacer 5.6 par la version que vous utilisez).

George Donev
la source
-1

Aujourd'hui, j'ai rencontré ce problème et pour moi, c'était un problème de mémoire insuffisante pendant une période de charge élevée. Donc, niveler le type d'instance corrige le problème.

Romesh D. Niriella
la source
-4

J'ai eu le même problème et l'ajout de l'instruction d'écoute

listen 127.0.0.1;

a travaillé pour moi.

Chose intéressante, j'ai d'autres blocs de serveurs qui fonctionnent très bien sans cela!

Rob Ganly
la source
3
Cela a déjà été répondu et accepté, il y a trois ans.
Sven