LoginSignup
3

More than 5 years have passed since last update.

はじめての OpenResty : ホットロード

Last updated at Posted at 2018-08-30

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 でアクセスしてみます

red.png

赤文字で表示されました。次にこのまま lua/hotload.lua の中の色を blue に変更します。

$ sed -i -e "s/red/blue/g" lua/hotload.lua

このまま再度ブラウザからアクセスしてみると。。。

red.png

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 していますので設定に関係なく青文字で表示されていると思います。

blue.png

次に lua/hotload.lua の中の color 設定を green に変更し、

$ sed -i -e "s/blue/green/g" lua/hotload.lua

ブラウザでアクセスすると

green.png

緑文字に変わりました!

まとめ

パフォーマンスは損なうことになりますが、煩雑な nginx 再起動なしでスクリプトファイルの変更が即反映される形になります。

本番環境では使うことは出来ませんが、OpenResty であっても頻繁にコードを変更する開発段階においては必須のパラメーターと考えられます。

この設定でみなさんの OpenResty での Web アプリケーション開発が快適になれば幸いです。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3