apacheは吊るしのFreeBSD pkgでphpを使えない。
10.0-BETA1にして曲がりなりにもpkgが普通に使えるようになって、あまりの便利さに感動し、追加ソフトウェアはすべてpkgにしようと決めたのだが。
apacheとphpでいきなり壁に当たりました。
apacheをpkgでインストールすると、phpのモジュールが付いてこないのである。
phpモジュールが欲しいなら、apacheをportsからインストールしないといけない。
もちろん、pkgngはportsと一緒に使えるよう考えて作られている。
apacheだけportsからインストールしたって何の問題もない。
ただ、あの巨大な/usr/portsディレクトリをメンテしていくのが億劫なわけですよ。
ならばよろしいapacheはもう捨てよう。
たぶんまた、吊るしのpkgで使えないソフトウェアが出てくると思うが、その時はその時考えよう。
nginx, lighttpdのどちらがよいか。
apacheの代替といってすぐに思い浮かぶのはnginxとlighttpdである。
“nginx lighttpd comparison"などとググってみると、いくつかのもまとめがヒットする。
http://www.wikivs.com/wiki/Lighttpd_vs_nginx
http://wiki.dreamhost.com/Web_Server_Performance_Comparison
軽く速く柔軟な設定が可能という点では同じだが、概観したところnginx優勢のようである。
また、lighttpdには品質面で気になる点もある。
どうも長い間放置されているメモリリークがあるようだ。
ただlighttpdの設定のほうが分かりやすい、というのは皆の認めるところらしい。
メモリリークは心配だが、さっさとhttpサーバを設定したいのでlighttpdを選択。
以下、lighttpdでphpを、fastcgiで動かす。
環境はFreeBSD 10.0-BETA1。pkgngでインストール。
設定方法は他OSでも参考になる部分があるかも。
lighttpd, php5のインストール
pkgでインストール。
簡単。
lighttpdは依存も少ない。
# pkg install php5 lighttpd
(略)
php5のバージョン確認
lighttpdを扱う前に、phpを確認する。
fastcgi対応かどうか。
“php5″でインストールされたのは5.4.20
/usr/local/bin/php-cgiを確認すると、特に指定や追加のインストールの必要なくfastcgi対応であることが分かる。
# php -v
PHP 5.4.20 (cli) (built: Oct 3 2013 03:35:30)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
# php-cgi -v
PHP 5.4.20 (cgi-fcgi) (built: Oct 3 2013 03:35:34)
Copyright (c) 1997-2013 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2013 Zend Technologies
lighttpdのファイル配置
lighttpdとしてインストールされたファイルを確認する。
設定ファイル
/usr/local/etc/lighttpd下に。
# cd /usr/local/etc/lighttpd/
# ls
RCS lighttpd.conf.sample vhosts.d
conf.d modules.conf
lighttpd.conf modules.conf.sample
ドキュメントルート
初期状態では/usr/local/www/dataだが、ディレクトリは自分で作る必要がある。
lighttpdのログファイル 初期状態では/var/log/lighttpd下に。
# cd /var/log/lighttpd/
# ls
access.log error.log
ファイルを確認したら、lighttpdの設定に移る。
lighttpdの設定
流れとしては、
- lighttpd.confで全体の設定を、
- modules.confで読み込むモジュールの設定を、
- conf.d/下の*.confで各モジュールの設定を行う。
fastcgiを使うなら、
lighttpd.confで設定ののち、
modules.confでfastcgiのモジュールを読み込む指定をし、
conf.d/fastcgi.confでphpの指定をする、となる。
なお、php.iniにも一部変更が必要。
lighttpdオフィシャルのチュートリアルはここ。
以下、/usr/local/etc/lighttpd下にある設定ファイルに手を加えていく。
lighttpd.confの修正
lighttpd.conf.sampleから変えたのは以下の3行だけ。
server.use-ipv6 = "disable"
server.bind = "192.168.154.241"
$SERVER["socket"] == "192.168.154.241:80" { }
コメント行、空行を除いたlighttpd.confは以下の通り。
include “modules.conf"と指定がある通り、ここでmoduleを読み込んでいる。
# grep -v "^#" ./lighttpd.conf|grep -v "^$"
var.log_root = "/var/log/lighttpd"
var.server_root = "/usr/local/www/data"
var.state_dir = "/var/run"
var.home_dir = "/var/spool/lighttpd"
var.conf_dir = "/usr/local/etc/lighttpd"
var.vhosts_dir = server_root + "/vhosts"
var.cache_dir = "/var/cache/lighttpd"
var.socket_dir = home_dir + "/sockets"
include "modules.conf"
server.port = 80
server.use-ipv6 = "disable"
server.bind = "192.168.154.241"
server.username = "www"
server.groupname = "www"
server.core-files = "disable"
server.document-root = "/usr/local/www/data/"
server.tag = "lighttpd"
server.pid-file = state_dir + "/lighttpd.pid"
server.errorlog = log_root + "/error.log"
include "conf.d/access_log.conf"
include "conf.d/debug.conf"
server.event-handler = "freebsd-kqueue"
server.network-backend = "writev"
server.max-fds = 2048
server.stat-cache-engine = "simple"
server.max-connections = 1024
index-file.names += (
"index.xhtml", "index.html", "index.htm", "default.htm", "index.php"
)
url.access-deny = ( "~", ".inc" )
$HTTP["url"] =~ "\.pdf$" {
server.range-requests = "disable"
}
static-file.exclude-extensions = ( ".php", ".pl", ".fcgi", ".scgi" )
include "conf.d/mime.conf"
include "conf.d/dirlisting.conf"
server.follow-symlink = "enable"
server.upload-dirs = ( "/var/tmp" )
$SERVER["socket"] == "192.168.154.241:80" { }
modules.conf
lighttpd.confで指定されたmodules.confの設定。
どんなmoduleを読み込むか。
以下の行を有効にしただけ。
つまりfastcgiを有効に。
そのほかにも興味深そうなmoduleはあるがミニマルスタートが原則。
include "conf.d/fastcgi.conf"
コメント行、空行を除いたlighttpd.confは以下の通り。
# grep -v "^#" ./modules.conf|grep -v "^$"
server.modules = (
"mod_access",
)
include "conf.d/fastcgi.conf"
conf.d/fastcgi.conf
fastcgiの設定。
phpをどう実行するかを指定できる。
ローカルのphp-cgiでもよいし、ローカルホストの別webサーバ(apacheとか)でもよいし、はたまた別ホストのwebサーバでもよい。
詳細はこちら。
ここでは、ローカルの/usr/local/bin/php-cgiを使う。
fastcgi対応のphpである。
ローカルなのでIPアドレスやTCP/IPポートの指定は不要で、UNIXドメインソケットして使うファイルを指定すればよい。
最終的に以下の行を追加
fastcgi.server = ( ".php" =>
(("bin-path" => "/usr/local/bin/php-cgi",
"socket" => "/tmp/php.socket"
))
)
コメント行、空行を除いたlighttpd.confは以下の通り。
server.modules += ( "mod_fastcgi" )
fastcgi.server = ( ".php" =>
(("bin-path" => "/usr/local/bin/php-cgi",
"socket" => "/tmp/php.socket"
))
)
以上でlighttpdの設定は完了
php.iniの設定
lighttpdのドキュメントを見ると以下のように書いてあるので、php.iniを修正する。
If you want to use PATH_INFO and PHP_SELF in you PHP scripts you have to configure php and lighttpd. The php.ini needs the option:
cgi.fix_pathinfo = 1
FreeBSDだとphp.iniは/usr/local/etcに置かれるべきもの。
初期状態ではphp.iniが無いので、sampleからコピーする。
sampleにはphp.ini-developmentとphp.ini-productionの二つがある。
developmentの方を選んだ。
# cd /usr/local/etc/
# cp php.ini-development php.ini
以下の行のコメントを外す。
cgi.fix_pathinfo=1
起動確認
/usr/local/www/dataを作り、“It works!“とでも書いたindex.htmlを作る。
# mkdir /usr/local/www/data
# echo "It works" > /usr/local/www/data/index.html
FreeBSDなら/etc/rc.confに以下の行を追加。
# enable lighttpd at boot
lighttpd_enable="YES"
起動。
# service lighttpd start
Performing sanity check on lighttpd configuration:
Syntax OK
Starting lighttpd.
ログに異常もなし。
# tail /var/log/lighttpd/error.log
2013-10-22 21:30:20: (log.c.166) server started
#
ブラウザでつないで、index.htmlが表示されればOK。