WSLのUbuntuのApache起動時に「Failed to enable APR_TCP_DEFER_ACCEPT」警告
ぐぐると対処法はすぐ出てくるんだけど、自分用にもう少し詳しくメモ
WSLでApache2をインストールして起動したら、Failed to enable APR_TCP_DEFER_ACCEPT
という警告が出た。
$ sudo service apache2 start
* Starting Apache httpd web server apache2 [Sat Apr 04 14:32:20.262214 2020] [core:warn] [pid 1295:tid 140014090062784] (92)Protocol not available: AH00076: Failed to enable APR_TCP_DEFER_ACCEPT
これは、Apacheの設定ファイル /etc/apache2/apache2.conf
に以下の2行を追記すれば出なくなる。
AcceptFilter http none
AcceptFilter https none
設定後、一応 sudo service apache2 restart
でサービスを再起動しておくこと。
この方法は以下の記事を参考にさせていただいた。
【BoUoW】Apache起動時の「Failed to enable APR\_TCP\_DEFER\_ACCEPT」 - Qiita
で、どうしてこれで直るのかを少し調べる……
以下のWSLのGitHubのIssueを見ると、TCP_DEFER_ACCEPT
がWindowsではサポートされていないから、この警告が出るらしい。
The TCP_DEFER_ACCEPT socket option is not natively supported by Windows.
WSL team are working with Windows networking team on this issue, but fix likely won't make it in RS3.
Doesn't block Apache2 from starting, just a warning. Pile-on below if otherwise.
でも TCP_DEFER_ACCEPT
が何なのかは、片手間に調べた程度では理解できなかった。
雰囲気では、Linuxで使われている、TCP周りの何かを効率良くするためのオプションらしい。
TCP 3-way handshakeのレイテンシ軽減のためのTCP\_DEFER\_ACCEPTソケットオプション - ゆううきブログ
Linux socket accepシステムコールとTCP\_DEFER\_ACCEPT
そしてApacheの AcceptFilter
が何なのかというと……
Listen しているソケットに対して、OS が固有に持っているプロトコルについての最適化を 有効にするディレクティブです。
(略)
none 以外の値で TCP_DEFER_ACCEPT が有効になります。
AcceptFilter
に none
以外を設定した場合、そのプロトコルで TCP_DEFER_ACCEPT
が有効になると。
また、Linuxでの初期値は以下の通りらしい。
AcceptFilter http data
AcceptFilter https data
しかしWindowsではそもそも TCP_DEFER_ACCEPT
に対応してないから、none
を設定してあげないと警告が出た……ということだと思う。