Підключення () не вдалося (111: з'єднання відмовлено) під час підключення до верхнього потоку


85

У мене виникають 502 Gatewayпомилки під час доступу до файлу PHP у каталозі ( http://example.com/dev/index.php). Журнали просто говорять так:

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"

Я ніколи цього не відчував. Яке рішення для цього типу 502 Gatewayпомилок?

Це 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/*;
}

1
'Від’єднання відмовлено' означає, що бекенд не слухає порт 9000 або його черга заповнена. Ця проблема пов'язана з бекенд-файлом itsef. Чи можете ви звертатися до telnet localhost 9000? Ви також повинні перевірити свої бекенд і php-журнали.
Андрій

Оновлено мою публікацію. Я не міг передати
телнет

Та сама помилка, з якою я зіткнувся з вами. Цей опис посилань на введення тут може допомогти вам
Tripathi29

Відповіді:


43

Здається, ви не запустили і не налаштували бекенд для Nginx. Почніть php-fpmта додайте nginx.confв httpконтексті наступне :

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

3
Спасибі людина, це спрацювало, я не php-fpmвстановлював. Ура.
MacMac

6
Ти чистий геній. Я не можу повірити, що я прочитав про це 1.0000000 мільйонів посібників, НІКОЛИ не згадує, що ви повинні поставити "прослухати 127.0.0.1", щоб увімкнути бекенд. Ти врятував мене від кошмару !!!

вам слід розглянути можливість використання сокета unix. Перегляньте його netstat -lі перегляньте /var/run/php5-fpm.sock(конфігурація для цього зазвичай знаходиться в /etc/php5/fpm/pool.d/www.conf. fastcgi_pass unix:<socket>
JohannesM

2
у вас буде listen = /var/run/php5-fpm.sockвсередині /etc/php5/fpm/pool.d/www.conf. але ти захочеш listen = 9000і ;listen = /var/run/php5-fpm.sock. якби ти був таким, як я. (а то, можливо, ви могли б послухати мудрий натяк Йоханнеса. Я думаю, що він залишить вас щось подібне fastcgi_pass unix:/var/run/php5-fpm.sock;десь у вашому nginx.conf)
n611x007

З тією ж проблемою, що і з php 7.2. Що ви маєте на увазі, додавши файл у контексті httpd? Це буде додатковий конф-файл у / etc / nginx / sites-available / folder чи що?
PeterKA

47

Ця відповідь призначена лише для тих, хто отримує помилку на зразок цієї:

Підключення () не вдалося (111: з’єднання відмовлено) під час підключення до верхнього потоку, клієнта .... fastcgi: // [:: 1]: 9000

Перепишіть конфігурацію nginx для використання ip, а не dns. Наприклад, 127.0.0.1замість localhostабо видалити псевдонім ipv6 з / etc / hosts.


3
Ти вказав мені в правильному напрямку! Я хоч і користувався просто listen 80добре (і тут є багато прикладів з цим), але я не думав, що це означає як IPv4 ( 127.0.0.1), так і IPv6 ( [::1]) адреси.
glarrain

5
Мені довелося перейти з listen 80 default_serverна listen 0.0.0.0:80.
givanse

Чи можете ви вказати, чому це повинно допомогти?
кайзер

1
У більшості Linux-дистрибутивів ipv6 увімкнено в мережах, але не всі пакети налаштовані для використання ipv6. На мою думку, коли nginx ініціює з'єднання з висхідним потоком, системний резолютор спочатку повертає ipv6 адресу. У php-fpm (centos 7.x) таких налаштувань не було. І більшість посібників пояснює все у версії ipv4, забуваючи про ф'ючерси на ipv6, які слід вимкнути або використати.
Quake1TF

Ого, так [:: 1] - локальний IPv6-адреса! :) Дякую!
lechup

4

Також є такі помилки. Проблема полягала в моєму абстрактному посиланні на два сервери. php-fpmбув лише лістинг до сокета ...

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

1

Була така ж проблема з проксі-запитами на сервер Node, який прослуховує порт 5000. Запити можуть виникати, 200 OKале десь 502 Bad Gatewayвипадковим чином. NGINX показав помилку:

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

Моє рішення:

  1. Встановіть HTTP-сервер вузла для строгого прослуховування ipv4, включивши localhost в якості хоста:server.listen(5000, 'localhost');
  2. Видалено будь-які директиви про прослуховування ipv6 ( listen [::]:80;або listen [::]:443 ssl default_server;).
  3. Змінено блок розташування proxy_pass для використання IP-адрес: proxy_pass http://127.0.0.1:5000(не proxy_pass http://localhost:5000).

Сподіваюся, що це комусь допоможе.


0

У моєму випадку помилка виявилася поганим розташуванням для файлу error_log для служби php5.6-fpm, і тому служба php-fpm не вдалося запустити, і nginx не зміг підключитися до неї . Ви можете знайти його /etc/php/5.6/fpm/php.ini(ви можете замінити 5.6 на запущену версію).


-1

Щойно сьогодні я зіткнувся з цією проблемою, і для мене це було проблемою з низькою пам’яттю під час великого навантаження. Тож вирівнювання типу екземпляра вирішило проблему.


-4

У мене була така ж проблема, і я додав заяву прослуховування

listen 127.0.0.1;

працював на мене.

Цікаво, що у мене є інші серверні блоки, які без цього працюють досить щасливо!


3
На це відповіли і прийняли вже три роки тому.
Свен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.