序章

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をダウンロードします。バージョン番号が変更されている場合は、必ず最新バージョンに置き換えてください。

  1. wget https://openresty.org/download/openresty-1.11.2.2.tar.gz

PGPキーファイルもダウンロードして、ファイルの内容を確認できるようにします。

  1. wget https://openresty.org/download/openresty-1.11.2.2.tar.gz.asc

次に、ダウンロードページにリストされている作成者の公開鍵を追加する必要があります。 これを書いている時点では、これは公開鍵A0E98066です。 ただし、変更されているかどうかを確認してください。 同じダウンロードページにリストされています。

  1. gpg --keyserver pgpkeys.mit.edu --recv-key A0E98066

次の出力が表示されます( sammy の代わりにユーザー名を使用)。

Output
gpg: 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ファイルと一致するかどうかを確認します。

  1. gpg openresty-1.11.2.2.tar.gz.asc

次の出力が表示されます。

Output
gpg: 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の作成者が配布しようとしたファイルであることを示しているため、インストールを続行できます。

次に、ダウンロードしたファイルを解凍し、新しく作成したディレクトリに移動します。

  1. tar -xvf openresty-1.11.2.2.tar.gz
  2. cd openresty-1.11.2.2

OpenRestyをコンパイルするために必要なツールをインストールする必要があります。 ソースからプログラムをコンパイルする方法の詳細については、makeを使用してソースからパッケージをインストールする方法に関するこのチュートリアルを参照してください。

  1. sudo apt-get install build-essential

他のパッケージもインストールする必要があります。

  • readline :これはOpenRestyによってコマンドラインインターフェースに使用されます。
  • ncurses :これは、OpenRestyがコマンドラインインターフェイスに使用するもう1つのソフトウェアです。
  • PCRE :このソフトウェアは、OpenRestyに正規表現機能を提供します。
  • OpenSSL :OpenSSLは、TLS(HTTPS)などの安全な通信に使用されます。
  • Perl :Perlは、OpenRestyで使用できるプログラミング言語です。

これらのパッケージをインストールするには、次のコマンドを実行します。

  1. sudo apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl

これで、OpenRestyのビルドとインストールに必要なすべてのコンポーネントが揃いました。

ステップ2—OpenRestyをインストールする

PCRE正規表現とIPv6サポートを使用してOpenRestyを構成します。 また、-j2フラグを指定して、構築プロセスの一部を並列化します。このフラグは、makeに2つのジョブを同時に実行できることを通知します。 このコマンドは主に、システムですべての依存関係が利用可能かどうかをテストし、後でビルドステップで使用される情報を収集します。 また、LuaJITなどのいくつかの依存関係もすでに構築されています。

  1. ./configure -j2 --with-pcre-jit --with-ipv6

次に、並列処理用の-j2フラグを指定することにより、OpenRestyを構築できます。 これにより、OpenResty自体がコンパイルされます。

  1. make -j2

最後に、OpenRestyをインストールできます。 sudoを使用すると、すべてのファイルをシステム上の正しい場所にコピーできるため、OpenRestyが実行中にファイルを見つけることができます。

  1. sudo make install

Webサーバーが機能するには、ファイアウォールでHTTP接続を許可する必要があります。

  1. sudo ufw allow http

オプションで、sudo ufw allow httpsを使用する場合は、HTTPSを許可することもできます。 ファイアウォールのステータスを確認することで、ファイアウォールの変更を確認できます。

  1. sudo ufw status

表示された出力に許可されたHTTPトラフィック(ポート80)と、追加した場合はHTTPS(ポート443)が表示されます。

Output
Status: 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を起動します。

  1. sudo /usr/local/openresty/bin/openresty

コマンドが成功すると、テキスト出力なしですぐに完了します。 その場合は、ブラウザでhttp://your_server_ipにアクセスしてください。 Welcome to OpenResty!というページが表示され、完全にインストールされて機能していることが確認されます。

これで、OpenRestyサーバーを停止できます。

  1. sudo /usr/local/openresty/bin/openresty -s quit

OpenRestyはインストールされていますが、サーバーを手動で起動する必要がないように、起動時に実行されるようにOpenRestyを構成する必要があります。

ステップ3—OpenRestyをサービスとして設定する

ここでは、OpenRestyをサービスとして設定し、起動時に自動的に起動するようにします。 これは、systemdinitサービスを使用して行います。 詳細についてはこのsystemdの基本チュートリアルを、ユニットファイルの詳細についてはこのユニットファイルチュートリアルをお読みください。

nanoまたはお気に入りのテキストエディタを使用して新しいsystemdファイルを作成することから始めます。

  1. sudo nano /etc/systemd/system/openresty.service

このチュートリアルでは、デフォルトのNginx systemdファイルを新規インストールからコピーし、OpenResty用に変更します。 完全なファイルは次のようになり、開いたばかりのファイルに貼り付ける必要があります。 ファイルの各部分をウォークスルーして、ファイルが何をしているのかを説明します。

/etc/systemd/system/openresty.service
# 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構成ファイルをカスタマイズして、サービスを有効にする必要があります。

最初に構成ファイルを開きます。

  1. sudo nano /usr/local/openresty/nginx/conf/nginx.conf

デフォルトでは、次のようになります。

