Ubuntu16.04でNginx用のOpenRestyWebフレームワークを使用する方法
序章
OpenResty は、多くの便利なNginxモジュールとLuaライブラリをバンドルすることでNginxを拡張するWebサーバーです。 OpenRestyは、Webアプリケーションとサービスのスケーリングに優れています。 たとえば、含まれている1つのモジュールを使用すると、Nginxワーカーで直接実行されるLuaコードを記述して、高性能アプリケーションを実現できます。
このガイドでは、ソースからOpenRestyを設定します。 一部のディストリビューションのビルド済みパッケージは古くなっている可能性があります。 また、OpenRestyの独自の機能を備えたいくつかの簡単なサンプルアプリケーションについても説明します。
前提条件
このガイドに従うには、次のものが必要です。
- Ubuntu 16.04 チュートリアルを使用した初期サーバーセットアップ(sudo非rootユーザーとファイアウォールを含む)に従ってセットアップされた1つのUbuntu16.04サーバー。
Nginxはではなくインストールする必要があることに注意してください。 これはOpenRestyに含まれており、事前にインストールしておくと競合します。
ステップ1—OpenRestyのソースコードと依存関係をダウンロードする
このセクションでは、OpenRestyをソースからインストールします。
まず、OpenRestyWebサイトのダウンロードページから最新のOpenRestyソースコードリリースを見つけます。 tarballをダウンロードします。バージョン番号が変更されている場合は、必ず最新バージョンに置き換えてください。
- wget https://openresty.org/download/openresty-1.11.2.2.tar.gz
PGPキーファイルもダウンロードして、ファイルの内容を確認できるようにします。
- wget https://openresty.org/download/openresty-1.11.2.2.tar.gz.asc
次に、ダウンロードページにリストされている作成者の公開鍵を追加する必要があります。 これを書いている時点では、これは公開鍵A0E98066
です。 ただし、変更されているかどうかを確認してください。 同じダウンロードページにリストされています。
- gpg --keyserver pgpkeys.mit.edu --recv-key A0E98066
次の出力が表示されます( sammy の代わりにユーザー名を使用)。
Outputgpg: directory `/home/sammy/.gnupg' created
gpg: new configuration file `/home/sammy/.gnupg/gpg.conf' created
gpg: WARNING: options in `/home/sammy/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/home/sammy/.gnupg/secring.gpg' created
gpg: keyring `/home/sammy/.gnupg/pubring.gpg' created
gpg: requesting key A0E98066 from hkp server pgpkeys.mit.edu
gpg: /home/sammy/.gnupg/trustdb.gpg: trustdb created
gpg: key A0E98066: public key "Yichun Zhang (agentzh) <[email protected]>" imported
gpg: Total number processed: 1
gpg: imported: 1 (RSA: 1)
公開鍵の名前(この場合は「YichunZhang」)がOpenRestyWebサイトにリストされている名前と一致することを確認します。
次に、署名ファイルがダウンロードした.tar.gz
ファイルと一致するかどうかを確認します。
- gpg openresty-1.11.2.2.tar.gz.asc
次の出力が表示されます。
Outputgpg: assuming signed data in `openresty-1.11.2.2.tar.gz'
gpg: Signature made Thu 17 Nov 2016 10:24:29 PM UTC using RSA key ID A0E98066
gpg: Good signature from "Yichun Zhang (agentzh) <[email protected]>"
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: 2545 1EB0 8846 0026 195B D62C B550 E09E A0E9 8066
表示される警告は、この鍵が所有者のものであるかどうかを個人的に確認していないためです(つまり、自分の秘密鍵で公開鍵に署名していません)。 この公開鍵が所有者のものであることを完全に保証する簡単な方法はありませんが、完全に信頼されているわけではありません。
ただし、この場合、良好な署名は、このファイルが実際にOpenRestyの作成者が配布しようとしたファイルであることを示しているため、インストールを続行できます。
次に、ダウンロードしたファイルを解凍し、新しく作成したディレクトリに移動します。
- tar -xvf openresty-1.11.2.2.tar.gz
- cd openresty-1.11.2.2
OpenRestyをコンパイルするために必要なツールをインストールする必要があります。 ソースからプログラムをコンパイルする方法の詳細については、makeを使用してソースからパッケージをインストールする方法に関するこのチュートリアルを参照してください。
- sudo apt-get install build-essential
他のパッケージもインストールする必要があります。
- readline :これはOpenRestyによってコマンドラインインターフェースに使用されます。
- ncurses :これは、OpenRestyがコマンドラインインターフェイスに使用するもう1つのソフトウェアです。
- PCRE :このソフトウェアは、OpenRestyに正規表現機能を提供します。
- OpenSSL :OpenSSLは、TLS(HTTPS)などの安全な通信に使用されます。
- Perl :Perlは、OpenRestyで使用できるプログラミング言語です。
これらのパッケージをインストールするには、次のコマンドを実行します。
- sudo apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl
これで、OpenRestyのビルドとインストールに必要なすべてのコンポーネントが揃いました。
ステップ2—OpenRestyをインストールする
PCRE正規表現とIPv6サポートを使用してOpenRestyを構成します。 また、-j2
フラグを指定して、構築プロセスの一部を並列化します。このフラグは、make
に2つのジョブを同時に実行できることを通知します。 このコマンドは主に、システムですべての依存関係が利用可能かどうかをテストし、後でビルドステップで使用される情報を収集します。 また、LuaJITなどのいくつかの依存関係もすでに構築されています。
- ./configure -j2 --with-pcre-jit --with-ipv6
次に、並列処理用の-j2
フラグを指定することにより、OpenRestyを構築できます。 これにより、OpenResty自体がコンパイルされます。
- make -j2
最後に、OpenRestyをインストールできます。 sudo
を使用すると、すべてのファイルをシステム上の正しい場所にコピーできるため、OpenRestyが実行中にファイルを見つけることができます。
- sudo make install
Webサーバーが機能するには、ファイアウォールでHTTP接続を許可する必要があります。
- sudo ufw allow http
オプションで、sudo ufw allow https
を使用する場合は、HTTPSを許可することもできます。 ファイアウォールのステータスを確認することで、ファイアウォールの変更を確認できます。
- sudo ufw status
表示された出力に許可されたHTTPトラフィック(ポート80
)と、追加した場合はHTTPS(ポート443
)が表示されます。
OutputStatus: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
80 ALLOW Anywhere
443 ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
80 (v6) ALLOW Anywhere (v6)
443 (v6) ALLOW Anywhere (v6)
これで、インストールが機能したかどうかを確認できます。 まず、OpenRestyを起動します。
- sudo /usr/local/openresty/bin/openresty
コマンドが成功すると、テキスト出力なしですぐに完了します。 その場合は、ブラウザでhttp://your_server_ip
にアクセスしてください。 Welcome to OpenResty!というページが表示され、完全にインストールされて機能していることが確認されます。
これで、OpenRestyサーバーを停止できます。
- sudo /usr/local/openresty/bin/openresty -s quit
OpenRestyはインストールされていますが、サーバーを手動で起動する必要がないように、起動時に実行されるようにOpenRestyを構成する必要があります。
ステップ3—OpenRestyをサービスとして設定する
ここでは、OpenRestyをサービスとして設定し、起動時に自動的に起動するようにします。 これは、systemd
initサービスを使用して行います。 詳細についてはこのsystemdの基本チュートリアルを、ユニットファイルの詳細についてはこのユニットファイルチュートリアルをお読みください。
nano
またはお気に入りのテキストエディタを使用して新しいsystemd
ファイルを作成することから始めます。
- sudo nano /etc/systemd/system/openresty.service
このチュートリアルでは、デフォルトのNginx systemd
ファイルを新規インストールからコピーし、OpenResty用に変更します。 完全なファイルは次のようになり、開いたばかりのファイルに貼り付ける必要があります。 ファイルの各部分をウォークスルーして、ファイルが何をしているのかを説明します。
# Stop dance for OpenResty
# A modification of the Nginx systemd script
# =======================
#
# ExecStop sends SIGSTOP (graceful stop) to the Nginx process.
# If, after 5s (--retry QUIT/5) OpenResty is still running, systemd takes control
# and sends SIGTERM (fast shutdown) to the main process.
# After another 5s (TimeoutStopSec=5), and if OpenResty is alive, systemd sends
# SIGKILL to all the remaining processes in the process group (KillMode=mixed).
#
# Nginx signals reference doc:
# http://nginx.org/en/docs/control.html
#
[Unit]
Description=A dynamic web platform based on Nginx and LuaJIT.
After=network.target
[Service]
Type=forking
PIDFile=/run/openresty.pid
ExecStartPre=/usr/local/openresty/bin/openresty -t -q -g 'daemon on; master_process on;'
ExecStart=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;'
ExecReload=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;' -s reload
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/openresty.pid
TimeoutStopSec=5
KillMode=mixed
[Install]
WantedBy=multi-user.target
[Unit]
セクション:
After=network.target
は、ネットワークが起動した後にOpenRestyを起動して、OpenRestyがポートをバインドしてリッスンできるようにします。 これにより、外部からアクセスできます。
[Service]
セクション:
-
Type=forking
は、systemd
に、ExecStart
で呼び出すプロセスがバックグラウンドでサービスを開始し、終了後にプロセスが自動的に停止することを通知します。 -
PIDFile=/run/openresty.pid
は、OpenRestyが起動時に作成するPIDファイルの場所をsystemd
に通知します。 これにより、systemd
はOpenRestyがまだ実行されているかどうかを知ることができます。 -
ExecStartPre=/usr/local/openresty/bin/openresty -t -q -g 'daemon on; master_process on;'
は、OpenRestyスクリプトを起動せずに呼び出します。-t
フラグは、OpenRestyに構成ファイルのテストのみを行うように指示します。-q
フラグは、エラー以外の出力を抑制したいことを示します。-g
フラグは、OpenRestyにデーモンとしてバックグラウンドで開始するように指示するグローバルディレクティブdaemon on; master_process on
を設定します。 このスクリプトをExecStartPre
として実行し、systemd
が構成ファイルが無効な場合にOpenRestyを起動しようとしないようにします。これは、このコマンドでエラーが発生するためです。 -
ExecStart=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;'
は実際にOpenReestyを起動します。 これは、-t
フラグのないExecStartPre
と同じです。 -
ExecReload=/usr/local/openresty/bin/openresty -g 'daemon on; master_process on;' -s reload
は、systemctl reload openresty
を実行するときに、このコマンドを実行するようにsystemd
に指示します。-s
フラグは、OpenRestyに構成ファイルをリロードするように指示します。 -
ExecStop=-/sbin/start-stop-daemon --quiet --stop --retry QUIT/5 --pidfile /run/openresty.pid
は、OpenRestyが停止しているときにこのコマンドを実行するようにsystemd
に指示します。SIGSTOP
をPIDファイルにリストされているプロセスに送信します。 5秒後も実行されている場合は、systemd
が次の2つのオプションを介して制御します。 -
TimeoutStopSec=5
は、systemd
にプロセスを5秒で停止するように指示します。 停止しない場合、systemd
はOpenRestを強制的に停止しようとします。 -
KillMode=mixed
は、systemd
が5秒経過してもOpenRestyを停止しない場合にOpenRestyを停止する方法を指定します。
[Install]
セクション:
WantedBy=multi-user.target
は、起動時にサービスを開始するように構成されている場合に、サービスをいつ開始するかをsystemd
に通知します。multi-user.target
は、マルチユーザーシステムが開始された場合にのみサービスが開始されることを意味します。 OpenRestyを別のユーザーとして実行できます。
etc/systemd/system/openresty.service
ファイルは以上です。 次に、OpenResty Nginx構成ファイルをカスタマイズして、サービスを有効にする必要があります。
最初に構成ファイルを開きます。
- sudo nano /usr/local/openresty/nginx/conf/nginx.conf
デフォルトでは、次のようになります。
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
. . .
events {
行の前のすべてを削除し、次の3行に置き換えます。
user www-data;
worker_processes auto;
pid /run/openresty.pid;
events {
worker_connections 1024;
}
. . .
このファイルは、 www-data ユーザーとして実行されていること、およびOpenRestyによって作成されるpid
行により、OpenRestyが実行されていることをsystemd
が認識できることを確認します。開始したら。
ファイルを保存して閉じます。
次に、ログディレクトリを作成します。
- sudo mkdir /var/log/openresty
systemd
サービスをリロードして、ファイルを見つけられるようにします。
- sudo systemctl daemon-reload
次に、systemd
を介してOpenRestyを起動します。
- sudo systemctl start openresty
これで、http://your_server_ip
に再度アクセスして、以前と同じWebページを表示できます。 違いは、現在、プロセスがsystemd
によって開始されていることです。
最後のステップは、OpenRestyが起動時に開始されることを確認するサービスを有効にすることです。
- sudo systemctl enable openresty
systemd
サービスとユニットの管理について詳しくは、サービスとユニットのチュートリアルをご覧ください。
サービスを構成したので、OpenRestyをさらに構成して、次のようにすることができます。 共通の場所にログインします。
ステップ4—OpenRestyの構成
OpenRestyを構成するために、デフォルトのNginx構成を参照として使用しました。これにより、おなじみの構成とほぼ一致するようになります。
まず、OpenResty構成ファイルを再度開きます。
- sudo nano /usr/local/openresty/nginx/conf/nginx.conf
今回は、http
ブロックを変更し、このhttp
ブロック内のserver
ブロックを新しいファイルに移動して、構造を改善します。 まず、http {
行を見つけて、対応する}
の最後の行を除いて、その後のすべてを削除します。
user www-data;
worker_processes auto;
pid /run/openresty.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
. . .
}
次に、以下をhttp
ブロックにコピーして、ファイル全体が次のようになるようにします。 変更を1つずつ確認します。
user www-data;
worker_processes auto;
pid /run/openresty.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
ssl_prefer_server_ciphers on;
access_log /var/log/openresty/access.log;
error_log /var/log/openresty/error.log;
gzip on;
gzip_disable "msie6";
include ../sites/*;
}
ファイルを保存して閉じます。
デフォルトファイルに加えた変更は次のとおりです。
-
tcp_nopush on;
のコメントを解除します。これは、OpenRestyに完全なパケットのみを送信するように指示します。 このオプションは、sendfile
オプションを使用する場合に役立ちます。これにより、OpenRestyは静的ファイルのクライアントへの送信を最適化できます。 -
tcp_nodelay on;
を追加します。 このオプションは、できるだけ早くパケットを送信しようとします。これは、上記のオプションとは逆に見えるかもしれませんが、別の時間に使用されます。tcp_nodelay
は、HTTPリクエストでkeepalive
オプションを使用する場合にのみ使用されます。これは、リクエストが行われるたびにHTTP接続を開始するオーバーヘッドを回避するWebブラウザによるWebサーバーへの接続です。作る。 -
ssl_protocols
およびssl_prefer_server_ciphers
行の追加と変更。 これらのオプションは、OpenRestyのSSLオプションを構成します。 POODLE攻撃など、HTTPSに対する既知の攻撃に対して脆弱な古いプロトコルを削除しました。 -
access_log
およびerror_log
行を追加します。これにより、Webサーバーのログの場所が構成されます。 前の手順で作成した/var/log/openresty
ディレクトリにログを保存します。 -
gzip on
のコメントを解除し、gzip_disable "msie6"
を追加します。 これらのオプションはGZIPを構成し、転送するデータが少なくなるようにWebページを圧縮します。 Internet Explorer 6(およびそれ以前)はGZIPコンテンツを常に適切に処理するとは限らないため、最後のオプションも追加します。 -
include ../sites/*;
を追加します。これは、OpenRestyに/usr/local/openresty/nginx/sites
ディレクトリで追加の構成ファイルを探すように指示します。これはすぐに作成されます。 -
すべての
server
ブロックを削除します。これは、この手順の後半で新しいファイルに再配置します。
次に、include
行で指定した新しいsites
ディレクトリを作成します。
- sudo mkdir /usr/local/openresty/nginx/sites
default
サイトを作成します。
- sudo nano /usr/local/openresty/nginx/sites/default.conf
この新しいファイルに以下を追加します。 これは、nginx.conf
からの元のサーバーブロックの再配置ですが、詳細についてはインラインコメントがあります。
server {
# Listen on port 80.
listen 80 default_server;
listen [::]:80 default_server;
# The document root.
root /usr/local/openresty/nginx/html/default;
# Add index.php if you are using PHP.
index index.html index.htm;
# The server name, which isn't relevant in this case, because we only have one.
server_name _;
# When we try to access this site...
location / {
# ... first attempt to serve request as file, then as a directory,
# then fall back to displaying a 404.
try_files $uri $uri/ =404;
}
# Redirect server error pages to the static page /50x.html.
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/local/openresty/nginx/html;
}
}
ファイルを保存して閉じます。
次に、このサイトの新しいディレクトリを作成します。
- sudo mkdir /usr/local/openresty/nginx/html/default
次に、元のindex.html
を元の場所から新しいディレクトリに移動します。
- sudo mv /usr/local/openresty/nginx/html/index.html /usr/local/openresty/nginx/html/default
最後に、OpenRestyを再起動して、この新しいサイトを使用します。
- sudo systemctl restart openresty
これで、http://your_server_ip
に再度アクセスして、以前と同じWebページを表示できます。
OpenRestyが完全に構成されたので、デフォルトではNginxでは使用できないOpenRestyによって導入された機能のいくつかを試すことができます。
ステップ5—OpenRestyLuaモジュールを使用する
このセクションでは、Luaスクリプトに対応するためにすべて存在するOpenRestyによって追加されたさまざまなモジュールの組み合わせを見ていきます。 このステップ全体で/usr/local/openresty/nginx/sites/default.conf
を変更するので、最初に開きます。
- sudo nano /usr/local/openresty/nginx/sites/default.conf
まず、content_by_lua_block
構成オプションについて見ていきます。 以下の設定例からlocation
ブロックをコピーし、既存の2つのlocation
ブロックの下のserver
ブロックに追加します。
server {
. . .
location /example {
default_type 'text/plain';
content_by_lua_block {
ngx.say('Hello, Sammy!')
}
}
}
ファイルを保存して閉じてから、構成を再ロードします。
- sudo systemctl reload openresty
ここでhttp://your_server_ip/example
にアクセスすると、こんにちは、サミー!というページが表示されます。 これがどのように機能するかを説明しましょう。
content_by_lua_block
構成ディレクティブは、その中のすべてをLuaコードとして実行します。 ここでは、Lua関数ngx.say
を使用して、メッセージ Hello、Sammy!をページに出力しました。
別の例として、location /example
ブロックの内容を次のように置き換えます。
server {
. . .
location /example {
default_type 'text/plain';
content_by_lua_file /usr/local/openresty/nginx/html/default/index.lua;
}
}
content_by_lua_file
は外部ファイルからLuaコンテンツをロードするので、上記で指定した/usr/local/openresty/nginx/html/default/index.lua
を作成しましょう。
- sudo nano /usr/local/openresty/nginx/html/default/index.lua
以下をファイルに追加し、保存して閉じます。
local name = ngx.var.arg_name or "Anonymous"
ngx.say("Hello, ", name, "!")
これは、URL name
のクエリパラメーターを読み取り、グリーティングメッセージをカスタマイズするLuaの単純な部分です。 パラメータが渡されない場合は、代わりに「匿名」が使用されます。
構成を再度ロードします。
- sudo systemctl reload openresty
次に、ブラウザでhttp://your_server_ip/example?name=Sammy
にアクセスします。 こんにちは、サミー!が表示されます。 name
クエリパラメータを変更することも、完全に省略することもできます。
Hello, Sammy!
name
クエリパラメータを変更して、他の名前を表示することもできます。
警告:ロードしているLuaファイルをWebからアクセス可能な場所に配置しないでください。 その場合、誰かがこのファイルにアクセスすると、アプリケーションコードが含まれる可能性があります。 たとえば、ドキュメントルートを/usr/local/openresty/nginx/html/default/public
に変更し、Luaファイルをその1つ上のディレクトリに配置することにより、ファイルをドキュメントルートの外側に配置します。
結論
この記事では、OpenRestyを設定します。これにより、NginxワーカーでLuaスクリプトを使用できるようになります。 より複雑なLuaスクリプトを作成することが可能です。 たとえば、Luaスクリプトを使用してアクセスを制限したり、Luaを使用して特定のリクエストを書き換えたりすることもできます。 ドキュメントはlua-nginx-moduleのGitHubページにあります。 Lapis など、OpenRestyでLuaを使用する完全なWebフレームワークもあります。
詳細については、OpenRestyのWebサイトにアクセスしてください。 OpenRestyは単なる拡張Nginxインストールであるため、 Nginxサーバーブロックチュートリアルでサーバーブロックを設定する方法も学ぶことができますが、そのチュートリアルで使用されているパスを、このチュートリアルで使用されているパスに置き換えてください。 。