Я получаю 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)
У меня та же проблема. Я выполнил мой 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
Ошибка 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?
Перейдите в /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.
Вы должны соответствовать настройкам 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; }
Совместите эти значения, и вы должны быть настроены.
Если вы используете 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
формы "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 для меня.
изменение
fastcgi_pass unix:/var/run/php-fpm.sock;
в
fastcgi_pass unix:/var/run/php5-fpm.sock;
Когда я сделал 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, и его нужно изменить.
Вы можете сделать nginx игнорировать прерывания клиента, используя:
location / { proxy_ignore_client_abort on; }
Попробуйте отключить модули xcache или apc. Кажется, что проблема с некоторыми версиями заключается в сохранении объектов в переменной сеанса.
Надеюсь, этот совет спасет чужую жизнь. В моем случае проблема заключалась в том, что у меня не хватало памяти, но только немного, было трудно думать об этом. Потратил 3 часа на это. Я рекомендую запустить:
sudo htop
или
sudo free -m
… наряду с запуском проблемных запросов на сервере, чтобы узнать, не закончилась ли ваша память. И если это так, как в моем случае, вам нужно создать файл подкачки (если у вас его уже нет).
Я пошел по этому руководству, чтобы создать файл подкачки на Ubuntu Server 14.04, и он работал отлично: http://www.cyberciti.biz/faq/ubuntu-linux-create-add-swap-file/
У меня была такая же проблема при настройке сервера 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
Если вы находитесь на 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.
Подобная настройка здесь и выглядит так, будто это был просто ошибка в моем коде. В начале моего приложения я искал URL-адрес нарушителя, и это сработало: echo '<html>test</html>'; exit();
echo '<html>test</html>'; exit();
В моем случае получается, что проблема была неинициализированной переменной, которая не удалась при особых обстоятельствах.