500 Internal Server Error でToo many open files のエラー

cPanel WHM の 問題でApache の起動スクリプトに ulimit を設定するという記事を投稿したのですが、Html ファイルには正常にアクセスできても、PHP、Perl スクリプトをたたくと 500 Internal Server Error が表示され、Apache のログに(24)Too many open files というエラーログが残ります。

ファイル・ディスクリプタの確認

システム全体で同時に開くことができるファイル数の上限と、ひとつのプロセスが同時に開くことができる上限の閾値を調節します。現在のステータスの確認するには、/proc/sys/fs/file-nr を確認します。

cat /proc/sys/fs/file-nr
20896   0       32768
# /sbin/sysctl -p

左の値 20896 が今開いているファイル数(割当て済みのファイル・ディスクリプタ数)で、右が 65536 がシステムのファイル・ディスクリプタの最大値です。

システムが開けるファイルの上限を変更

まずは、/etc/sysctl.conf を編集してカーネルパラメーターを調節。

vi /etc/sysctl.conf   add end of line 
fs.file-max = 65536
cat /proc/sys/fs/file-max
65536

同時にひらけるファイルとプロセス数の変更

次に/etc/security/limits.conf を編集して、システムとプロセスが開ける上限を変更します。

vi /etc/security/limits.conf
*          soft     nproc          65536
*          hard     nproc          65536
*          soft     nofile         65536
*          hard     nofile         65536

ユーザが開けるプロセスの変更

CentOS 6 からはユーザが開けるプロセスの上限も設定されているため、90-nproc.conf の設定を変更します

ulimit -u
32768

vi /etc/security/limits.d/90-nproc.conf
*          soft     nproc          65536
*          hard     nproc          65536
*          soft     nofile         65536
*          hard     nofile         65536

設定の確認

ulimit -a でopen files とmax user processes の値を確認して設定を確認します。
open files と、max user processes が変更した値になっていたらオッケー。
open files (-n) 65536
max user processes (-u) 65536

# ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 62747
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 65536
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 10240
cpu time               (seconds, -t) unlimited
max user processes              (-u) 65536
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

Apache 再起動

ulimit で設定が反映されていたらApache のstop とstart。restart だと、設定が正常に反映されないことがあるみたいです。

/etc/rc.d/init.d/httpd stop
/etc/rc.d/init.d/httpd start