Ubuntu 16.04でNginxにOpenResty Web Frameworkを使用する方法

前書き

OpenRestyは、多くの便利なNginxモジュールとLuaライブラリをバンドルしてNginxを拡張するWebサーバーです。 OpenRestyは、Webアプリケーションとサービスのスケーリングに優れています。 たとえば、含まれる1つのモジュールを使用すると、Nginxワーカーで直接実行されるLuaコードを記述でき、高性能アプリケーションが可能になります。

このガイドでは、ソースからOpenRestyをセットアップします。一部のディストリビューションのビルド済みパッケージは古くなっている可能性があります。 また、OpenRestyのユニークな機能を備えた簡単なサンプルアプリケーションもいくつか紹介します。

前提条件

このガイドに従うには、次のものが必要です。

  • 1つのUbuntu 16.04サーバーは、sudo non -rootユーザーとファイアウォール。

Nginxはインストールしないでください。 OpenRestyに含まれており、事前にインストールすると競合します。

ステップ1-OpenRestyのソースコードと依存関係のダウンロード

このセクションでは、ソースからOpenRestyをインストールします。

まず、OpenResty Webサイトのhttp://openresty.org/en/download.html [ダウンロード]ページから最新のOpenRestyソースコードリリースを見つけます。 tarballをダウンロードし、バージョン番号が変更されている場合は、必ず最新バージョンに置き換えてください。

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

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

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

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

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

次の出力が表示されます(* 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)

公開鍵の名前(この場合は「Yichun Zhang」)がOpenResty Webサイトにリストされている名前と一致することを確認します。

ここで、署名ファイルがダウンロードした `+ .tar.gz`ファイルと一致するかどうかを確認します。

gpg openresty-.tar.gz.asc

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

Outputgpg: assuming signed data in `openresty-.tar.gz'
gpg: Signature made Thu 17 Nov 2016 10:24:29 PM UTC using RSA key ID A0E98066
gpg:  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

表示される警告は、このキーが所有者に属しているかどうかを個人的に確認していないためです(つまり、自分の秘密キーで公開キーに署名していない)。 この公開鍵が所有者のものであることを完全に保証する簡単な方法はありません。所有者は完全に信頼されていません。

ただし、この場合、* Good signature *は、このファイルが実際にOpenRestyの作成者が配布することを意図したファイルであることを示しているため、インストールを進めることができます。

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

tar -xvf openresty-.tar.gz
cd openresty-

OpenRestyをコンパイルするために必要なツールをインストールする必要があります。 ソースからプログラムをコンパイルする方法の詳細については、https://www.digitalocean.com/community/tutorials/how-to-compile-and-install-packages-from-source-using-make-on-a-vps [ makeを使用してソースからパッケージをインストールすることに関するこのチュートリアル]。

sudo apt-get install build-essential

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

  • readline:これは、OpenRestyによってコマンドラインインターフェイスに使用されます。

  • ncurses:これは、コマンドラインインターフェイス用にOpenRestyで使用される別のソフトウェアです。

  • 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を構成します。 また、2つのジョブを同時に実行できることを「+ make 」に伝える「 -j2 +」フラグを指定して、構築プロセスの一部を並列化します。 このコマンドは、ほとんどすべての依存関係がシステムで使用可能かどうかをテストし、後のビルドステップで使用される情報を収集します。 また、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


OpenSSH (v6)               ALLOW       Anywhere (v6)

これで、インストールが機能したかどうかを確認できます。 まず、OpenRestyを起動します。

sudo /usr/local/openresty/bin/openresty

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

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

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

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

ステップ3-サービスとしてのOpenRestyのセットアップ

ここでは、OpenRestyをサービスとして設定して、ブート時に自動的に開始されるようにします。 + systemd + initサービスを使用してこれを行います。 詳細についてはhttps://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal [このsystemdの基本チュートリアル]を参照してください。https:// www .digitalocean.com / community / tutorials / understanding-systemd-units-and-unit-files [このユニットファイルチュートリアル]では、ユニットファイルの詳細について説明しています。

最初に、 `+ nano `またはお気に入りのテキストエディターで新しい ` systemd +`ファイルを作成します。

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 `は、 ` ExecStart `で呼び出すプロセスがバックグラウンドでサービスを開始し、終了後にプロセスが停止することを ` systemd +`に伝えます。

  • `+ PIDFile = / run / openresty.pid `は、OpenRestyが起動時に作成するPIDファイルの場所を ` systemd `に指示します。 これにより、 ` systemd +`はOpenRestyがまだ実行中かどうかを知ることができます。

  • `+ ExecStartPre = / usr / local / openresty / bin / openresty -t -q -g 'デーモンオン; master_process on; '+ `は、OpenRestyスクリプトを起動せずに呼び出します。 `+ -t `フラグは、OpenRestyに設定ファイルのみをテストしたいことを伝えます。 ` -q `フラグは、エラー以外の出力を抑制したいことを伝えます。 ` -g `フラグは、グローバルディレクティブ ` daemonをオンに設定します。 master_process on + `は、OpenRestyをデーモンとしてバックグラウンドで起動することを指示します。 このスクリプトを「+ 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 + `に指示します。 PIDファイルにリストされているプロセスに「+ SIGSTOP 」を送信しました。 5秒後にまだ実行されている場合、「 systemd +」は次の2つのオプションを介して制御します。

  • `+ TimeoutStopSec = 5 `は、5秒以内にプロセスを停止したいことを ` systemd `に伝えます。 停止しない場合、 ` systemd +`は強制的にOpenRestの停止を試みます。

  • `+ KillMode = mixed `は、5秒後に停止しなかった場合に ` systemd +`が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

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

デフォルト/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

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:// `に再度アクセスして、以前と同じWebページを表示できます。 違いは、プロセスが ` systemd +`によって開始されたことです。

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

