TCP_MISS_ABORTED/000

ときどき(1〜2回/日)zabbixで監視しているウェブサイトからエラーの報告があります。
誤検知かなとしばらく無視をしていたんですが、アクセスログをチェックしてみるとちゃんとエラーになっている模様。
HTTPステイタスは403でForbidden。実は、mod_securityで引っかかって403になっているだけで、実際はapacheの後ろにいるSquidが503を返している。

それがこんなログ。

1458695235.489  10010 127.0.0.2 TCP_MISS_ABORTED/000 0 GET http://127.0.0.2:3128/ - FIRSTUP_PARENT/127.0.0.2 -

2カラム目がSquidが返しているサイズで、おそらくSquidのエラーページを出している模様。
ウェブのソフトウェア的な構成としてはこんな感じになっています。

Apache(1):443 -> Squid:3128 -> Apache(2):80 -> Apache(3):7080
||< 

上記Apache(1)とApache(2)は同一プロセスで名前ベースの仮想ホスト。Apache(3)がバックエンド本体でコンテンツはこいつが返しています。
上記のログがでたときには、SquidはちゃんとApache(3)にリクエストをだしていて、その返事をまたずにTCP_MISS_ABORTEDでセッションを終了している。
うーむ、これはこまった。しかも時々しか発生しないのがいやらしい。

とりあえず以下の処置。

**タイムアウト値を調整
それぞれのタイムアウト値をすこし長めに調整。150秒程度で。
Apacheだとこんな。
>||
Timeout 150
ProxyPass / http://127.0.0.2:3128/ timeout=180

Squidから後ろのApacheへのタイムアウト設定はこんな。

cache_peer      127.0.0.2 parent 80 0 max-conn=256 no-query originserver name=hogefuga connect_timeout=180

pconn_timeoutの値を短めに

KeepAliveでコネクションをガメるんじゃなくてどんどん開放して新しくコネクションをつくってもらう。

pconn_timeout 3 seconds

デフォルトは1minだったと思う。

retry_on_errorを有効に

retry_on_error on

TCP_MISS_ABORTEDでもリトライしてくれるかどうかは知らない。