nginxで定義するfastcgi_passについて

スポンサーリンク
Linux
スポンサーリンク

webを検索すると、nginx.confに定義するfastcgi_passの定義がlocalhostのポート番号だったり、sockファイルだったりする。
定義を記述しているのみで理由を説明しているサイトが無い様に思われるための記述です。

スポンサーリンク

nginxのCGI(phpなどの実行)の処理の流れ

nginxがcgi(phpなどの実行)のURLを受信すると、nginxではcgiの処理の機能が無いためnginxに定義されたfastcgi_passに定義された方法でphp-fpmプロセスに処理を依頼する。この依頼をソケット(sockファイル)で行うか、ポート(127.0.0.1:9000)で行うかの設定である。
以下がnginx.confファイルの定義で、sockファイルを定義している。

location ~ \.php$ {
    root           html;
    # fastcgi_pass   127.0.0.1:9000
    fastcgi_pass    unix:/run/php-fpm/www.sock;
}

 

/etc/php-fpm.d/www.confファイルの記述

php-fpmの設定ファイルを確認する。
以下の記述の場合、nginx.confに記述する定義はsockファイルになる。

listen = /run/php-fpm/www.sock
;listen = 127.0.0.1:9000

 

プロセス間のインとアウトを合わせる

データの入出力をポートで行うか、sockファイルで行うかの違いである。
当たり前であるが、入力がポートで出力がsockファイルでは絶対に通信できないため、入出力の方法を合わせる必要がある。
 

fcgiwrap

perlやpythonなどがfcgiwrapプロセスが処理するため、nginxの定義とfcgiwrapの定義をあわせる必要が有る。
nginxの定義:
location ~ \.(pl|sh|py|cgi)$ {
        fastcgi_pass    unix:/run/fcgiwrap.socket;
        include         fastcgi_params;
        fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
        

 

fcgiwrapの定義:
# cat /etc/sysconfig/fcgiwrap
           :
FCGI_PID=/var/run/spawn-fcgi.pid
FCGI_SOCKET=/var/run/fcgiwrap.sock
           :
#
/var/runディレクトリは/runディレクトリのシンボリック・リンクのため違っていても問題はない。

root定義とalias定義のnginx定義

phpシェルを処理するnginx定義

loactiont定義のURLにアクセスされたら、alias定義のパスがデフォルトのパスとなる。
phpで記述したシェルを処理するためphp-fpmにアクセスする場合、以下の設定例がWEBに存在した。実際正常にアクセスできた。

# cat cakephp.conf
location /cakephp/ {
        alias   /usr/local/cakephp/webroot/;
        index   index.php;

        location ~ \.php$ {
                try_files       $uri =404;
                fastcgi_pass    unix:/run/php-fpm/www.sock;
                fastcgi_index   index.php;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include         fastcgi_params;
        }
}
#

 

アクセスがエラーとなる

定義を熟知したいないため、エラーのが発生した。
理由が不明である。

# cat  /var/log/nginx/error.log
          :
FastCGI sent in stderr: "PHP message: PHP Fatal error:  Cannot use 'Object' as class name as it is reserved in /var/www/ksm.mydns.jp/matcha-sns-1.3.9/cake/libs/object.php on line 33" while reading response header from upstream
          :
#

 

alias定義の時の設定

WEBでいろいろ調べたら、違う設定の方法があることが判明した。ただし、alias設定専用化は不明であるが記述して動作を確認すると動作した。

# cat cakephp.conf
location /cakephp/ {
        alias   /usr/local/cakephp/webroot/;
        index   index.php;

        location ~ \.php$ {
                try_files       $uri =404;
                fastcgi_pass    unix:/run/php-fpm/www.sock;
                include         fastcgi_params;
                fastcgi_param   SCRIPT_FILENAME $request_filename;
                fastcgi_param   PATH_INFO       $fastcgi_path_info;
        }
}
#

 

まとめ

2つのプロセス(nginxと php-fpmやfcgiwrap)の同期をとるため、定義を合わせることは当たり前である。
また、root定義の場合とalias定義のパラメータ設定が違うとは思わなかった。
すべてのCGI定義の設定をalias定義のパラメータ設定にすることは確認していない。