Apache 「Forbiddenだとぅ?Too many files でつか?」

普段どおり、自社サイトにアクセスすると

Forbidden

んー。アクセスできません ヽ(´ー`)ノ

 

■ログを確認する

[Sun Mar 19 23:50:09 2006] [error] [client 6X.215.32.12] (24)Too many open files: file permissions deny server access: /export/home/www/public_html/xxx.html
[Sun Mar 19 23:50:11 2006] [error] [client 6X.236.103.72] (24)Too many open files: file permissions deny server access: /export/home/www/public_html/xxx.html
[Sun Mar 19 23:50:12 2006] [error] [client 21X.255.229.237] (24)Too many open files: file permissions deny server access: /export/home/www/public_html/aaa.html

 Too many open files だそうです。はい。

 

■Apacheを再起動する

とりあえず、Apacheを停止して、起動します。再起動はダメです。

# /etc/init.d/apachectl stop
# /etc/init.d/apachectl start

 とりあえず、これで生き返りましたよ。

 

■原因を探る

Helixのストリーミングサーバがたくさんファイルを扱っていたようで、デスクリプタを増やす必要あり。

 

■ディスクリプターを増やす

1プロセスが開けるファイルが256と少ない。

# ulimit -a
core file size (blocks)     unlimited
data seg size (kbytes)      unlimited
file size (blocks)          unlimited
open files                  256
pipe size (512 bytes)       10
stack size (kbytes)         8192
cpu time (seconds)          unlimited
max user processes          15877
virtual memory (kbytes)     unlimited

ということで、1プロセスあたりのファイル・ディスクリプタの数を増やすために、/etc/system にあるシステム・パラメーターを変更する。これによりSolarisのスケーラビリティーを上げるのだ。

ファイル・ディスクリプターの数を 1024 にするために、以下の行を /etc/system のお尻に付け加えて、再起動すればOKだ。(電源を落とす時間が必要になるのが残念)

set rlim_fd_max=1024

 

■Apacheの設定を調べる

 再起動後に、Apacheのコンパイル時の設定を調べる。256という制限が付いたようなので、もう一度コンパイルし直すか…。

# /usr/local/apache/bin/httpd -V
Server version: Apache/1.3.31 (Unix)
Server built:   Aug 31 2004 17:49:27
Server's Module Magic Number: 19990320:16
Server compiled with....
 -D HAVE_MMAP
 -D USE_MMAP_SCOREBOARD
 -D USE_MMAP_FILES
 -D HAVE_FCNTL_SERIALIZED_ACCEPT
 -D HAVE_SYSVSEM_SERIALIZED_ACCEPT
 -D HAVE_PTHREAD_SERIALIZED_ACCEPT
 -D DYNAMIC_MODULE_LIMIT=64
 -D HARD_SERVER_LIMIT=256
 -D SHARED_CORE
 -D HTTPD_ROOT="/usr/local/apache"
 -D SUEXEC_BIN="/usr/local/apache/bin/suexec"
 -D SHARED_CORE_DIR="/usr/local/apache/libexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/httpd.scoreboard"
 -D DEFAULT_LOCKFILE="logs/httpd.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
 -D ACCESS_CONFIG_FILE="conf/access.conf"
 -D RESOURCE_CONFIG_FILE="conf/srm.conf"

ちなみに入っているモジュールの一覧は、このように確認する。

# /usr/local/apache/bin/httpd -l
Compiled-in modules:
  http_core.c
  mod_env.c
  mod_log_config.c
  mod_mime.c
  mod_negotiation.c
  mod_status.c
  mod_include.c
  mod_autoindex.c
  mod_dir.c
  mod_cgi.c
  mod_asis.c
  mod_imap.c
  mod_actions.c
  mod_userdir.c
  mod_alias.c
  mod_access.c
  mod_auth.c
  mod_so.c
  mod_setenvif.c
suexec: disabled; invalid wrapper /usr/local/apache/bin/suexec

ほとんど、ノーマル状態だな…。