LINUX.ORG.RU
решено ФорумAdmin

[Nginx][FastCGI][PHP] Классика жанра - ошибка «502 Bad Gateway»


0

0

Здравствуйте!


Пытаюсь настроить Nginx на виртуальном хостинге так, чтобы выполнялись php-стрипты. Статика отдается нормально, а результат работы php-нет.

При запросе php-скрипта, в браузере показывается ошибка:

502 Bad Gateway

В логе появляется строка:

[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"


Последовательность моих действий по настройке:


1. Установил php-cgi командой

apt-get install php-cgi


2. Сделал скрипт start_php_fcgi.sh для запуска PHP в режиме FastCGI сервера:

#!/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 &


3. Запускаю этот скрипт (start_php_fcgi.sh)


4. Проверяю, работает ли PHP как сервер. Да, работает:

# ps aux | grep php
root      9665  0.0  0.7   1876   496 pts/1    S    16:45   0:00 sh -c /bin/su -m -c "/usr/bin/php-cgi -q -b 127.0.0.1:8888" www-data
www-data  9666  0.0  1.7   2620  1144 pts/1    S    16:45   0:00 /bin/su -m -c /usr/bin/php-cgi -q -b 127.0.0.1:8888 www-data
www-data  9667  0.0  0.7   1876   504 pts/1    S    16:45   0:00 sh -c /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data  9668  0.0  6.6  14372  4380 ?        Ss   16:45   0:00 /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data  9669  0.0  2.9  14372  1936 ?        S    16:45   0:00 /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data  9670  0.0  2.9  14372  1936 ?        S    16:45   0:00 /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data  9671  0.0  2.9  14372  1936 ?        S    16:45   0:00 /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data  9672  0.0  2.9  14372  1936 ?        S    16:45   0:00 /usr/bin/php-cgi -q -b 127.0.0.1:8888
www-data  9673  0.0  2.9  14372  1936 ?        S    16:45   0:00 /usr/bin/php-cgi -q -b 127.0.0.1:8888
root      9727  0.0  1.2   3340   792 pts/1    S+   17:01   0:00 grep php


5. Проверяю, слушает ли PHP действительно 8888 порт. Да, слушает:

# 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 94.127.68.213: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


6. Прописываю в следущую конфигурацию Nginx:

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;
        }
}


7. Перезапускаю Nginx:

# /etc/init.d/nginx restart
Restarting nginx: nginx.


8. Создаю в каталоге /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, ошибка осталась.


9. На просторах интернета узнал, что на VDS хостингах не всегда можно обращаться к IP 127.0.0.1 - это как-то связано с особенностью виртуализации. И нужно работать с IP хоста. Поэтому я дал команду ifconfig, и узнал IP - 94.127.68.213.

В скрипте, запускающем PHP, я вместо 127.0.0.1 прописал:

FCGIADDR="94.127.68.213"

А так же в конфигурации Nginx прописал вместо 127.0.0.1 прописал:

fastcgi_pass   94.127.68.213:8888;

Перезапустил PHP и Nginx, проверил процессы, проверил что PHP слушает порт. Однако при открытии URL «webhamster.ru/phpinfo.php» получаю все ту же ошибку: «502 Bad Gateway».


Вопрос: что еще где нужно крутануть, чтобы Nginx начал нормально коннектиться к серверу PHP Fast CGI? Что где проверить? Как узнать - это Nginx цепляется «не туда», или всетаки Nginx цепляется туда, но PHP не хочет отвечать Nginx?

а зачем # include fastcgi_params; закоментировали?

тогда уж так

        location ~ \.php$ { 
                fastcgi_pass   127.0.0.1:8888; 
                fastcgi_index  index.php; 
                include fastcgi_params; 
                fastcgi_param  SCRIPT_FILENAME $fastcgi_script_name;                 
         }
hizel ★★★★★ ()
Ответ на: комментарий от hizel

> а зачем # include fastcgi_params; закоментировали?

Да в интернете у кого написана, у кого не написана эта строчка. В Debian и Ubuntu она по-умолчанию вообще с ошибкой прописана - «includefastcgi_params». Решил закомментировать.

Но от нее ничего не зависит - хоть комментируй, хоть раскомментируй, хоть вверх пемещай, всеравно остается ошибка «502 Bad Gateway».

xintrea ()
Ответ на: комментарий от hizel

Все, вопрос закрыт.

1. Выяснил, что можно работать с IP 127.0.0.1, коль netstat показывает прослушку на 127.0.0.1. Т.е., реальный IP-шник прописывать ненужно.

2. Решение следущее.

В скрипте, запускающем PHP Fast CGI, надо было добавить установку переменной FCGI_WEB_SERVER_ADDRS, вот так:

## IP to bind on
FCGIADDR="127.0.0.1"
FCGI_WEB_SERVER_ADDRS="127.0.0.1"
xintrea ()
Ответ на: комментарий от xintrea

Solved.

Все, вопрос закрыт.

Поставь галочку, что вопрос решён. Возможно это поможет кому-то в поиске.

Camel ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.