web-dev-qa-db-ja.com

nginx 502悪いゲートウェイ-fastcgiがリッスンしていませんか? (Debian 5)

私はnginxの使用経験がありますが、常にプリインストールされています(VPS.netの事前構成済みイメージを介して)。私はそれが私のために何をするか本当に好きです、そして今私はapt-getでそれを自分のサーバーにインストールしようとしています。これはかなり新しいDebian5インストールです。追加のパッケージはほとんどインストールされていませんが、それらはすべて.debであり、手動でコンパイルしたり、何かおかしなことが起こったりしていません。

Apacheはすでにインストールされていますが、無効にしました。私はapt-getinstall nginxを実行しましたが、それは正常に機能しました。必要に応じて構成を少し変更しましたが、これから説明するのと同じ問題がデフォルトの構成でも発生します。

Nginxのデフォルトのdebianパッケージがfastcgiプロセスを自動的に生成しないことを理解するのに少し時間がかかりました。それはかなりつまらないですが、私はこのスクリプトでそれを行う方法を理解しました。これは多くの異なるWebサイトに投稿されていることがわかりました。

#!/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を介してWebページを表示しようとすると、502の不正なゲートウェイエラーが発生します。

少し混乱した後、127.0.0.1 9000にtelnetしようとしました(fastcgiはポート9000でリッスンしており、nginxはそのポートと通信するように構成されています)が、すぐに接続を閉じます。

これにより、問題はfastcgiにあると思いますが、それをテストするために何ができるかわかりません。処理するデータが供給されていないために接続を閉じているだけかもしれませんが、すぐにを閉じるので、別のことを考えさせられます。

だから...何かアドバイスはありますか?私はそれを理解することはできません。午前1時であることは助けにはなりませんが、私はここで夢中になります!

4
Sean

私のサーバーでは、nginx + fcgiも使用しています。

私の解決策は絶対確実ではありませんが、少なくとも機能します。 /etc/init.d/の下にspawn-fcgiとphp5-cgiを使用するこのスクリプトがあります

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

そして関連するnginxconfはこれです:

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デーモンが時々死ぬという問題がありました。私はこれを5分ごとにcronjobで実行することで、この問題を回避しました。

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
1
fim

私はこれについての専門家ではありません。実際、私は同じ問題を抱えていたのであなたの投稿を見ました。しかし、私はそれを機能させることができたようで、私がしたことは、USERID(www-data)を/etc/init.d/php-fastcgiファイルから現在実行しているユーザーに変更することでした。これで問題が解決しない場合や、これ以上説明できない場合は申し訳ありませんが、関連性がある場合に備えて投稿したいと思いました。

0
Eric

これを試して:

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

その後、変更します

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

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