Apache 周りの設定と、WebDAV 設定
会社サーバー絡みで最近行った設定に関するメモです。
サーバー全体の動作が重くなるのをどうにかする
さくらの VPS を利用するようになってから、サーバー全体の動作が重いのが気になっていました。結論から言うと、 Apache がメモリーを食いつぶし、スワップを引き起こしまくっていたからでした。
Trac のページやこのブログ、会社のトップページでさえ、表示するのにやたらと時間がかかるので、 ssh で接続して状況を見ようとすると、その ssh での応答も非常に時間がかかるという状態。まさかこれが単体の専用サーバーと VPS の差だとは到底思えなかったので、 ps -AF するなり top するなりして軽く状況を見てみると、メモリーどころかスワップ領域もほぼフル回転で httpd が食いつぶしていた。こりゃああかんと言うことで、ネットで調べつつ設定を修正…。
起動するプロセスの数を減らす
とりあえず応急処置と言うことで、一度に起動するプロセスの数を減らすことを考えてみた。以下のサイトが参考になりました。
まず MPM に何を選択しているのかを知る必要があります。 CentOS を採用しているさくらの VPS では prefork MPM が選択されていました。
$ cat /etc/sysconfig/httpd # Configuration file for the httpd service. # # The default processing model (MPM) is the process-based # 'prefork' model. A thread-based model, 'worker', is also # available, but does not work with some modules (such as PHP). # The service must be stopped before changing this variable. # #HTTPD=/usr/sbin/httpd.worker (以下略)
その場合、 httpd.conf ファイルにて修正すべきは、以下の部分と言うことになります。
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 <IfModule>
基本的に社員2名の会社で社内サービスがメイン、会社サイトもこのブログもそれほど頻繁にアクセスされているわけでもないのに、プロセス 256個同時起動はまずあり得ないでしょう。プロセス 1つで 70MB ぐらい消費してしまうのに、メモリー 512MB、スワップ領域 2GB でプロセスをそんなに確保できるわけがありません。
また、待機するプロセス数の最大 20も大きすぎます。一度作られた待機プロセスは Apache を再起動でもしない限りは残ったままになってしまうらしく、メモリー使用量を抑えたいのであれば、この数を減らしてやる必要があります。
というわけで、変更後の内容は以下の通りです。
<IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 10 ServerLimit 15 MaxClients 15 MaxRequestsPerChild 4000 </IfModule>
とりあえずこの設定で数日間動かしてみたところ、それでもまだメモリーは景気よく食いつぶされているものの、重たくて使い物にならないような状況には至らなくなりました。
使わなさそうなモジュールをざっくり外す
1つ1つのプロセスが消費するメモリー容量がそもそも大きいので、シェイプアップも図ってみることにしました。デフォルトでロードするよう設定されているモジュール類でも、必ずしも全て必要なわけではなく、使わないモジュールを外すことでメモリー使用量を抑えることができるという情報を見つけたので、Apache のドキュメントとにらめっこしながら、今は使っていないし近い将来使う予定もなさそうなモジュールを威勢よく外してみました。
LoadModule auth_basic_module modules/mod_auth_basic.so LoadModule auth_digest_module modules/mod_auth_digest.so LoadModule authn_file_module modules/mod_authn_file.so #LoadModule authn_alias_module modules/mod_authn_alias.so #LoadModule authn_anon_module modules/mod_authn_anon.so #LoadModule authn_dbm_module modules/mod_authn_dbm.so LoadModule authn_default_module modules/mod_authn_default.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_user_module modules/mod_authz_user.so LoadModule authz_owner_module modules/mod_authz_owner.so #LoadModule authz_groupfile_module modules/mod_authz_groupfile.so #LoadModule authz_dbm_module modules/mod_authz_dbm.so LoadModule authz_default_module modules/mod_authz_default.so #LoadModule ldap_module modules/mod_ldap.so #LoadModule authnz_ldap_module modules/mod_authnz_ldap.so #LoadModule include_module modules/mod_include.so LoadModule log_config_module modules/mod_log_config.so LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so #LoadModule ext_filter_module modules/mod_ext_filter.so LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule expires_module modules/mod_expires.so #LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so #LoadModule usertrack_module modules/mod_usertrack.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule mime_module modules/mod_mime.so LoadModule dav_module modules/mod_dav.so #LoadModule status_module modules/mod_status.so LoadModule autoindex_module modules/mod_autoindex.so #LoadModule info_module modules/mod_info.so LoadModule dav_fs_module modules/mod_dav_fs.so LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule dir_module modules/mod_dir.so #LoadModule actions_module modules/mod_actions.so #LoadModule speling_module modules/mod_speling.so #LoadModule userdir_module modules/mod_userdir.so LoadModule alias_module modules/mod_alias.so LoadModule rewrite_module modules/mod_rewrite.so #LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so #LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_connect_module modules/mod_proxy_connect.so #LoadModule cache_module modules/mod_cache.so #LoadModule suexec_module modules/mod_suexec.so #LoadModule disk_cache_module modules/mod_disk_cache.so #LoadModule file_cache_module modules/mod_file_cache.so #LoadModule mem_cache_module modules/mod_mem_cache.so LoadModule cgi_module modules/mod_cgi.so #LoadModule version_module modules/mod_version.so
厳密にはこれに加えて、さらに conf.d/proxy_ajp.conf
や conf.d/welcome.conf
の中身をコメントアウトしてみたりもしています。結果として、メモリー使用量はプロセス当たり 70MB ぐらいだったのが 50MB ぐらいまでスリムアップしました。
WebDAV 設定
社内で一時的なファイルのやりとりをするのに使用する共有フォルダ的なものが欲しかったので、WebDAV を設定して Web フォルダとして使用することにしました。要件としては以下の通りです。
- クライアントは Windows および Mac OS X (あとたまに Ubuntu)。
- 社外には公開しない。
- 認証が必要。匿名アクセスは不許可。
- SSL による通信の保護が必要。
まず、SSL を使用するため、 developer.harapeko.jp サブドメインを使用することにしました。 WebDAV の為のディレクトリは、 developer.harapeko.jp サブドメイン用に用意しているディレクトリ下に作成することにします。
$ mkdir -p /var/www/vhosts/developer/dav/davroot
dav
ディレクトリ、dav/davroot
ディレクトリの両方に、 apache ユーザーが書き込みを行う権限が必要です。
次に、ダイジェスト認証用の認証ファイルを dav
ディレクトリ下に作成します。 realm を DAV
とする場合、
$ htdigest -c /var/www/vhosts/developer/dav/.htdigest DAV murachi
とかやって、パスワードを設定します。 2人目以降は -c
オプションは不要です。
そして、conf.d/ssl.conf
(SSL が適用されているヴァーチャルホストに対して設定を行うので、conf/httpd.conf
ではないという点に注意) の <VirtualHost>
セクション内に、以下の設定を書き加えました。
<ifmodule mod_dav.c> DavLockDB /var/www/vhosts/developer/dav/DavLock Alias /dav /var/www/vhosts/developer/dav/davroot <Location /dav> Order Allow,Deny Allow from all Options +Indexes Dav On AuthType Digest AuthName DAV AuthUserFile /var/www/vhosts/developer/dav/.htdigest <LimitExcept OPTIONS> Require valid-user </LimitExcept> </Location> <Location /> Header add MS-Author-Via "DAV" </Location> </ifmodule>
あとは Apache を再起動すれば ok です。
設定ファイルについて軽く解説すると、まず、最後の
<Location /> Header add MS-Author-Via "DAV" </Location>
の部分は、Windows から Web フォルダとしてアクセスする場合に必ず必要になります。この記述がないと、Windows クライアントは /_vti_inf.html
ファイルが見つからないなどという意味不明なエラーを吐いてこけてしまいます。この設定のロケーションは /
でなければなりません。
それから、
<LimitExcept OPTIONS> Require valid-user </LimitExcept>
の部分は、本来であれば
Require valid-user
のみであるべきなのですが、Digest 認証を用いる場合には、上記のように書かないと、やはり Windows の Web フォルダとして利用することができません。これはどうやら Windows の (IE の?) バグのようで、 OPTIONS メソッドでアクセスする際にのみ、 Digest 認証が理解できないからなのだそうです。
この辺の、 Windows の Web フォルダ機能に絡んだ設定方法については、以下のサイトが参考になりました。
2010 年 11 月 5 日 by 村山 俊之