nginx 502 плохой шлюз

Я получаю 502 Bad Gateway с nginx при использовании spawn fcgi для создания php5-cgi.

Я использую это, чтобы охватить экземпляр при запуске сервера, используя следующую строку в rc.local

/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid

предположительно, я получаю сообщение об ошибке, потому что spawn-fcgi / php5-cgi умирает, и там больше нечего слушать для синтаксического анализа php.

У меня нет ничего в журналах, которые я могу видеть где угодно, у меня нет идей (и я новичок в этой настройке с nginx)


person Joel Wickard    schedule 23.11.2010    source источник
comment
Во-первых, не сдавайтесь! nginx - замечательная программа. Попробуйте с php-fpm. Не пропустите /etc/php5/fpm каталог с настройками внутри и обратите внимание на копию php.ini, которая может переопределить вашу собственную конфигурацию php.ini ... Настройте журналы, чтобы вы могли посмотреть, если это не удается.   -  person Breaking not so bad    schedule 23.11.2010
comment
Попробуйте войти на сервер как root и введите /usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f /usr/bin/php5-cgi -P /var/run/fastcgi-php.pid в командной строке. (Это та же строка, что и в вашем rc.local.) Получаете ли вы сообщения об ошибках?   -  person kijin    schedule 23.11.2010
comment
Я считаю, что этот вопрос был бы более уместным (и получить больше ответов) на serverfault.com.   -  person netcoder    schedule 23.11.2010
comment
Спасибо, netcoder, это хорошая идея. Я перенесу это туда.   -  person Joel Wickard    schedule 23.11.2010
comment
Это дает вам какие-нибудь подсказки? tail /var/log/nginx/error.log   -  person e.thompsy    schedule 16.07.2014


Ответы (14)


Я выполнил свой localhost, и на странице отобразилось сообщение 502 bad gateway. Это мне помогло:

  1. Изменить /etc/php5/fpm/pool.d/www.conf
  2. Измените listen = /var/run/php5-fpm.sock на listen = 127.0.0.1:9000
  3. Убедитесь, что местоположение правильно установлено в nginx.conf .
  4. Беги sudo service php5-fpm restart

Может, это тебе поможет.

Источник: http://wildlyinaccurate.com/solving-502-bad-gateway-with-nginx-php-fpm

person fadil    schedule 11.05.2013
comment
Как говорится в статье, после этого запустите sudo service php5-fpm restart. - person mgold; 10.02.2015
comment
Забавно, насколько действительно разные ситуации, совершенно одинаковые, могут помочь. - person Dmitry Verhoturov; 31.03.2015
comment
Для всех, кто пытается настроить фабрикатор с помощью nginx, это поможет! - person almel; 24.08.2015
comment
sudo service php5-fpm restart ------ СПАСИБО - person Andy; 07.05.2019
comment
пункт 1 помог мне найти правильную версию fpm, я пытался с php7.0-fpm.sock , но на самом деле это было php7.2-fpm.sock в моем случае, так как версия была 7.2, а не 7.0, я игнорировал это, поскольку установка по умолчанию nginx имела эту версию, указанную в комментариях, и я думал, что nginx, должно быть, настроил это из моей установленной версии php, вздох! - person Rakibul Haq; 02.12.2019

Ошибка 502 возникает из-за того, что nginx не может переключиться на php5-cgi. Вы можете попробовать перенастроить php5-cgi для использования сокетов unix вместо tcp .. затем настройте конфигурацию сервера так, чтобы он указывал на сокет вместо tcp ...

ps auxww | grep php5-cgi #-- is the process running?  
netstat -an | grep 9000 # is the port open? 
person sdolgy    schedule 15.04.2011
comment
Что происходит, если порт не открыт? - person Adrian Garner; 30.10.2012
comment
В моем случае служба запускается, но в результате _1 _ ???? - person shgnInc; 05.03.2014
comment
Какой порт у вас настроен для работы? 9000 был основан на аргументе командной строки выше (-p 9000) - person sdolgy; 06.03.2014
comment
У меня та же проблема, что и у @shgnInc, у меня 4 сайта, первые 3 работают на 9000 - 9002, но 4-й сайт настроен в nginx и php-fpm conf файлы для использования порта 9003, и я перезапустил обе службы, но ничего не вижу для netstat -an | grep 9003 - person Pete; 20.06.2014
comment
как переключаться между конфигурацией сокета или TCP? - person Hayden Thring; 20.01.2015
comment
У меня была такая же проблема, я пытаюсь переключить версию PHP на другую и вернуться к моей старой. Оно работает.. - person Moxet Khan; 08.08.2017

