nginx上でJavascriptを使って制御をかける njs モジュールを使ってみました。
nginx のインストール
nginxのインストールは、Ubutnuのディストリビューションレポジトリからもインストールできますが、
njs モジュールがないため、nginxのレポジトリからインストールをします。
インストールは 公式サイト が参考になります。
$ sudo apt install curl gnupg2 ca-certificates lsb-release
$ echo "deb http://nginx.org/packages/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
$ curl -fsSL https://nginx.org/keys/nginx_signing.key | sudo apt-key add -
下記が表示されたらOKです。
OK
$ sudo apt-key fingerprint ABF5BD827BD9BF62
下記が表示されたらOKです。
pub rsa2048 2011-08-19 [SC] [有効期限: 2024-06-14]
573B FD6B 3D8F BC64 1079 A6AB ABF5 BD82 7BD9 BF62
uid [ 不明 ] nginx signing key <signing-key@nginx.com>
$ sudo apt update
$ sudo apt install nginx
$ sudo systemctl enable nginx
$ sudo systemctl start nginx
nginxの確認
$ curl http://localhost/
下記が表示されたらOKです。
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
nginx-module-njsのインストール
次に、njsを使うためのモジュールをインストールします。
$ sudo apt install nginx-module-njs
javascript で hello world
公式サイト を参考に
Hello Worldを HTTP STATUS 200 で返す設定をしてみます。
$ sudo vi /etc/nginx/hello_world.js
下記のように編集します。
function hello(r) {
r.return(200, "Hello world!");
}
$ sudo vi /etc/nginx/nginx.conf
下記のように編集します。
...
load_module modules/ngx_http_js_module.so;
...
events {
worker_connections 1024;
}
...
http {
js_include hello_world.js;
...
$ sudo vi /etc/nginx/conf.d/njs.conf
下記のように編集します。
server {
listen 8000;
location / {
js_content hello;
}
}
$ nginx -s reload
動作を確認します。
$ curl http://localhost:8000/
Hello world!
すばらしい!
Javascriptで書けるというのは、保守性が高まるのでありがたいですね。
なお、njs ではサブクエリも実行できますが、非同期に処理されるため、
結果を受け取って何かするということはできないようです。
そういった場合は、従来通り、nginx_lua_module などを使う必要がありそうです。