Nginxのopen_file_cacheに係る特記事項

300000

エロジン新システム開発中にこのようなバグが見つかりました。

GZip圧縮されたHTMLファイルを少し書き換えて量を減らす(インデックスページの表示記事数30を20に変更)してキャッシュの消去とハードの再読込した場合
2

1/4
0

20秒間アクセスができない。

nginx/error.log
pread() read only 3275 of 3368 from "/var/www/html/erozine/dev/index.html.gz"while sending response to client, client:52.144.147.119. server:erozine.jp, request :"GET /var/www/html/erozine/dev/index.html.gz HTTP/2.0 ", host:kvartira-sib.ru

GZip圧縮されたHTMLファイルを少し書き換えて量を増やす(インデックスページの表示記事数30を40に変更)してキャッシュの消去とハードの再読込した場合
1
2/4
0

HTMLファイルが途中で欠けている

事の発端
まえがき:GZIP圧縮すれば20KBのHTMLファイルを5KBに減量できます。

Nginxでgzip onにしてHTMLファイルが読み込まれた時にエロジンサーバ側でgzip圧縮して圧縮されたファイルをあなたのPCに送信し、あなたのブラウザでgzipファイルを展開します。エロジンサーバで圧縮処理しているので少し負担がかかります。

そこでHTMLファイルを圧縮した状態にしておきます。読み込まれた時点で圧縮するのではなく、PythonやPHPを使って既にHTMLをGZに圧縮させてSSDに置いておきます。NginxのGzip_static ONにすることで既に圧縮されたファイルを送信することができます。

原因
本来はHTMLファイルとGZIPファイル両方を置いて置かなければなりません。
GZファイル

3/4
0

しかしこれでは美徳感がありませんのでGZファイルのみ置くことにしました。それが原因でエラーとなりました。

本題はGZだけ置いても別に問題なく読み込むことはできるのですが、ファイルに少し変更を加えることによって上記エラーが生じるということです。記事自体は誤字などで編集することはそんなにありませんが、記事のPVや評価良い悪いの数値は頻繁に変わってきます。この僅かな数字が変わるだけで読み込まなくなったり欠けてしまうのは大変恐ろしいことでしょう。

色々試行錯誤し、Nginxのopen_file_cacheの設定を解除するとエラーが消えました。上記エラーで20秒間アクセス出来ないのはinactive=20sの部分でした。

Nginx open file cache
4/4
1
ファイルのアクセス情報のキャッシュ

Nginxがアクセスするファイル情報のキャッシュも行えます。ドキュメントにはファイルディスクリプタを初め、サイズと更新時間などが保存されるようです。一定期間の間に連続してアクセスがあるファイルの情報を保持し続けることで、ファイルのオープン/クローズのオーバーヘッドを無くすためのキャッシュです。

ドキュメントにはファイルディスクリプタを初め、サイズと更新時間などが保存されるようです。一定期間の間に連続してアクセスがあるファイルの情報を保持し続けることで、ファイルのオープン/クローズのオーバーヘッドを無くすためのキャッシュです。

Nginxがアクセスするファイル情報のキャッシュをかけることでGzip圧縮されたファイルを僅かに変更させてもキャッシュは同じようなものとして扱うが、読み込み時にサイズByteが若干違っているのでエラーを巻き起こしているということです。細かいことはよくわかりませんが原因が解明できて良かったです。ただ解明できても、Open_file_cacheは大事なので外せません。結論はやはりHTMLファイルとGZファイルを同じ場所に置くということになり、無駄な時間を過ごしました。完

関連記事