Назад | Перейти на главную страницу

nginx 502 плохой шлюз - fastcgi не слушает? (Debian 5)

У меня есть опыт работы с nginx, но он всегда был для меня предустановлен (через предварительно настроенный образ VPS.net). Мне очень нравится то, что он делает для меня, и теперь я пытаюсь установить его на свой сервер с помощью apt-get. Это довольно свежая установка Debian 5. У меня установлено несколько дополнительных пакетов, но все они .deb, без ручной компиляции или чего-то безумного.

Apache уже установлен, но я отключил его. Я сделал apt-get install nginx, и это сработало. Немного изменил конфигурацию для моих нужд, хотя та же проблема, которую я собираюсь описать, происходит даже с конфигурацией по умолчанию.

Мне потребовалось время, чтобы понять, что пакет debian по умолчанию для nginx не запускает процессы fastcgi автоматически. Это довольно неубедительно, но я понял, как это сделать с помощью этого скрипта, который я нашел опубликованным на многих разных веб-сайтах:

#!/bin/bash

## ABSOLUTE path to the PHP binary
PHPFCGI="/usr/bin/php5-cgi"

## tcp-port to bind on
FCGIPORT="9000"

## IP to bind on
FCGIADDR="127.0.0.1"

## number of PHP children to spawn
PHP_FCGI_CHILDREN=10

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

Когда я выполняю «ps -A | grep php5-cgi», я вижу, что запущены 10 процессов, которые должны быть готовы к прослушиванию.

Но когда я пытаюсь просмотреть веб-страницу через nginx, я получаю ошибку 502 bad gateway error.

Немного поигравшись, я попытался подключиться к 127.0.0.1 9000 по telnet (fastcgi прослушивает порт 9000, а nginx настроен на взаимодействие с этим портом), но он сразу же закрывает соединение.

Это заставляет меня думать, что проблема в fastcgi, но я не уверен, что я могу сделать, чтобы проверить это. Возможно, он просто закрывает соединение, потому что не получает никаких данных для обработки, но закрывает немедленно так что это заставляет меня думать иначе.

Итак ... какой-нибудь совет? Я не могу этого понять. Не помогает, что сейчас час ночи, но я схожу с ума!

На моем сервере я также использую nginx + fcgi.

Мое решение не является надежным, но, по крайней мере, работает. У меня есть этот скрипт, который использует spawn-fcgi и php5-cgi в /etc/init.d/

#!/bin/bash
PHP_SCRIPT='/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -f /usr/bin/php5-cgi'
RETVAL=0
case "$1" in
    start)
      $PHP_SCRIPT
      RETVAL=$?
  ;;
    stop)
      killall -9 php5-cgi
      RETVAL=$?
  ;;
    restart)
      killall -9 php5-cgi
      $PHP_SCRIPT
      RETVAL=$?
  ;;
    *)
      echo "Usage: php-fastcgi {start|stop|restart}"
      exit 1
  ;;
esac
exit $RETVAL

и соответствующая конфигурация nginx такова:

server {
        location ~ .php$ {
                        fastcgi_pass 127.0.0.1:9000;
                        fastcgi_index index.php;
                        include /etc/nginx/fastcgi.conf;
                        fastcgi_param SCRIPT_FILENAME /var/www/hyperblasted/$fastcgi_script_name;
        }
        ...
}

и fastcgi.conf содержит следующие

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

Надеюсь это поможет :)

PS: С этой настройкой у меня была проблема, когда демон cgi умирал то и дело. Я обошел эту проблему, выполняя это в cronjob каждые 5 минут:

if ps aux | grep 'php5-cgi' | grep -v grep  > /dev/null ; then
        echo "PHP-cgi is runnning !"    
else
        echo "PHP-cgi is down. Starting over..."
        /etc/init.d/php-fcgi start
fi

Попробуй это:

vim /etc/php5/fpm/pool.d/www.conf

а затем изменить

; listen.owner = www-data
; listen.group = www-data

к

listen.owner = www-data
listen.group = www-data

Я вообще не эксперт в этом вопросе. На самом деле я увидел ваш пост, потому что у меня была такая же проблема. Тем не менее, мне кажется, мне удалось заставить его работать, и я изменил USERID (www-data) из файла /etc/init.d/php-fastcgi на пользователя, с которым я работал в данный момент. Извините, если это не поможет или что я не могу объяснить больше, но я подумал, что опубликую его, если это актуально.