harumaki.net

インフラ屋の覚書や、ラーメン食べある記とか。

apache GNU/Linux サーバー

apache httpd server にてvhostsごとにMPMを分ける検証 (perchildMPMの動作検証)

投稿日:2012年9月24日

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)

-apache, GNU/Linux, サーバー
-,

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

nagiosgraph/4.グラフ設定例/check_cpu.sh

[pukiwiki] **nagiosgraphへのグラフ設定追加例[check_cpu.sh] [#s162aecf] nagios exchangeから取得したcheck_cpu.shの実行結果を …

no image

クラスタリング/heartbeat

[pukiwiki] #topicpath #contents *クラスタリング/heartbeat [#t91d7900] 2台のホスト間でのクラスタリングを構成する。以下のような機能を提供する。 …

no image

AWstatsのインストール(RPM版)

[pukiwiki] アクセスログ解析ツールawstatのインストールのメモ。 Software Design2006年1月号を参照。 今回はローカル上で運用しているバーチャルホストのログを解析。 ※ …

no image

MailScannerインストール

[pukiwiki] #contents *MailScannerインストール [#u6675e2d] RHEL4+postfix環境にて、MailScannerを試す。 これでウィルス/スパムを同時 …

no image

[ssh].shostsによる認証許可メモ

[pukiwiki] .shostsによる認証許可。 設置場所:各ユーザーのホームディレクトリ ユーザーのホームディレクトリに.shostという隠しファイルを作成し 接続を許可する外部ホストのIPない …