xintrea
Новичок
[Nginx][FastCGI]
PHP:
Классика жанра - ошибка "502 Bad Gateway"[/b]
Здравствуйте!
Пытаюсь настроить Nginx на виртуальном хостинге так, чтобы выполнялись php-стрипты. Статика отдается нормально, а результат работы php-нет.
При запросе php-скрипта, в браузере показывается ошибка:
[code]502 Bad Gateway[/code]
В логе появляется строка:
[code][error] 9599#0: *12 recv() failed (104: Connection reset by peer)
while reading response header from upstream,
client: 109.165.44.169,
server: webhamster.ru,
request: "GET /phpinfo.php HTTP/1.1",
upstream: "fastcgi://127.0.0.1:8888",
host: "webhamster.ru"[/code]
Последовательность моих действий по настройке:
[b]1[/b]. Установил php-cgi командой
[code]apt-get install php-cgi[/code]
[b]2[/b]. Сделал скрипт start_php_fcgi.sh для запуска PHP в режиме FastCGI сервера:
[code]#!/bin/bash
## ABSOLUTE path to the PHP binary
PHPFCGI="/usr/bin/php-cgi"
## tcp-port to bind on
FCGIPORT="8888"
## IP to bind on
FCGIADDR="127.0.0.1"
## number of PHP children to spawn
PHP_FCGI_CHILDREN=5
## number of request before php-process will be restarted
PHP_FCGI_MAX_REQUESTS=1000
# allowed environment variables sperated by spaces
ALLOWED_ENV="ORACLE_HOME PATH USER"
## if this script is run as root switch to the following user
USERID=www-data
################## no config below this line
if test x$PHP_FCGI_CHILDREN = x; then
PHP_FCGI_CHILDREN=5
fi
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_CHILDREN"
ALLOWED_ENV="$ALLOWED_ENV PHP_FCGI_MAX_REQUESTS"
ALLOWED_ENV="$ALLOWED_ENV FCGI_WEB_SERVER_ADDRS"
if test x$UID = x0; then
EX="/bin/su -m -c \"$PHPFCGI -q -b $FCGIADDR:$FCGIPORT\" $USERID"
else
EX="$PHPFCGI -b $FCGIADDR:$FCGIPORT"
fi
echo $EX
# copy the allowed environment variables
E=
for i in $ALLOWED_ENV; do
E="$E $i=${!i}"
done
# clean environment and set up a new one
nohup env - $E sh -c "$EX" &> /dev/null &[/code]
[b]3[/b]. Запускаю этот скрипт (start_php_fcgi.sh)
[b]4[/b]. Проверяю, работает ли PHP как сервер. Да, работает:
[code]# ps aux | grep php
root 9665 pts/1 S sh -c /bin/su -m -c "/usr/bin/php-cgi -q -b 127.0.0.1:8888" www-data
www-data 9666 pts/1 S /bin/su -m -c /usr/bin/php-cgi -q -b 127.0.0.1:8888 www-data
www-data 9667 pts/1 S sh -c /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data 9668 ? Ss /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data 9669 ? S /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data 9670 ? S /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data 9671 ? S /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data 9672 ? S /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data 9673 ? S /usr/bin/php-cgi -q -b 127.0.0.1:8888
root 9727 pts/1 S+ grep php[/code]
[b]5[/b]. Проверяю, слушает ли PHP действительно 8888 порт. Да, слушает:
[code]# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 9598/nginx
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1417/sshd
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 9668/php-cgi
tcp6 0 0 :::22 :::* LISTEN 1417/sshd
udp 0 0 594.527.568.513:123 0.0.0.0:* 1332/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 1332/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 1332/ntpd
udp6 0 0 fe80::216:3eff:fe1b:123 :::* 1332/ntpd
udp6 0 0 ::1:123 :::* 1332/ntpd
udp6 0 0 :::123 :::* 1332/ntpd
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path[/code]
[b]6[/b]. Прописываю в следущую конфигурацию Nginx:
[code]server {
listen 80;
server_name webhamster.ru;
error_log /var/log/nginx/webhamster.warn.log warn;
access_log /var/log/nginx/webhamster.access.log;
root /var/www/webhamster;
charset utf-8;
location / {
root /var/www/webhamster;
index index.html index.htm;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:8888;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
# include fastcgi_params;
}
}[/code]
[b]7[/b]. Перезапускаю Nginx:
[code]# /etc/init.d/nginx restart
Restarting nginx: nginx.[/code]
[b]8[/b]. Создаю в каталоге /var/www/webhamster два файла: hello.html и phpinfo.php.
В hello.html прописываю "Hello" - и при открытии URL "webhamster.ru/hello.html" я вижу эту надпись.
В phpinfo.php прописываю "<?php phpinfo(); ?>" - и при открытии URL "webhamster.ru/phpinfo.php" получаю ошибку "502 Bad Gateway". Установил права на этот файл 777, ошибка осталась.
[b]9[/b]. На просторах интернета узнал, что на VDS хостингах не всегда можно обращаться к IP 127.0.0.1 - это как-то связано с особенностью виртуализации. И нужно работать с IP хоста. Поэтому я дал команду ifconfig, и узнал IP - 94.127.68.213.
В скрипте, запускающем PHP, я вместо 127.0.0.1 прописал:
[code]FCGIADDR="94.127.68.213"[/code]
А так же в конфигурации Nginx прописал вместо 127.0.0.1 прописал:
[code]fastcgi_pass 94.127.68.213:8888;[/code]
Перезапустил PHP и Nginx, проверил процессы, проверил что PHP слушает порт. Однако при открытии URL "webhamster.ru/phpinfo.php" получаю все ту же ошибку: "502 Bad Gateway".
[b]Вопрос[/b]: что еще где нужно крутануть, чтобы Nginx начал нормально коннектиться к серверу PHP Fast CGI? Что где проверить? Как узнать - это Nginx цепляется "не туда", или всетаки Nginx цепляется туда, но PHP не хочет отвечать Nginx?
[i]fixxxer: заменил твой IP на смешную фигню. Не надо так делать, когда php-fcgi торчит наружу, тут много кулхацкеров ;) [/i]
[i]xintrea: Спасибо :). Хотя, php всеравно не работает. Кроме того, делаешь ping webhamster.ru и IP у тебя в кармане. Я в конфигах поправил уже на 127.0.0.1. Заменил в сообщении смешную фигню обратно на человеческий IP.[/i]