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ファイルを定義している。
/etc/php-fpm.d/www.confファイルの記述
php-fpmの設定ファイルを確認する。
以下の記述の場合、nginx.confに記述する定義はsockファイルになる。
プロセス間のインとアウトを合わせる
データの入出力をポートで行うか、sockファイルで行うかの違いである。当たり前であるが、入力がポートで出力がsockファイルでは絶対に通信できないため、入出力の方法を合わせる必要がある。
fcgiwrap
perlやpythonなどがfcgiwrapプロセスが処理するため、nginxの定義とfcgiwrapの定義をあわせる必要が有る。 nginxの定義: location ~ \.(pl|sh|py|cgi)$ { fastcgi_pass unix:/run/fcgiwrap.sock; 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に存在した。実際正常にアクセスできた。
アクセスがエラーとなる
定義を熟知したいないため、エラーのが発生した。
理由が不明である。
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定義のパラメータ設定にすることは確認していない。
root定義ではSCRIPT_FILENAMEの記述が、root定義のパス配下のURLに存在するため以下の記述になる。
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
alias定義ではSCRIPT_FILENAMEの記述が、alias定義のパス配下URLに存在するため、$document_root変数を利用するとCGIのパスは不正になる。
よって、以下の記述となる。
fastcgi_param SCRIPT_FILENAME $request_filename;