ApacheのPortが80の時のサービスon/offについて(1日目)
Apacheをrootで起動していると
あまりよろしくないという記事を見かけました。
けど、以前の日記で書いた通り一般ユーザではApacheの起動すらできません。
これは一体どういうことか。調べてみました(解決したとは言ってない)。
well-known Portはね
結論から入ると、UNIX(Linux)の思想として、well-known Port(1023以下)のPortを使用したサービスの起動にはroot権限が必要だということです。
え、じゃあもうPort変更して、リバースプロキシか何かでポートフォワードするしかないのかな?と思っていたのですが、それもちょっと違うっぽい。
preforkとかいう専門用語
prefork
preforkは「スレッドを使わず、先行して fork を行なうウェブサーバ」である。Apacheは伝統的に親プロセスを1つ持ち、クライアントからリクエストが来ると自分自身をコピーして子プロセスを起動する(これをforkという)。実際の通信は子プロセスが受け持つ。そのため、通信している数だけ子プロセスが起動することになる。この時、クライアントからリクエストを受けたあとでforkするとfork完了までに待ち時間が出来て通信のパフォーマンスが遅くなる。そのため、あらかじめいくつかの子プロセスをforkしておき、forkの待ち時間をなくす方式をとっている。この方式が「prefork」である。すなわち“pre(=前もって・先行して)”forkしておく、という意味である。
worker
workerは「マルチスレッドとマルチプロセスのハイブリッド型サーバ」である。Apacheの子プロセス1つ1つがマルチスレッドで動作し、スレッド1つが1つのクライアントを受け持つ方式である。すなわち、1つのプロセスがマルチスレッドを利用して複数の通信の面倒を見る。この点で1つのプロセスが1つの通信をみるpreforkとは異なる。また多くの子プロセスを起動せずに済むため、メモリの使用量も減らすことが出来る。
event
eventはworkerの一種でマルチスレッドで動作する。workerとの違いはKeep-Alive(持続的接続)の処理方法である。workerやpreforkは、Keep-Aliveの持続性を保つために一度利用したスレッド・プロセスをそのまま待機させている。しかしクライアントからの接続が持続的に行われる可能性は保証されているわけではないから、待機していること自体が無駄になる可能性もある。そこで、Keep-Aliveの処理を別のスレッドに割り振って通信を処理する。 この方式は長らく実験的サポートであったが、2.4.1にて正式に採用された。(wikipedia)
さすがに引用しすぎ感ある。
Apache2.4から(要確認?)プロセス稼働のデフォルトはevent
になっているみたいです。
ここでps
の結果を
$ ps auxw | grep httpd root 23947 0.0 0.2 70508 2504 ? Ss 23:17 0:00 /usr/local/apache2/bin/httpd -k start hogehoge 24410 0.0 0.4 414768 4140 ? Sl 23:26 0:00 /usr/local/apache2/bin/httpd -k start hogehoge 24411 0.0 0.4 611376 4804 ? Sl 23:26 0:00 /usr/local/apache2/bin/httpd -k start hogehoge 24412 0.0 0.4 414768 4152 ? Sl 23:26 0:00 /usr/local/apache2/bin/httpd -k start
各プロセスのSTATであるSs
とかSl
なのですが、man
さんによると
S 割り込み可能なスリープ状態 (イベントの完了を待っている)
s セッションリーダ
l マルチスレッド化されている (NPTL pthreads が行うように、CLONE_THREAD が使われている)
ちょっとこのあたりのイメージがつかめてなくて、どうにもprefork
の親子関係的なものじゃないっぽい。
今日はもう限界だ...KeepAliveとかも関係してくるっぽいので、また追記しよう...
博識の方、ちょっと教えていただけると嬉しいです。