Open hysryt opened 3 years ago
apache2ctl -M
Loaded Modules:
core_module (static)
so_module (static)
watchdog_module (static)
http_module (static)
log_config_module (static)
logio_module (static)
version_module (static)
unixd_module (static)
access_compat_module (shared)
alias_module (shared)
auth_basic_module (shared)
authn_core_module (shared)
authn_file_module (shared)
authz_core_module (shared)
authz_host_module (shared)
authz_user_module (shared)
autoindex_module (shared)
deflate_module (shared)
dir_module (shared)
env_module (shared)
filter_module (shared)
mime_module (shared)
mpm_event_module (shared)
negotiation_module (shared)
reqtimeout_module (shared)
setenvif_module (shared)
status_module (shared)
authn : authentication(認証) authz : authorization(認可)
$ service apache2 start
$ pstree -a
bash
`-apache2 -k start
|-apache2 -k start
| `-26*[{apache2}]
`-apache2 -k start
`-26*[{apache2}]
StartServersに2が指定されているため、2つの子サーバープロセスが起動している。 {}で囲われているのはスレッド。 ThreadsPerChildに25が指定されているためメインスレッド + 25スレッドの合計26スレッドがある。
https://www.ipa.go.jp/security/awareness/vendor/programmingv1/b07_04.html forkしたプロセスはファイルディスクリプタも複製するため、このプロセスが直接クライアントと通信する。
つまり子プロセスはすべて80番ポートを使って通信する クライアントを識別する処理が必要? 通信が来た段階でクライアントごとのファイルディスクリプタが生成される? acceptシステムコールを使用し、通信が来たら新たにソケットを作成するとのこと
UNIXには他プロセスにファイルディスクリプタを渡す機能があるらしい? https://qiita.com/MoriokaReimen/items/5c4256ef620499a88bb3#comment-77b6070dba93c48ab748
リクエストの処理方法
1リクエストにつき1プロセスが動作する。 プロセスは予め確保しておく。 スレッドセーフでないプログラムを扱うことができる。 mod_phpはpreforkで動かす必要がある?(mod_phpがマルチスレッドに対応していない?) https://rikuga.me/2017/12/14/nazo-php-fpm-multi-thread/
1リクエストにつき1スレッドが動作する。 スレッドは予め確保しておく。
イベント駆動? apache2.4以降のデフォルト?
https://qiita.com/esparrago_b/items/4f368599aba1a059dbd1
$ apache2ctl -V | grep 'Server MPM'
Server MPM: event
MPMがpreforkの場合は mod_cgi
、workerまたはeventの場合は mod_cgid
を使用する。
マルチスレッドのプロセスをforkするのは負荷が高い(スレッドを全て複製してしまう)ため、
mod_cgid
ではCGI実行用のデーモンを別で一つ動作させている。
$ a2enmod cgi # preforkの場合
$ a2enmod cgid # worker, event の場合
apache.conf
AddHandler cgi-script .cgi
<Directory /var/www/>
Options +ExecCGI
</Drectory>
fcgid-scriptハンドラを設定されたプログラムはFastCGIプログラムとして実行され、 そのプロセスは次回以降のリクエストにも使いまわされる。 同時リクエスト数に応じて同じプログラムが複数実行されることもある。
$a2enmod fcgid
apache.conf
AddHandler fcgid-script .cgi
<Directory /var/www/>
Options +ExecCGI
</Drectory>
ディレクティブ | 説明 | 初期値 |
---|---|---|
FcgidMaxProcesses | 同時に実行する最大プロセス数 | 1000 |
FcgidMaxProcessesPerClass | プロセスクラス?ごとの最大プロセス数 | 100 |
Ubuntuでインストール