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ファイルを定義している。
1 2 3 4 5 |
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ファイルになる。
1 2 |
listen = /run/php-fpm/www.sock ;listen = 127.0.0.1:9000 |
プロセス間のインとアウトを合わせる
データの入出力をポートで行うか、sockファイルで行うかの違いである。
当たり前であるが、入力がポートで出力がsockファイルでは絶対に通信できないため、入出力の方法を合わせる必要がある。
当たり前であるが、入力がポートで出力がsockファイルでは絶対に通信できないため、入出力の方法を合わせる必要がある。
fcgiwrap
perlやpythonなどがfcgiwrapプロセスが処理するため、nginxの定義とfcgiwrapの定義をあわせる必要が有る。
nginxの定義:
1 2 3 4 5 |
location ~ \.(pl|sh|py|cgi)$ { fastcgi_pass unix:/run/fcgiwrap.socket; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } |
fcgiwrapの定義:
1 2 3 4 5 6 |
# 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定義とroot定義はディレクトリ定義がリンクしていると思われる。
よって、phpで記述したシェルを処理するためphp-fpmにアクセスすつ場合、以下の以下の設定する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 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; } } # |
アクセスがエラーとなる
定義を熟知したいないため、エラーのが発生した。
理由が不明である。
1 2 3 4 5 |
# 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設定専用化は不明であるが記述して動作を確認すると動作した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# 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定義のパラメータ設定にすることは確認していない。