Last Updated on 2020年4月15日 by かんりにん
以前から、バーチャルホストを多数立ち上げるときは、バーチャルホストごとに
プロセスを分けたり数を指定したりできないか?と思っていたら、2.0系にあったので
なぁんだ、あったんじゃん、ということで試そうとしたところ…いろいろアレな感じだったのでメモ。
[いきなりコメント]
わかったこととしては
– perchildは…とっても不安定。
– apacheの公式サイトで、開発する気が無ければ使うな、くらいのコメントが出ていたorz
正確には”現在開発が停止しており、かつ活発ではありません。開発をサポートする意思が無い場合は
使わないでください”な感じ。
– 2.0で実装されたが、2.2ではRPM版については含まれなくなっていた。
ソースにも含まれなくなり、trunkからもなくなったので、もはや使えないものかも?
→試すなら2.0系最新版の2.0.64で。
ただし最終更新が2010年10月なので、約2年間開発停止!
[参考]
Apache MPM perchild(apache公式サイト)
http://httpd.apache.org/docs/2.0/mod/perchild.html
※ちなみに2.2および2.4はリンク切れ…つまりなくなっている可能性大?
perchild MPM
※ここを見ればperchildの状況が大体わかる。
http://sunos.saita.ma/perchild.html
Apache2のインストール
http://linux.kororo.jp/cont/server/httpd.php
Apache2.0のPerchildでバーチャルホストを最適化する
http://www.itmedia.co.jp/help/tips/linux/l0658.html
[作業ログ]
-ダウンロード
$ pwd /home/user/src $ wget http://ftp.yz.yamagata-u.ac.jp/pub/network/apache//httpd/httpd-2.0.64.tar.gz
– 展開
$ tar -zxvf httpd-2.0.64.tar.gz
– ビルド・コンパイル・インストール
$ ./configure \ --prefix=/usr/local/apache20 \ --with-mpm=perchild \ --enable-cache \ --enable-auth-digest \ --enable-proxy \ --enable-proxy-connect \ --enable-proxy-http \ --enable-ssl \ --enable-cgi \ --enable-rewrite \ --enable-so $ make $ su -c "make install"
– プロセス起動
/usr/local/apache2/bin/httpd -k start
→いったん起動確認。
○設定について
・バーチャルホスト毎にUID、GIDを指定することでプロセスをバーチャルホスト毎に
実行させることができる。
・バーチャルホストに指定するUID、GIDは実ユーザーIDを指定すること。
→つまりUNIXアカウントとグループが必要になる。
○[考察]バーチャルホスト別環境のつくりかた
下記の手順はあくまでドラフトであり、
実際に手順をトレースして正しいかどうかを検証してみる必要がある。
[参考]
http://www.itmedia.co.jp/help/tips/linux/l0658.html
1.UID、GIDせってい
→apacheグループに登録する必要があるか確認する
おそらく必要。
[設定内容]
# useradd -s /sbin/nologin apache # useradd -s /sbin/nologin -G apache www_user1 # useradd -s /sbin/nologin -G apache www_user2 # useradd -s /sbin/nologin -G apache www_user3 # cat /etc/passwd ※ apache:x:501:501::/home/apache:/sbin/nologin www_user1:x:502:502::/home/www_user1:/sbin/nologin www_user2:x:503:503::/home/www_user2:/sbin/nologin www_user3:x:504:504::/home/www_user3:/sbin/nologin # cat /etc/group apache:x:501:www_user1,www_user2,www_user3 www_user1:x:502: www_user2:x:503: www_user3:x:504:
2.httpd.confへディレクティブ追加
ChildPerUserID を設定
ChildPerUserID www_user1 www_group1 5 ←最後の数字は起動時のプロセス数。 ChildPerUserID www_user2 www_group2 10
[設定内容]
# cp -p httpd.conf httpd.conf.org # vi httpd.conf 150c150,151 < NumServers 5 --- > #NumServers 5 > NumServers 3 154c155 < MaxThreadsPerChild 20 --- > MaxThreadsPerChild 30 267,268c268,276 < User nobody < Group #-1 --- > User apache > Group apache > > ChildPerUserID www_user1 apache 1 > ChildPerUserID www_user2 apache 1 > ChildPerUserID www_user3 apache 1 > > AcceptMutex fcntl > 481c489,490 < LogLevel warn --- > #LogLevel warn > LogLevel debug 1023a1033
★起動前の注意事項1
ChildPerUserIDでバーチャルホスト毎に指定する起動プロセス数の合計は、NumServersの値を超えないように。
つまりChildPerUserID3つの合計数 6の場合は、NumServersを6以上にすること
(ただし仕様では最大8となっているので、起動プロセス数はあまり多くできない様子。引き続き調査)。
# ../bin/httpd -t Syntax error on line 270 of /usr/local/apache20/conf/httpd.conf: Trying to use more child ID's than NumServers. Increase NumServers in your config file.
★起動前の注意事項2
ChildPerUserIDで指定するグループIDはapacheへの実行権限をもつグループが必要。
ただし個別にapacheユーザー以外のグループIDを指定したところ権限エラーになったので
apacheグループに各UIDを登録し、グループ権限を合わせた状態で実行した。
× ChildPerUserID www_user1 www_group1 1 ←これだとconfigtestにてエラーが発生。 ↓ ○ ChildPerUserID www_user1 apache 1 ←これだとうまくいった。
3.VirtualHostディレクティブ内にパラメータ”AssignUserID “を設定
例:ServerNameの前に”AssignUserID”を指定する。
<VirtualHost 192.168.0.175> AssignUserID www_user1 www_group1 ServerName zd1.example.co.jp ......
[設定内容]
1041a1052,1075 > > <VirtualHost *:80> > AssignUserID www_user1 apache > ServerName testa.example.com > DocumentRoot /usr/local/apache2/htdocs_user1 > ErrorLog logs/error_log.www_user1 > CustomLog logs/access_log.www_user1 common > </VirtualHost> > > <VirtualHost *:80> > AssignUserID www_user2 apache > ServerName testb.example.com > DocumentRoot /usr/local/apache2/htdocs_user2 > ErrorLog logs/error_log.www_user2 > CustomLog logs/access_log.www_user2 common > </VirtualHost> > > <VirtualHost *:80> > AssignUserID www_user3 apache > ServerName testc.example.com > DocumentRoot /usr/local/apache2/htdocs_user3 > ErrorLog logs/error_log.www_user3 > CustomLog logs/access_log.www_user3 common > </VirtualHost>
※ドメイン”example.com”は都度自分の環境に合わせて修正。
4.configtestで問題なければ、apachectl startする。
# /usr/local/apache20/bin/apachectl -k start
起動時のプロセス
親プロセス起動後、perchildスレッドが立ち上がるまで約1分程度かかった。
# ps -aef | grep http root 11079 1 0 19:59 ? 00:00:00 /usr/local/apache20/bin/httpd -k start apache 11080 11079 0 19:59 ? 00:00:00 /usr/local/apache20/bin/httpd -k start 502 11081 11079 0 19:59 ? 00:00:00 /usr/local/apache20/bin/httpd -k start 503 11082 11079 0 19:59 ? 00:00:00 /usr/local/apache20/bin/httpd -k start 504 11083 11079 0 19:59 ? 00:00:00 /usr/local/apache20/bin/httpd -k start root 11102 9736 0 20:00 pts/1 00:00:00 grep http #
※要注意
起動時のトリガーがなんなのかわからないが、以下のような感じで
ChildPerUserIDの一部が起動しない、かつdefunctが大量発生してしまうといった現象も見られた。
# ps -aef | grep http root 10780 1 0 19:57 ? 00:00:00 /usr/local/apache20/bin/httpd -k start apache 10783 10780 0 19:58 ? 00:00:00 /usr/local/apache20/bin/httpd -k start 503 10944 10780 0 19:58 ? 00:00:00 [httpd] 504 10945 10780 0 19:58 ? 00:00:00 [httpd] root 10957 9736 0 19:58 pts/1 00:00:00 grep http
→httpd.confに”AcceptMutex fcntl”を追加することで解消。
※参考:起動時のerrorlog デバッグモード。
[Mon Sep 24 19:59:26 2012] [notice] Digest: generating secret for digest authentication ... [Mon Sep 24 19:59:26 2012] [notice] Digest: done [Mon Sep 24 19:59:26 2012] [notice] Apache/2.0.64 (Unix) configured -- resuming normal operations [Mon Sep 24 19:59:26 2012] [info] Server built: Sep 24 2012 19:14:35 [Mon Sep 24 19:59:26 2012] [debug] perchild.c(1317): AcceptMutex: fcntl (default: sysvsem)