タイトル通り、FreeBSDでnginx、FastCGIでPHPを動かす場合。
lighttpd + phpの場合はこちら。
必要なもの。
- nginx
- spawn-fcgi
- php(fastCGI)
概要
nginxは静的コンテンツ向けのwebサーバ。
そのままでは動的コンテンツは扱えない。
どうしても必要なら、よそで動的コンテンツを生成してもらわなければならない。
その仕組みの一つにFastCGIがある。
FastCGIは動的コンテンツの受け渡しのためのインタフェースである。
spawn-fcgiはFastCGIプロセスの管理を行う。
ここで、PHPにはFastCGIサーバモードというのがある。
指定されたポートで待ち受けてリクエストに応えるというもの。
spawn-fcgiとPHPのFastCGIサーバモードを組み合わせれば、PHPのFastCGIインタフェースができあがる。
nginxはPHPコンテンツのリクエストを受けたら、FastCGIを通してphp-cgiにコンテンツを生成してもらう、というわけ。
参考。まあwikipediaなんですけどね。
nginx
http://ja.wikipedia.org/wiki/Nginx
CGI
http://ja.wikipedia.org/wiki/Common_Gateway_Interface
FastCGI
http://ja.wikipedia.org/wiki/FastCGI
インストール
FreeBSDなら、pkgで前章の三つをインストールする。
特に難しいこともないので割愛。
phpはpkgそのままでfastCGI対応になっているので意識する必要なし。
PHPの確認
FastCGI対応かどうかを念のため確認。
/usr/local/bin/php-cgiというのがインストールされていればよい。
念のため-vで確認。
$ php-cgi -v
PHP 5.4.23 (cgi-fcgi) (built: Dec 19 2013 21:06:30)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
spawn-fcgiの設定
spawn_fcgiには特定の設定ファイルがないのでrc.confに直接書き込む。
起動スクリプト/usr/local/rc.d/spawn-fcgiの中身を見るとどういったオプションがあるかが分かる。
nginx、spawn-fcgiの起動設定と一緒にやってしまおう。
下記を/etc/rc.confにひとまず貼りつける。
コメントアウトしてあるのはデフォルト設定。
変えたい箇所があれば#を外して設定する。
注意!
spawn-fcgiのspawnとfcgiの間はハイフン(ダッシュ)"-“であるが、/etc/rc.confでの記載にはアンダースコア”_“にすること。
言い方を変えると、spawn-fcgi_enableなどと書かないこと。
#
# nginx, with PHP FastCGI
#
nginx_enable="YES"
spawn_fcgi_enable="YES"
##spawn_fcgi_app="/usr/local/bin/php-cgi"
##spawn_fcgi_pidfile="/var/run/spawn-fcgi.pid"
##spawn_fcgi_username="www"
##spawn_fcgi_groupname="www"
##spawn_fcgi_bindaddr="127.0.0.1"
##spawn_fcgi_bindport="9000"
##spawn_fcgi_bindsocket_mode="0777"
##spawn_fcgi_children="5"
##spawn_fcgi_max_requests="1000"
##spawn_fcgi_path_env="/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin"
最終的に以下のようにした。
個人用のサーバなのでささやかに。
(冗長なので一部のコメント部分は除く)
#
# nginx, with PHP FastCGI
#
nginx_enable="YES"
spawn_fcgi_enable="YES"
spawn_fcgi_bindport="8000"
spawn_fcgi_children="3"
spawn_fcgi_max_requests="100"
spawn-fcgiの起動確認
serviceコマンドで起動。
$ sudo service spawn-fcgi start
Starting spawn_fcgi.
spawn-fcgi: child spawned successfully: PID: 7486
sockstatで待ち受けポートを確認
$ sockstat -l4
USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS
www php-cgi 7489 0 tcp4 127.0.0.1:8000 *:*
www php-cgi 7488 0 tcp4 127.0.0.1:8000 *:*
www php-cgi 7487 0 tcp4 127.0.0.1:8000 *:*
www php-cgi 7486 0 tcp4 127.0.0.1:8000 *:*
(略)
phpの動作確認
nginxにはサンプルの設定ファイルがついてくる。
それをベースに、たとえば以下のような設定ファイルを作る。
location ~ .php$のブロックが重要。
fastcgi_pass 127.0.0.1:8000;のポートを先のswawn-fcgiと合わせること。
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
root /usr/local/www/php-test;
index index.html;
fastcgi_index index.php;
location ~ \.php$ {
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_pass 127.0.0.1:8000;
}
}
}
/usr/local/www/php-testにindex.htmlをつくる。また、test.phpを作る。
index.html
It works!
test.php
<?php
phpinfo();
?>
nginxをスタートしておき;
$ sudo service nginx restart
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Stopping nginx.
Performing sanity check on nginx configuration:
nginx: the configuration file /usr/local/etc/nginx/nginx.conf syntax is ok
nginx: configuration file /usr/local/etc/nginx/nginx.conf test is successful
Starting nginx.
ブラウザで繋ぐ。
スクリーンショット撮るのが面倒なのでw3mで。
下記の通り/usr/local/www/nginx/index.htmlの内容が表示される。
$ w3m 127.0.0.1
It works!
index.htmlの内容が表示された。
これで通常のwebサーバとしては問題なく動作していることが確認できた。
ではphpの動作確認
PHP infoの結果が表示される。
内部的には、nginxが127.0.0.1:8000で待っているphp-cgiにtest.phpを実行させて、その結果を返している。
$ w3m 127.0.0.1/test.php
PHP Logo
PHP Version 5.4.23
FreeBSD copper 10.0-RC2 FreeBSD 10.0-RC2 #0 r259404: Sun Dec
System 15 08:18:20 UTC 2013 root@snap.freebsd.org:/usr/obj/usr/src/
sys/GENERIC amd64
Build Date Dec 19 2013 21:05:25
(略)
以上