ошибка connect () (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/*;
}
MacMac
источник
1
«Отказ в соединении» означает, что сервер не прослушивает порт 9000 или его очередь заполнена. Эта проблема связана с серверной частью. Вы можете телнет localhost 9000? Вы также должны проверить свои логи и php логи.
Андрей
Обновил мой пост. Я не мог telnet к localhost 9000.
MacMac
Та же самая ошибка, с которой я столкнулся, это описание ссылки здесь может помочь вам
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. если бы вы были как я. (или, в качестве альтернативы, вы могли бы услышать мудрый намек от JohannesM. который, я полагаю, оставил бы вас с чем-то вроде fastcgi_pass unix:/var/run/php5-fpm.sock;вас nginx.conf)
n611x007
Имея ту же проблему с php 7.2. Что вы подразумеваете под добавлением файла в контексте httpd? Это будет дополнительный файл conf в папке / etc / nginx / sites-available / или как?
PeterKA
47

Этот ответ только для тех, кто получает такую ​​ошибку:

Ошибка connect () (111: соединение отклонено) при подключении к восходящему каналу, клиенту .... fastcgi: // [:: 1]: 9000

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

Quake1TF
источник
3
Вы указали мой в правильном направлении! Я хотя и использовал просто, listen 80было хорошо (и есть много примеров с этим), но я не думал, что это подразумевает адреса как IPv4 ( 127.0.0.1), так и IPv6 ( [::1]).
гларрейн
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-адрес localhost! :) Спасибо!
Лечуп
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
На это уже отвечали и принимали уже три года назад.
Свен