Nginxのバグで201 CreatedのレスポンスでAjaxがホールドする問題

手元のRails3+jQuery-ujsで動いているAjaxリクエストが、サーバにデプロイするとPOST後に延々と時間がかかってレスポンスが返ってこない。POST直後にちゃんとコントローラでrenderされてるのに。

良く良く観察してみると、ちょうど1分ほどかかって正常終了する。調べたみたら、Nginxのバグだった。0.8.32より前のバージョンには、201 Createdを返すときにContent-Lengthヘッダが入らず、このためモダンなブラウザはkeepaliveでDOMを再描画せずに待ってしまう。

というのを見つけて理解するのに、延々とドキュメントを読んだり、微妙に設定を変えたりで3時間も無駄にしてしまった。

もうバージョン1.0が出たし、Nginxのバージョンを上げたいけど、Ubuntu10.04LTSのパッケージは0.7系と古い。自分でビルドすると後々面倒そう。

結局、render :partialで、返すHTTPレスポンスを、201 Createdではなく、200 OKにすることでごまかした。Amazon S3のPOSTも、200 OKを返してるらしい、理由は定かではないけど。