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の設定

流れとしては、

  1. lighttpd.confで全体の設定を、
  2. modules.confで読み込むモジュールの設定を、
  3. 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。