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を返してるらしい、理由は定かではないけど。