hysryt / wiki

https://hysryt.github.io/wiki/
0 stars 0 forks source link

Mutex ディレクティブ #117

Open hysryt opened 5 years ago

hysryt commented 5 years ago

Mutex

ミューテックスと読み、排他制御のことを指す。

Mutexディレクティブを使うことで、排他制御方式および排他制御に使用するロックファイルディレクトリを指定できる。 httpd で行われる排他制御処理はいくつかあり、第二引数にそのミューテックス名を指定することで特定の排他制御処理のみへの設定も可能。

デフォルトでは自動的にいずれかの排他制御方式が選択されるが、以下のケースではMutexディレクティブを使って手動で変更する必要がある。

排他制御方式

設定できる値として、以下の排他制御方式がある。

排他制御方式 説明
default APRによって選択されたデフォルト排他制御方式。
none 排他制御を無効化し、モジュールによる排他制御方式がある場合はそれを使用する。
posixsem POSIXセマフォをベースとした排他制御方式。
sysvsem SystemV IPCセマフォをベースとした排他制御方式。
sem posixsem と sysvsem の良い方が選択される。
pthread スレッド排他を実現するためのPOSIX mutexをベースとした排他制御方式。
fcntl ロックファイルとfcntl()関数を使用した排他制御方式。
flock ロックファイルとflock()関数を使用した排他制御方式。
file fcntl と flock の良い方が選択される。

排他制御処理

httpdには以下の排他制御処理が存在する。 Mutexディレクティブの第2引数にはこれを指定する。

排他制御処理 モジュール 排他制御されるリソース
mpm-accept prefork, worker クライアントからのコネクション
authdigest-client mod_auth_digest 共有メモリ上のクライアントリスト
authdigest-opaque mod_auth_digest 共有メモリ上のカウンタ
ldap-cache mod_ldap LDAPキャッシュ
rewrite-map mod_rewrite 外部マッピングプログラムとの通信
ssl-cache mod_ssl SSLセッションキャッシュ
ssl-stapling mod_ssl OCSPステープリングキャッシュ
watchdog-callback mod_watchdog 特定のクライアントモジュールのコールバック関数
hysryt commented 5 years ago

Ubuntu18.10 + Apache2.4 で発生したエラー

起動できない

[Sat Jun 15 05:20:19.817690 2019] [mpm_prefork:emerg] [pid 1280] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 15 05:20:19.818407 2019] [mpm_prefork:emerg] [pid 1281] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 15 05:20:19.819239 2019] [mpm_prefork:emerg] [pid 1278] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 15 05:20:19.820841 2019] [mpm_prefork:emerg] [pid 1277] (43)Identifier removed: AH00144: couldn't grab the accept mutex
[Sat Jun 15 05:20:20.465940 2019] [core:alert] [pid 1197] AH00050: Child 1277 returned a Fatal error... Apache is exiting!
[Sat Jun 15 05:20:20.465967 2019] [:emerg] [pid 1197] AH02818: MPM run failed, exiting

Mutex file を設定したら解決した。 Mutex sem でもいけた。 Mutex pthread でもいけた。 Mutex default と Mutex none が無理だった。