うちのWebアプリを高速化したときのメモともいいます。フロントがnginxで、Varnishを挟んで後ろにいるSinatra(というよりRack)アプリケーションへアクセスするような感じの環境を想定しています。
メモなので脈絡がないですが、以下のようなことをしています。
- nginxでのキャッシュ制御
- JavaScriptの軽量化
- Rackミドルウェアの導入
- Varnishでのキャッシュ制御
nginxでのキャッシュ制御
静的なファイルはアプリケーションにリクエストを渡さなくてもnginxだけで処理できます。このとき、expiresディレクティブを利用すると、クライアントにキャッシュさせる期間を指定することができます。静的なファイルの中身が書き換わることはまれなので、長めにキャッシュさせても問題ないと思います。
JavaScriptの軽量化
JSMinというライブラリを利用してJavaScriptを軽量化しました。次の2つのコードは上が軽量化前、下が軽量化後の例です。無駄な改行やスペースが削除され、軽量化前の79バイトに対して軽量化後は59バイトと僅かではありますが容量が小さくなっています。
JavaScriptは動的に中身が書き換わるわけではないので、あらかじめ軽量化したファイルを用意しておいてもよいのですが、テンプレートエンジンとして使えるようにしてみました。テンプレートではないので少し違和感はありますが、簡単な記述で利用できて便利なのでこのようにしています。
これを利用すると、他のテンプレートエンジンと同様に「js :テンプレート名」という非常にシンプルな記述で利用可能です。
なお、この例ではJavaScriptを外部ファイルにしていますが、小さなスクリプトであればHTMLに埋め込んだほうが高速化に繋がる場合もあります。HTML内部に埋め込む場合であっても、今回のようにテンプレートエンジンの一種として扱えるようにしておくことで、別ファイルに分離して記述しておいてレンダリング時に埋め込むといった対応が簡単にできます。
Rackミドルウェアの導入
Rack::ETagとRack::Deflaterという2つのミドルウェアを導入してみました。Rack::ETagはキャッシュのためのエンティティタグを生成するミドルウェアで、Rack::Deflaterはレスポンスをdeflateで圧縮するミドルウェアです。
Varnishでのキャッシュ制御
Varnishは特に設定しなくてもいい感じに動いてくれるのですが、Accept-Encodingヘッダの正規化とキャッシュ期間の設定を加えてみました。
Accept-Encodingの正規化部分は公式Wikiから拾ってきただけなので特に言うことはありません。
キャッシュ期間の設定はCache-Controlヘッダを追加しているだけです。
あまり説明することがないですが、それだけVarnishがよくできているということでしょうね。
参考