本当にどうでもいいメモなどをたまに書く程度。

メモリ足りない環境で Lighttpd + PHP

日付:

SemoWeb の激安 VPS でなんとか色々動かそうというお話。
結論としては、FastCGI-PHP を1プロセスに限定して動かす ;-)


メモリ 256MB (burstable 512MB) のはずなんだけど、なぜか最低限度 (syslog とか ssh とか) + fail2ban ぐらいしか動かしてない状況で 100MB ぐらいしか残らない ;-)
正直ちょっとおかしいぐらいメモリがないというか、burstable 分は最初っから数字だけで実際にはないような感じ。
そんな状況でいつも通り apache2-mpm-itk + libapache2-mod-php5 でいこうとしたら、Apache が起動した時点で残り 10MB 未満、WordPress で作ったサイトなんかだとメモリ不足で落ちちゃってどうしようもない。

以前ならメモリが少ない環境では Mathopd を使っていたが、wheezy でパッケージ収録から外れてしまったので、Lighttpd に初挑戦。

# lighttpd-enable-mod accesslog fastcgi-php

して、vhost 周りは別途 /etc/lighttpd/sites.conf ってファイルを作って /etc/lighttpd/conf-enabled にシンボリックリンクする。

問題は PHP で、Lighttpd では CGI で使うか、FastCGI で使うか、という選択肢がある。
今回はとにかくメモリが足りないので、FastCGI を使って /etc/lighttpd/conf-available/15-fastcgi-php.conf で

"PHP_FCGI_CHILDREN" => "1",

というド外道をやる。
たった1プロセスの PHP を使い回して全部処理させるのだ。
初期設定だと4プロセス動くので、それだけでメモリがカツカツになってしまうが、ここまで削れば 50MB ぐらい残っている :-)


http → https のリダイレクト設定だけど、検索で出てくる多くの記事では

$SERVER["socket"] == "(IP アドレス):443" { (略) }
else $HTTP["host"] =~ "^(www\.)?example.com$" {
	url.redirect = ("^/(.*)" => "https://%1/$1")
} 

といった形、つまり $SERVER[“socket”] への else で書いているが、今後の SNI 対応を考えると、この設定では対応出来ない。
SNI 対応設定ではドメイン毎の証明書を $HTTP[“host”] に書いていくので、リダイレクトもその中で $HTTP[“scheme”] を使って書くのが正しいと思う。

$SERVER["socket"] == "(IP アドレス):443" { (略) }
$HTTP["host"] =~ "^(www\.)?example.com$" {
	(他の設定)
	$HTTP["scheme"] == "http" {
		url.redirect = ("^/(.*)" => "https://www.example.com/$1")
	}
}
comments powered by Disqus