デフォルト/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行に置き換えます。

/usr/local/openresty/nginx/conf/nginx.confを更新しました
user www-data;
worker_processes  auto;
pid /run/openresty.pid;

events {
    worker_connections  1024;
}

. . .

このファイルは、 www-data ユーザーとして実行されていること、およびOpenRestyによって作成されるpid行により、OpenRestyが実行されていることをsystemdが認識できることを確認します。開始したら。

ファイルを保存して閉じます。

次に、ログディレクトリを作成します。

  1. sudo mkdir /var/log/openresty

systemdサービスをリロードして、ファイルを見つけられるようにします。

  1. sudo systemctl daemon-reload

次に、systemdを介してOpenRestyを起動します。

  1. sudo systemctl start openresty

これで、http://your_server_ipに再度アクセスして、以前と同じWebページを表示できます。 違いは、現在、プロセスがsystemdによって開始されていることです。

最後のステップは、OpenRestyが起動時に開始されることを確認するサービスを有効にすることです。

  1. sudo systemctl enable openresty

systemdサービスとユニットの管理について詳しくは、サービスとユニットのチュートリアルをご覧ください。

サービスを構成したので、OpenRestyをさらに構成して、次のようにすることができます。 共通の場所にログインします。

ステップ4—OpenRestyの構成

OpenRestyを構成するために、デフォルトのNginx構成を参照として使用しました。これにより、おなじみの構成とほぼ一致するようになります。

まず、OpenResty構成ファイルを再度開きます。

  1. sudo nano /usr/local/openresty/nginx/conf/nginx.conf

今回は、httpブロックを変更し、このhttpブロック内のserverブロックを新しいファイルに移動して、構造を改善します。 まず、http {行を見つけて、対応する}の最後の行を除いて、その後のすべてを削除します。

現在の/usr/local/openresty/nginx/conf/nginx.conf
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つずつ確認します。

/usr/local/openresty/nginx/conf/nginx.conf
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ディレクトリを作成します。

  1. sudo mkdir /usr/local/openresty/nginx/sites

defaultサイトを作成します。

  1. sudo nano /usr/local/openresty/nginx/sites/default.conf

この新しいファイルに以下を追加します。 これは、nginx.confからの元のサーバーブロックの再配置ですが、詳細についてはインラインコメントがあります。

/usr/local/openresty/nginx/sites/default.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;
    }
}

ファイルを保存して閉じます。

次に、このサイトの新しいディレクトリを作成します。

  1. sudo mkdir /usr/local/openresty/nginx/html/default

次に、元のindex.htmlを元の場所から新しいディレクトリに移動します。

  1. sudo mv /usr/local/openresty/nginx/html/index.html /usr/local/openresty/nginx/html/default

最後に、OpenRestyを再起動して、この新しいサイトを使用します。

  1. sudo systemctl restart openresty

これで、http://your_server_ipに再度アクセスして、以前と同じWebページを表示できます。

OpenRestyが完全に構成されたので、デフォルトではNginxでは使用できないOpenRestyによって導入された機能のいくつかを試すことができます。

ステップ5—OpenRestyLuaモジュールを使用する

このセクションでは、Luaスクリプトに対応するためにすべて存在するOpenRestyによって追加されたさまざまなモジュールの組み合わせを見ていきます。 このステップ全体で/usr/local/openresty/nginx/sites/default.confを変更するので、最初に開きます。

  1. sudo nano /usr/local/openresty/nginx/sites/default.conf

まず、content_by_lua_block構成オプションについて見ていきます。 以下の設定例からlocationブロックをコピーし、既存の2つのlocationブロックの下のserverブロックに追加します。

/usr/local/openresty/nginx/sites/default.confcontent_by_lua_blockの例
server {
    . . .
    
    location /example {
         default_type 'text/plain';

         content_by_lua_block {
             ngx.say('Hello, Sammy!')
         }
    }
}

ファイルを保存して閉じてから、構成を再ロードします。

  1. sudo systemctl reload openresty

ここでhttp://your_server_ip/exampleにアクセスすると、こんにちは、サミー!というページが表示されます。 これがどのように機能するかを説明しましょう。

content_by_lua_block構成ディレクティブは、その中のすべてをLuaコードとして実行します。 ここでは、Lua関数ngx.sayを使用して、メッセージ Hello、Sammy!をページに出力しました。

別の例として、location /exampleブロックの内容を次のように置き換えます。

/usr/local/openresty/nginx/sites/default.confcontent_by_lua_fileの例
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を作成しましょう。

  1. sudo nano /usr/local/openresty/nginx/html/default/index.lua

以下をファイルに追加し、保存して閉じます。

/usr/local/openresty/nginx/html/default/index.lua
local name = ngx.var.arg_name or "Anonymous"
ngx.say("Hello, ", name, "!")

これは、URL nameのクエリパラメーターを読み取り、グリーティングメッセージをカスタマイズするLuaの単純な部分です。 パラメータが渡されない場合は、代わりに「匿名」が使用されます。

構成を再度ロードします。

  1. 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サーバーブロックチュートリアルでサーバーブロックを設定する方法も学ぶことができますが、そのチュートリアルで使用されているパスを、このチュートリアルで使用されているパスに置き換えてください。 。