sudo systemctl enable openresty

servicesで `+ systemd +`サービスとユニットの管理について詳しく知ることができます。およびユニットのチュートリアル]。

サービスを構成したので、OpenRestyをさらに構成して、たとえば 共通の場所にログを記録します。

ステップ4-OpenRestyの構成

OpenRestyを構成するために、デフォルトのNginx構成を参照として使用しているため、使い慣れたものとほぼ一致します。

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

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を構成します。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 +`からの元のサーバーブロックの再配置ですが、詳細についてはインラインコメントがあります。

/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;
   }
}

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

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

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:// +」にアクセスして、以前と同じWebページを表示できます。

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

ステップ5-OpenResty Luaモジュールの使用

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

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

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

/usr/local/openresty/nginx/sites/default.conf content_by_lua_blockの例

server {
   . . .

   location /example {
        default_type 'text/plain';

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

ファイルを保存して閉じてから、構成を再読み込みします。

sudo systemctl reload openresty

今すぐ `+ http:/// example +`にアクセスすると、* Hello、Sammy!*というページが表示されます。 これがどのように機能するかを説明しましょう。

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

別の例として、 `+ location / example +`ブロックの内容をこれに置き換えます:

/usr/local/openresty/nginx/sites/default.conf content_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 +

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の単純な部分です。 パラメータが渡されない場合、代わりに「匿名」が使用されます。

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

sudo systemctl reload openresty

さて、ブラウザで `+ http:/// example?name = `にアクセスしてください。 これにより、* Hello、Sammy!*と表示されます。 ` name +`クエリパラメータを変更するか、完全に省略することができます。

Hello, Sammy!

`+ name +`クエリパラメータを変更して、他の名前を表示することもできます。

結論

この記事では、OpenRestyをセットアップします。これにより、NginxワーカーでLuaスクリプトを使用できるようになります。 より複雑なLuaスクリプトを作成することは可能です。 また、たとえば、Luaスクリプトを使用してアクセスを制限したり、Luaを使用して特定の要求を書き換えたりすることもできます。 ドキュメントはhttps://github.com/openresty/lua-nginx-module[lua-nginx-moduleのGitHubページ]にあります。 Lapisなど、OpenRestyでLuaを使用する完全なWebフレームワークもあります。

詳細については、http://openresty.org/en/ [OpenResty Webサイト]をご覧ください。 OpenRestyは単なるNginxの拡張インストールであるため、https://www.digitalocean.com/community/tutorials/how-to-set-up-nginx-server-blocks-virtualでサーバーブロックを設定する方法も学習できます。 -hosts-on-ubuntu-16-04 [Nginxサーバーはチュートリアルをブロックします]が、そのチュートリアルで使用されているパスを、このチュートリアルで使用されているパスに置き換えてください。

Related