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

Я получаю 502 Bad Gateway с nginx при использовании spwn 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)

Ответ 1

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

Перейдите в /etc/php5/fpm/pool.d/www.conf и отредактируйте строку listen = /var/run/php5-fpm.sock до listen = 127.0.0.1:9000

Возможно, это поможет вам.

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

Ответ 2

Ошибка 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? 

Ответ 3

Перейдите к /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.

Ответ 4

Вы должны соответствовать настройкам 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;
}

Совместите эти значения, и вы должны быть настроены.

Ответ 5

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

Выполнить sudo iptables -L -n, вы получите список открытых портов. Если не существует правила Iptables, чтобы открыть порт, обслуживающий fcgi script, вы получите сообщение об ошибке 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.

Ответ 6

изменить

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

к

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

Ответ 7

Когда я сделал 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 и нуждается в изменении.

Ответ 8

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

location / {
  proxy_ignore_client_abort on;
}

Ответ 9

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

Ответ 10

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

sudo htop

или

sudo free -m

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

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

Ответ 11

У меня была такая же проблема при настройке сервера 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

Ответ 12

Если вы на 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

Или

sudo aa-complain nginx
sudo service nginx restart

Посмотрите все, что хорошо работает... затем

sudo aa-logprof

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

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

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

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

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

Ответ 13

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

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