nginx
Chrome

nginxでのERR_CONTENT_LENGTH_MISMATCHの解決法

More than 1 year has passed since last update.

お盆明けに出社したら開発環境のwebアプリケーションの画面が真っ白になっていました。
サーバーはクラウドなのですが、お盆前とお盆明けで何も変えてないのになぜ。。
ブラウザはこんな状態でコンソールには「ERR_CONTENT_LENGTH_MISMATCH」のエラーが。

ERR_CONTENT_LENGTH_MISMATCH_2.png

原因

ヘッダーのContentLengthと実際に受け取ったバイト数が違うことが原因らしい。
Chromeのみで起きるのだとか。
Firefoxでも発生しました。
サーバー側に原因があるはずなのでnginxのエラーログを見てみると案の定以下のようにエラーが起きてました。

2016/08/24 11:23:55 [crit] 7471#7471: *158879 open() "/tmp/cache/nginx_temp/0000000114" failed (2: No such file or directory) while reading upstream, client: 【CLIENT】, server: 【SERVER】, request: "GET 【URL】 HTTP/1.1", upstream: "【URL】", host: "【HOST】", referrer: "【URL】"

※【】内は伏字

nginxで指定したサイズを超えたレスポンスが発生する場合の設定を行っており、設定したサイズを超えるとキャッシュを作りに行きそのキャッシュを使うようにするが、そもそもそんなディレクトリもしくはファイルがねーよ!と言われてるっぽい。

解決法1: ブラウザのキャッシュ削除

  • Chromeの更新ボタン上で右クリックし「キャッシュの削除とハード再読み込み」を行う。

オススメできない。
一時的に直るが再発する可能性があるのと、この方法ですら直らない場合がある。
そもそもユーザーにそんなことをさせられない。

解決法2: nginxのエラーに従う

今回はディレクトリかファイルがないと言われているので作ってあげる。

cd /tmp
mkdir cache
chmod 777 cache
service nginx restart

設定ファイルは弄っていないですが、nginxを再起動しないと反映されませんでした。

権限がない場合はnginxのエラーログに「Permission denied」と出るみたい。
権限がない場合の類似例

解決法3: nginxのレスポンスデータ関する設定を無効にする、もしくは上限を上げる

nginxの以下のパラメータあたりを見直し。
- proxy_cache_path
- proxy_buffer_size
- proxy_buffers
- proxy_max_temp_file_size

解決法2で解決できなかった場合の最終手段な気がする。

最後に

本番環境ではキャッシュの一時ファイルは作成していたので同様の問題は起きてませんでした。
結局なんでお盆明けに発生したかは分からなかった。。