Перейдите к /etc/php5/fpm/pool.d/www.conf и, если вы используете сокеты или эта строка раскомментирована

listen = /var/run/php5-fpm.sock

Также установите несколько других значений: -

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

Не забудьте перезапустить php-fpm и nginx. Убедитесь, что вы используете одного и того же владельца nginx и имя группы.

person techvineet    schedule 30.06.2014

Вы должны согласовать настройки PHP-FPM и Nginx для связи через сокеты или TCP.

Итак, перейдите к /etc/php5/fpm/pool.d/www.conf и найдите эту строку:

listen = /var/run/php5-fpm.sock

Затем перейдите к /etc/nginx/nginx.conf

Ищите это:

upstream php {
    server unix:/var/run/php5-fpm.socket;
}

Сопоставьте эти значения, и все будет готово.

person Ken Prince    schedule 30.06.2014
comment
Да, у меня была аналогичная проблема при попытке запустить приложение Silex. В документации предлагается настроить vhost с помощью пути /var/run/php-fpm/www.sock, но в моей конфигурации php-fpm он был настроен на прослушивание /var/run/php5-fpm.sock, поэтому мне также пришлось поставить то же значение для конфигурации vhost. - person AbstractVoid; 06.04.2015

Если вы используете Linux-сервер, убедитесь, что ваша конфигурация IPTABLES верна.

