#Что означает ошибка
connect() failed (111: Connection refused) while connecting to upstream
«connect() failed (111: Connection refused) while connecting to upstream» в журнале nginx означает, что бэкенд (PHP-FPM, Node, Gunicorn) не принимает подключения на указанном адресе. Посетитель видит 502 Bad Gateway.
Надо выяснить, почему бэкенд не слушает порт или сокет.
Начните с состояния службы.
Бэкенд не принимает соединения: служба не запущена, неверный адрес или порт, либо сокет недоступен. Запустите PHP-FPM или приложение и проверьте адрес в fastcgi_pass/proxy_pass.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Служба не запущенаPHP-FPM. | 502. | Запустите. |
| Неверный адрес/сокетКонфиг. | Нет соединения. | Исправьте. |
| Права на сокетСокет. | Permission denied. | Исправьте. |
| ФайрволПорты. | Блокировка. | Проверьте. |
#Пошаговое решение
- Проверьте статус бэкендаИз строки
connect() failed (111: Connection refused) while connecting to upstreamв/var/log/nginx/error.logвыпишите точный адрес и порт либо UNIX-сокет. Это означает, что соединение с backend было отвергнуто; увеличениеproxy_read_timeoutобычно не помогает. - Проверьте порт или сокетПроверьте реальную службу backend через
systemctl status имя.serviceи журналjournalctl -u имя.service -n 50 --no-pager. Если служба не запущена, найдите причину её падения: неверную конфигурацию, занятый порт, отсутствие прав или OOM. Запускайте только после понимания ошибки.Linux · Терминал (Bash)КомандаНужен sudoСтатус службы PHP-FPM (имя может отличаться: php8.2-fpm).systemctl status php-fpm - Сверьте
fastcgi_passиlistenСравните фактические сокеты/порты вsudo ss -ltnpиsudo ss -lxnpсproxy_pass/fastcgi_passвsudo nginx -T. Например, Nginx может обращаться к устаревшему сокету предыдущей версии PHP-FPM. Исправьте только виртуальный хост нужного сайта, не меняйте весь сервер. - Проверьте права на сокетЕсли backend использует UNIX-сокет, проверьте его реальное расположение, владельца и доступ Nginx (
ls -lиnamei -l).Connection refusedотличается отPermission denied; массовыйchmod 777не нужен, а незапущенная служба может оставлять старый сокет. - Изучите логи PHP-FPMПосле устранения ошибки в журнале PHP-FPM проверьте конфигурацию нужной версии (
php-fpm -tс правильным бинарным файлом), затем применитеnginx -tпри изменении Nginx. Откройте исходный URL и сравните состояние backend, прежде чем считать проблему решённой.
#Проверка службы
systemctl status php8.2-fpm (или gunicorn, node). Перезапустите: sudo systemctl restart php8.2-fpm. Проверьте, что она слушает: ss -tlnp | grep 9000 или файл сокета ls -l /run/php/php8.2-fpm.sock.
#Совпадение адресов
В nginx fastcgi_pass unix:/run/php/php8.2-fpm.sock; должен совпадать с listen в /etc/php/8.2/fpm/pool.d/www.conf. Права на сокет: listen.owner = www-data, listen.group = www-data. Для TCP: 127.0.0.1:9000 в обоих файлах. Для Docker используйте имя сервиса, а не localhost.
#Причины падения
Проверьте логи PHP-FPM /var/log/php8.2-fpm.log и dmesg | grep -i kill (OOM). Увеличьте память, pm.max_children. Проверьте SELinux (setsebool -P httpd_can_network_connect 1). Проверьте брандмауэр между контейнерами.
systemctl status php8.2-fpmss -tlnp | grep -E "9000|php"ls -l /run/php/sudo nginx -t#Как проверить результат
После исправления запросите страницу и посмотрите заголовки: curl -I https://example.com. Код 200 говорит о том, что бэкенд ответил. Проверьте журнал tail -f /var/log/nginx/error.log во время нескольких запросов — записей 111 быть не должно. Проверка напрямую: curl -v http://127.0.0.1:3000 для Node или cgi-fcgi -bind -connect 127.0.0.1:9000 для PHP-FPM. Если ошибка появляется при нагрузке, а не сразу, ищите нехватку памяти (dmesg | grep -i oom) и увеличивайте лимиты воркеров.