OpenResty: nginx*Luaのメモ

公式

OpenResty

OpenResty® – Open source
インストール方法とかは、こちらから。
インストール後は、基本Nginxなので、あまり見ることが無い気がする。

lua-nginx-module

openresty/lua-nginx-module: Embed the Power of Lua into NGINX HTTP servers (github.com)
公式ドキュメント(README)がとても充実してるので、ここ見れば大体書いてる。(Lua言語自体のことでなければ)

Raspbianにはaptコマンドで構築できない

root@raspberrypi:~# apt-get update
取得:1 http://deb.debian.org/debian bullseye-backports InRelease [49.0 kB]
取得:2 http://openresty.org/package/arm64/debian bullseye InRelease [2,584 B]
取得:3 http://deb.debian.org/debian bullseye-backports/main armhf Packages [415 kB]
取得:4 http://deb.debian.org/debian bullseye-backports/main Translation-en [353 kB]
取得:5 http://raspbian.raspberrypi.org/raspbian bullseye InRelease [15.0 kB]
取得:6 http://archive.raspberrypi.org/debian bullseye InRelease [23.6 kB]
取得:7 http://archive.raspberrypi.org/debian bullseye/main armhf Packages [314 kB]
取得:8 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages [13.2 MB]
14.4 MB を 10秒 で取得しました (1,407 kB/s)
パッケージリストを読み込んでいます... 完了
N: リポジトリ 'http://openresty.org/package/arm64/debian bullseye InRelease' がアーキテクチャ 'armhf' をサポートしないため設定ファイル 'openresty/binary-armhf/Packages' の取得をスキップ
root@raspberrypi:~#
root@raspberrypi:~# apt-get -y install openresty
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています... 完了
状態情報を読み取っています... 完了
E: パッケージ openresty が見つかりません
root@raspberrypi:~#

ダメ元でDebian arm向けの公式手順で進めるも、
リポジトリがarmhfに非対応でパッケージが提供されていない。(って書いてある)

仕方ないので、ソースからビルドする。

OpenResty – Installation

既にインストールしているnginxは予め停止しておく。

systemctl disable nginx
systemctl stop nginx

以下、ビルド~インストール迄

# 前提パッケージのインストール
apt-get -y install libpcre3-dev libssl-dev perl make build-essential curl
# ソースのダウンロード 最新版のURL→ https://openresty.org/en/download.html
wget https://openresty.org/download/openresty-1.21.4.2.tar.gz
# ビルド
tar xvfz openresty-1.21.4.2.tar.gz
cd openresty-1.21.4.2
./configure -j2 # ./configure --helpで指定可能オプション表示
make -j2
make install
# Pathを通す
echo 'export PATH=/usr/local/openresty/bin:/usr/local/openresty/nginx/sbin:$PATH' >> ~/.bashrc
source ~/.bashrc

confはデフォルトでは、/usr/local/openresty/nginx/conf配下
-p オプションで、変更できるみたいですが/etc/nginxとはディレクトリ構成異なるためか、テストコマンドでエラー吐いたので、素直にデフォルトディレクトリにconfファイルは配置。
既存のnginxを参考にユニットファイル作成。
個人的な分かりやすさのために、サービス名はnginx-openresty.serviceとしました。

[Unit]
Description=OpenResty Web Server Service
After=network.target nss-lookup.target

[Service]
Type=forking
PIDFile=/run/nginx-openresty.pid # nginx.conf指定のpidファイル
ExecStartPre=/usr/local/openresty/nginx/sbin/nginx -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/local/openresty/nginx/sbin/nginx -g 'daemon on; master_process on;'
ExecReload=/usr/local/openresty/nginx/sbin/nginx -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/nginx-openresty.pid
TimeoutStopSec=5
KillMode=mixed

[Install]
WantedBy=multi-user.target

使える組み込み変数

  • ngx.var:
    • ngx.var.request_uri: リクエストURI
    • ngx.var.query_string: クエリストリング
    • ngx.var.remote_addr: クライアントのIPアドレス
    • ngx.var.http_user_agent: クライアントのUser-Agentヘッダー
    • ngx.var.host: リクエストが送信されたホストの値
    • ngx.var.server_name: 現在のNginxサーバーブロックのserver_nameディレクティブの値
access_by_lua_block {
    ngx.log(ngx.ERR,"request_uri:", ngx.var.request_uri, " query_string:", ngx.var.query_string, " remote_addr:", ngx.var.remote_addr, " http_user_agent:", ngx.var.http_user_agent, " host:", ngx.var.host, " server_name:", ngx.var.server_name )
}
# 実行結果 (抜粋)
request_uri:/ query_string:nil remote_addr:192.168.200.41 http_user_agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36 Edg/115.0.1901.183 host:192.168.197.52 server_name:tinypilot

外部参照させる

    location / {
      lua_code_cache off; # offにしてるとluaファイルを編集するたびにreloadする必要なくなる。本番運用時はonにする!
      access_by_lua_file <参照させるファイルPath>; 
      # ... 続き(省略)
    }