it-swarm.com.ru

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)

57
Joel Wickard

Я выполнил свой 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

49
fadil

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

Перейдите к /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 и имя группы.

8
techvineet

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

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

7
KJ Prince

Если вы используете сервер 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.

5
tjb

менять

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

в

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

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

location / {
  proxy_ignore_client_abort on;
}
2
Meekohi

Когда я сделал 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, и его необходимо изменить.

2
neubert

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

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

1
h0tw1r3

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

Sudo htop

или же

Sudo free -m

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

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

1
Rav

Если вы используете 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. Я предполагаю, что это как-то связано с порядком записей или каким-либо взаимодействием с Passenger или PHP-Fpm ... У меня не хватило времени, чтобы устранить это, и сейчас я вернулся к Apache. (Apache работает намного лучше, к вашему сведению.) 

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

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

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

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

1
dagelf

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

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

0
PJ Brunet