Выполните sudo iptables -L -n, вы получите список открытых портов. Если нет правила Iptables для открытия порта, обслуживающего сценарий fcgi, вы получите ошибку 502. Правило Iptables, открывающее правильный порт, должно быть указано перед любым правилом, которое категорически отклоняет все пакеты (то есть правилом формы "REJECT ALL -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable или аналогичным).

В моей конфигурации, чтобы правильно открыть порт, мне пришлось выполнить эту команду (предположим, что мой сервер fcgi работает на порту 4567):

sudo iptables -I INPUT 1 -p tcp --dport 4567 -j ACCEPT

ВНИМАНИЕ: это откроет порт 4567 для всего мира.

Так что лучше было бы сделать что-то вроде этого:

   sudo iptables-save >> backup.iptables
   sudo iptables -D INPUT 1 #Delete the previously entered rule
   sudo iptables -I INPUT 1 -p tcp --dport 8080 -s localhost -j ACCEPT # Add new rule

Это устранило ошибку 502 для меня.

person tjb    schedule 08.03.2012

изменение

fastcgi_pass    unix:/var/run/php-fpm.sock;

to

fastcgi_pass    unix:/var/run/php5-fpm.sock;
person user2816137    schedule 10.10.2013

Когда я сделал sudo /etc/init.d/php-fpm start, я получил следующую ошибку:

Starting php-fpm: [28-Mar-2013 16:18:16] ERROR: [pool www] cannot get uid for user 'apache'

Я предполагаю, что /etc/php-fpm.d/www.conf необходимо знать пользователя, от имени которого работает веб-сервер, и предполагает, что это apache, тогда как для nginx это на самом деле nginx, и его нужно изменить.

person neubert    schedule 28.03.2013

Вы можете заставить nginx игнорировать прерывания клиента, используя:

location / {
  proxy_ignore_client_abort on;
}
person Meekohi    schedule 27.05.2013
comment
Мне любопытно понять ваш ответ, поскольку он может быть связан с проблемой, с которой я столкнулся (в соответствии со шлюзом 502) - Что такое прерывание клиента? Я имею в виду, о каком клиенте вы говорите, php? - person stefgosselin; 03.09.2018
comment
Привет, @stefgosselin, мое (ограниченное) понимание состоит в том, что proxy_ignore_client_abort on заставляет nginx отслеживать каждое соединение (любой, кто подключается к nginx, является клиентом) и отслеживать, закрывается ли оно без отправки запроса. Это некорректное поведение со стороны клиента, но некоторые все равно так поступают. - person Meekohi; 05.09.2018

У меня была такая же проблема при настройке сервера Ubuntu. Оказывается, у меня возникла проблема из-за неправильных разрешений для файла сокета.

Если у вас возникла проблема из-за проблемы с разрешением, вы можете раскомментировать следующие строки из: /etc/php5/fpm/pool.d/www.conf

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

В качестве альтернативы, хотя я бы не рекомендовал, вы можете предоставить разрешения на чтение и запись всем группам с помощью следующей команды.

sudo chmod go+rw /var/run/php5-fpm.sock
person haris    schedule 24.08.2016

Попробуйте отключить модули xcache или apc. Кажется, что проблема с некоторыми версиями заключается в сохранении объектов в переменной сеанса.

person h0tw1r3    schedule 26.08.2014

Надеюсь, этот совет спасет чью-то жизнь. В моем случае проблема заключалась в том, что у меня закончилась память, но совсем немного, было трудно об этом думать. Потрачено на это 3 часа. Рекомендую запустить:

sudo htop

or

sudo free -m

... наряду с выполнением проблемных запросов на сервере, чтобы увидеть, не закончилась ли ваша память. И если это так, как в моем случае, вам нужно создать файл подкачки (если у вас его еще нет).

Я следовал этому руководству по созданию файла подкачки на Ubuntu Server 14.04, и он работал нормально: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/

person Rav    schedule 12.02.2015

Если вы используете Ubuntu, и все вышеперечисленное не помогло вам, скорее всего, виноват AppArmor.

Вот хорошее руководство, как это исправить: https://www.digitalocean.com/community/tutorials/how-to-create-an-apparmor-profile-for-nginx-on-ubuntu-14-04

Короче:

vi /etc/apparmor.d/nginx

Or

sudo aa-complain nginx
sudo service nginx restart

Посмотрите, как все работает хорошо ... тогда

sudo aa-logprof

У меня все еще были проблемы с тем, что Nginx не мог читать error.log, хотя у него были все возможные разрешения, в том числе в Apparomor. Я предполагаю, что это как-то связано с порядком записей или каким-то взаимодействием с Passenger или PHP-Fpm ... У меня не хватило времени, чтобы устранить эту неполадку, и сейчас я вернулся к Apache. (Apache тоже работает намного лучше, к вашему сведению.)

AppArmor просто позволяет Nginx делать все, что захочет, если вы просто удалите профиль:

 rm /etc/apparmor.d/nginx
 service apparmor reload

Шокирующе, но неудивительно, что многие сообщения об исправлении ошибок Nginx прибегают к полному отключению SELinux или удалению AppArmor. Это плохая идея, потому что вы теряете защиту от большого количества программ. Простое удаление профиля Nginx - лучший способ устранить неполадки в файлах конфигурации. Как только вы узнаете, что проблема не в ваших файлах конфигурации Nginx, вы можете потратить время на создание правильного профиля AppArmor.

Без профиля AppArmor, особенно если вы запускаете что-то вроде Passenger, я даю вашему серверу около месяца, чтобы получить бэкдор.

person dagelf    schedule 11.01.2017

Для меня ошибка была в файле по умолчанию Nginx, расположенном в / etc / nginx / sites-available / default.

Я заметил, что используемая версия php-fpm была 7.0, а версия php, которую я скачал, была 7.2. Я просто изменил версию на 7.2, и она сработала.

fastcgi_pass unix: / var / run / php / php7.0-fpm .sock;

person codepeaker    schedule 23.10.2019

Подобная настройка здесь и выглядит так, будто это просто ошибка в моем коде. В начале своего приложения я искал неправильный URL, и это сработало: echo '<html>test</html>'; exit();

В моем случае проблема заключалась в неинициализированной переменной, которая не работала только при определенных обстоятельствах.

person PJ Brunet    schedule 10.02.2012