lua_code_cache off によるホットロード
OpenResty で lua のコードを含んだファイルを変更した場合、都度 nginx -p $(pwd) -s reload
を実行して nginx を再起動する必要がありました。
開発段階でカジュアルに使っている場合、毎回再起動するのは面倒で、ファイルを変更後サーバーの再起動なしでアプリケーションのコードが反映されることが望ましいです。こうした機能は「ホットロード」などと呼ばれます。
OpenResty の Lua で記述されたアプリを含んだモジュールは、一度ロードされるとキャッシュされ再利用されます。これに対し lua_code_cache off
を location ディレクティブで指定することでキャッシュが無効となり、リクエスト毎に Lua のモジュールが読み込まれます。これによってファイルの変更後のリクエストで直ちに反映されるのと同じ効果があります。ためしてみましょう。
現在の構成およびデフォルト時の挙動
OpenResty のインストールについては はじめての OpenResty : Hello World などを参照してください。
今回も Windows PC 上の VirtualBox のゲストに CentOS 7 が NAT NIC でインストールされている想定です。
- ポート構成
| 用途 | ホストIP | ホストポート | ゲストIP | ゲストポート |
-------+----------+--------------+-----------+---------------
| ssh | 0.0.0.0 | 20022 | 10.0.2.15 | 22 |
| HTTP | 0.0.0.0 | 20080 | 10.0.2.15 | 80 |
| DEV | 0.0.0.0 | 28080 | 10.0.2.15 | 8080 |
- ディレクトリ構成
../restyroot
├── conf
├── logs
└── lua
- conf/nginx.conf
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
server {
listen 8080;
location / {
default_type text/html;
content_by_lua_file ./lua/hotload.lua;
}
}
}
- lua/hotload.lua
ngx.say("<p><span style="color:red">RELOADED?</span></p>");
nginx -p $(pwd) -c conf/nginx.conf
で nginx を起動しホストの Windows 上のブラウザから localhost:28080
でアクセスしてみます
赤文字で表示されました。次にこのまま lua/hotload.lua
の中の色を blue に変更します。
$ sed -i -e "s/red/blue/g" lua/hotload.lua
このまま再度ブラウザからアクセスしてみると。。。
F5 や Shift + F5 でキャッシュクリアの Reload をしても、もちろん赤文字から変更されません!
lua_code_cache off にする
location ディレクティブを以下に変更します。
location / {
default_type text/html;
lua_code_cache off; <===== 追加
content_by_lua_file ./lua/hotload.lua;
}
nginx を reload すると以下のように alert が出ますが問題なく再起動されています。
$ nginx -p $(pwd) -s reload
nginx: [alert] lua_code_cache is off; this will hurt performance in /home/restymgr/restyroot/conf/nginx.conf:11
これは説明どおり、リクエスト毎にファイルを読みに行くことになりますのでパフォーマンスは大きく低下します。その警告です。
まずは、localhost:28080
にアクセスしてみましょう。reload していますので設定に関係なく青文字で表示されていると思います。
次に lua/hotload.lua
の中の color 設定を green に変更し、
$ sed -i -e "s/blue/green/g" lua/hotload.lua
ブラウザでアクセスすると
緑文字に変わりました!
まとめ
パフォーマンスは損なうことになりますが、煩雑な nginx 再起動なしでスクリプトファイルの変更が即反映される形になります。
本番環境では使うことは出来ませんが、OpenResty であっても頻繁にコードを変更する開発段階においては必須のパラメーターと考えられます。
この設定でみなさんの OpenResty での Web アプリケーション開発が快適になれば幸いです。