2013年1月8日火曜日

httpdプロセス数の上限を、ulimitを設定して増やせるようにする方法

検証OSはCentOS release 6.3です。

Apacheのpreforkでプロセスの数を1024以上にしたいとき、Apacheが起動できるプロセス数を増やしてあげる必要があります。

問題

例えば以下のようなhttpd.confのApacheをulimitの設定なしに起動しようとすると、/etc/httpd/logs/error_logにエラーメッセージがぞろぞろと出力されます。
# vi /etc/httpd/conf/httpd.conf

StartServers     2000
MinSpareServers  2000
MaxSpareServers  2000
ServerLimit      2000
MaxClients       2000
MaxRequestsPerChild  10000

# service httpd restart
このようなエラーが出てしまう・・・。
# tail -f /etc/httpd/logs/error_log
[Mon Jan 07 14:12:12 2013] [notice] caught SIGTERM, shutting down
Notice: cleaning up shared memory
[Mon Jan 07 14:12:13 2013] [notice] SELinux policy enabled; httpd running as context unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[Mon Jan 07 14:12:13 2013] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Mon Jan 07 14:12:13 2013] [notice] Digest: generating secret for digest authentication ...
[Mon Jan 07 14:12:13 2013] [notice] Digest: done
Creating shmem. name: mod_dosdetector, size: 4856
[Mon Jan 07 14:12:14 2013] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48
[Mon Jan 07 14:12:14 2013] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48
[Mon Jan 07 14:12:14 2013] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48
[Mon Jan 07 14:12:15 2013] [notice] Apache/2.2.15 (Unix) DAV/2 mod_ssl/2.2.15 OpenSSL/1.0.0-fips configured -- resuming normal operations
[Mon Jan 07 14:12:15 2013] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48
[Mon Jan 07 14:12:15 2013] [alert] Child 38071 returned a Fatal error... Apache is exiting!
[Mon Jan 07 14:12:15 2013] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48
[Mon Jan 07 14:12:15 2013] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48
[Mon Jan 07 14:12:15 2013] [alert] (11)Resource temporarily unavailable: setuid: unable to change to uid: 48
[Mon Jan 07 14:12:15 2013] [emerg] (43)Identifier removed: couldn't grab the accept mutex
[Mon Jan 07 14:12:15 2013] [emerg] (43)Identifier removed: couldn't grab the accept mutex

このエラーが出たら、service httpd stopではプロセスが落ちてくれません。
男らしくhttpdをザクっとkillしちゃいましょう。
# ps -ax | grep httpd
# pkill -KILL -f httpd
現在のApacheユーザのulimitの設定をulimit -nコマンドで確認してみましょう。
# /bin/su - --shell=/bin/sh apache
$ ulimit -n
1024
ulimitが1024で設定されているため、プロセスの数がこれ以上立ち上げられなくなっています。

解決方法

これを解消するために、Apacheが使用出来るプロセス数をアップしてあげましょう。

まず、デフォルトの設定が /etc/security/limits.d/90-nproc.conf ファイルに記述されているので、コメントアウトします。
# vi /etc/security/limits.d/90-nproc.conf
#*          soft    nproc     1024
そして、/etc/security/limits.conf ファイルにApacheの設定を追記します。
# vi /etc/security/limits.conf
apache soft nofile 2048
apache hard nofile 2048
Apacheユーザのulimitの設定を確認してみましょう。
# /bin/su - --shell=/bin/sh apache
$ ulimit -n
2048
いけそうですね。
httpdをリスタートしてみましょう。
# service httpd restart
# tail -f /etc/httpd/logs/error_log

エラーが出ていなければOKです。
簡単ですね!

他のアプリケーションなどでも、使用可能な最大プロセス数が足りなくなるといった事はたまにあります。(いや・・・案外あるかも?)
転ばぬ先の杖として、同じように設定してあげるとよいでしょう。