connect () nie powiodło się (111: odmowa połączenia) podczas łączenia do wysyłania

85

Występują 502 Gatewaybłędy podczas uzyskiwania dostępu do pliku PHP w katalogu ( http://example.com/dev/index.php). Dzienniki po prostu mówią:

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"

Nigdy wcześniej tego nie doświadczyłem. Jakie jest rozwiązanie tego rodzaju 502 Gatewaybłędu?

To jest 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
źródło
1
„Odmowa połączenia” oznacza, że ​​backend nie nasłuchuje portu 9000 lub jego kolejka jest zapełniona. Ten problem związany jest z backendem itsef. Czy jesteś w stanie telnet localhost 9000? Powinieneś także sprawdzić dzienniki backend i php.
Andrew
Zaktualizowano mój post. Nie mogłem telnet do localhost 9000.
MacMac
Ten sam błąd byłem tyłem do siebie, to podaj Opis Link tutaj może pomóc
Tripathi29

Odpowiedzi:

43

Wygląda na to, że nie uruchomiłeś i nie skonfigurowałeś backendu dla Nginx. Uruchom php-fpmi dodaj następujące elementy nginx.confw httpkontekście:

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;
    }
}
kwanty
źródło
3
Dzięki człowieku, zadziałało, nie php-fpmzainstalowałem. Twoje zdrowie.
MacMac,
6
Jesteś geniuszem. Nie mogę uwierzyć, że 1,0000000 milionów przewodników, które o tym czytałem, NIKT nie wspomina, że ​​musisz włączyć „Listen 127.0.0.1”, aby włączyć backend. Uratowałeś mnie przed koszmarem !!!
powinieneś rozważyć użycie gniazda unix. Wyświetl go za pomocą netstat -li sprawdź /var/run/php5-fpm.sock(konfiguracja tego jest zwykle w /etc/php5/fpm/pool.d/www.conf. fastcgi_pass unix:<socket>
JohannesM
2
będziesz miał w listen = /var/run/php5-fpm.sockśrodku /etc/php5/fpm/pool.d/www.conf. ale będziesz chciał listen = 9000i ;listen = /var/run/php5-fpm.sock. gdybyś był taki jak ja. (lub alternatywnie możesz posłuchać mądrej wskazówki Johannesa fastcgi_pass unix:/var/run/php5-fpm.sock;nginx.conf
M.,
Ten sam problem z php 7.2. Co rozumiesz przez dodanie pliku w kontekście httpd? Czy byłby to dodatkowy plik conf w folderze / etc / nginx / sites-available / / czy co?
PeterKA
47

Ta odpowiedź jest tylko dla tych, którzy dostają taki błąd:

connect () nie powiodło się (111: odmowa połączenia) podczas łączenia się z klientem, klientem .... fastcgi: // [:: 1]: 9000

Przepisz swoją konfigurację nginx, aby używała ip, a nie dns. Na przykład 127.0.0.1zamiast localhostlub usuń alias ipv6 z / etc / hosts.

Quake1TF
źródło
3
Wskazałeś mi właściwy kierunek! Myślałem, że użycie listen 80było w porządku (i jest wiele przykładów z tym), ale nie sądziłem, że sugeruje to zarówno adresy IPv4 ( 127.0.0.1), jak i IPv6 ( [::1]).
glarrain
5
Musiałem zmienić z listen 80 default_serverna listen 0.0.0.0:80.
ofiarować
Czy możesz wskazać, dlaczego to powinno pomóc?
kaiser
1
Ponieważ większość dystrybucji Linuksa ma włączony ipv6 w sieci, ale nie wszystkie pakiety skonfigurowane do użycia ipv6. Moim zdaniem, kiedy nginx inicjuje połączenie z wysyłaniem, system tłumaczący najpierw zwraca adres ipv6. Php-fpm (centos 7.x) nie miał takich ustawień z pudełka. I większość przewodników wyjaśnia wszystko w wersji ipv4, zapominając o przyszłościach ipv6, które powinny być wyłączone lub używane.
Quake1TF
Whooah, więc [:: 1] to adres IPv6 hosta lokalnego! :) Dzięki!
lechup
4

Mam też takie błędy. Problemem był mój abstrakcyjny backend odwołujący się do dwóch serwerów. php-fpmwyświetlał tylko informacje o gnieździe ...

# 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
źródło
1

Miał ten sam problem z żądaniami proxy do serwera Node nasłuchującego na porcie 5000. Żądania byłyby generowane losowo, 200 OKale czasami 502 Bad Gateway. NGINX pokazał błąd:

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

Moje rozwiązanie:

  1. Ustaw węzłowy serwer HTTP, aby ściśle nasłuchiwał IPv4, włączając hosta lokalnego jako hosta:server.listen(5000, 'localhost');
  2. Usunięto wszystkie instrukcje nasłuchiwania ipv6 ( listen [::]:80;lub listen [::]:443 ssl default_server;).
  3. Zmieniono blok lokalizacji proxy_pass na używanie adresów IP: proxy_pass http://127.0.0.1:5000(nie proxy_pass http://localhost:5000).

Mam nadzieję, że to komuś pomoże.

Niko Solihin
źródło
0

W moim przypadku błąd był złym położeniem pliku dziennika błędów dla usługi php5.6-fpm, a zatem usługa php-fpm nie uruchomiła się i nginx nie mógł się z nią połączyć . Możesz go znaleźć w /etc/php/5.6/fpm/php.ini(możesz zastąpić 5.6 wersją, którą uruchamiasz).

George Donev
źródło
-1

Właśnie dzisiaj natknąłem się na ten problem i dla mnie był to problem małej pamięci w okresie dużego obciążenia. Tak więc podniesienie poziomu instancji naprawiło problem.

Romesh D. Niriella
źródło
-4

Miałem ten sam problem i dodałem instrukcję Listen

listen 127.0.0.1;

pracował dla mnie.

Co ciekawe, mam inne bloki serwerów, które bez tego działają całkiem szczęśliwie!

Rob Ganly
źródło
3
Odpowiedzi na to pytania zostały już zaakceptowane trzy lata temu.
Sven