Nginx njs スクリプト、API サービスのシンプルな実装

NJS スクリプトとは何ですか?

njs は、nginx の機能を拡張できる JavaScript 言語のサブセットです。 njs は、ECMAScript 5.1 (厳密モード) および特定の ECMAScript 6 以降の拡張機能に準拠するように作成されました。コンプライアンスは依然として進化しています。 簡単に言うと、JavaScriptを使ってnginxで簡単なサーバープログラムを書くことです。

njs スクリプトを使用する理由

  • njs スクリプトの利点
  1. jsを使用して開発されているため、開発が簡単です。迅速な開発を促進します
  2. 導入は簡単で、nginx さえあれば、他のものを導入する必要がなく、サーバーのパフォーマンス要件が非常に低く、他のサービスと共存するのが簡単です。
  3. API レベルで安定した状態を維持でき、将来フロントエンドに影響を与えることなく他の実装に変換できます。

njs スクリプトは、プロジェクトの初期段階でサーバー側の機能が必要だが、迅速に開発および展開できる単純な実装のみを希望し、他の側面に対する要件が必要ない人に適しています。しかし、私は API が安定したままであることを望みますし、将来サーバーがアップグレードされたときにフロントエンドを変更する必要がないことを望みます。

njs スクリプトの例

簡単な例を通じて njs スクリプトを体験してください。この例の API は次のとおりです。 http://xxx.xxx.xxx/fetch_data?offset=?&limit=? サーバーからデータを取得する場合、offset は開始位置、limit は一度に取得する量です。リスト ページやウォーターフォール ページでの表示には、同様の API が必要になることがよくあります。一般的な実装では、データをデータベースに置き、SQL を通じてデータを取得し、それを表示のためにフロントエンドに送信します。一般に、これを行うにはアプリケーション サーバーとデータベースが必要ですが、一部のプロジェクトでは必要なく、開発と展開が複雑すぎます。

環境インストール構成

apt-getを使用して直接ubuntuにインストールしました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
Add the following line to /etc/apt/sources.list:
deb https://nginx.org/packages/ubuntu/ focal nginx
Install GPG key of the repository:

# wget https://nginx.org/keys/nginx_signing.key
# sudo apt-key add nginx_signing.key
Update the package index:
# sudo apt-get update
Install nginx-module-njs deb package:
# sudo apt-get install nginx-module-njs

nginxの設定ファイルは以下の通りです

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
js_import /path/to/jsfile.js;   //你的JS文件的路径
server {
    server_name xxxx.com;
    access_log /var/log/nginx/xxxx.com.access.log;
    error_log /var/log/nginx/xxxx.com.error.log info; //使用 info 级别 可以打出log,便于开发中的调试
    root /path/to/your/html;

    location /xxxxx {
        add_header  Content-Type 'application/json';
        js_content jsfile.your_func_name;
    }
}

JSファイル

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
function your_func_name(r) {
  var offset = 0; //default offset
  var limit = 20; //default limit

  // r.log('r.args.offset=' + r.args.offset);
  if(Number.isInteger(+r.args.offset)) {
    offset = parseInt(r.args.offset);
  }
  r.log('offset=' + offset);

  // r.log('r.args.limit=' + r.args.limit);
  if(Number.isInteger(+r.args.limit)) {
    limit = parseInt(r.args.limit);
  }
  r.log('limit=' + limit);

  var fs = require('fs').promises;
  fs.readFile("/path/data.json").
    then((data) => {
      var json = JSON.parse(data.toString());
      var output = [];
      for (var i = offset; (i < json.length) && (i < offset + limit); i++) {
        r.log('i=' + i);
        output.push(json[i]);
      }
      r.return(200, JSON.stringify(output));
    }).catch((error) => r.return(400, error));
}

export default { your_func_name };
  1. r.args はリクエスト内のパラメータを取得できます。たとえば、r.args.offset はリクエスト (http://xxx.com/api_name?offset=1) のオフセット パラメーターの値を取得できます。
  2. r.logはログを出力することができ、nginxで設定したファイルにログが出力されます。ログレベルに注意してください。 error_log /var/log/nginx/xxxx.com.error.log 情報; //情報レベルを使用してログを記録します。これは開発中のデバッグに便利です
  3. r.return は結果を返すことができます
  4. インスタンス内のデータは json ファイルに保存され、API はオフセットと制限を通じてその一部を出力します。
  5. JS ファイルを変更した後、それを有効にするために nginx を再起動する必要があります。

data.json

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
    [
        {
            "a": "v1",
            "b": "v2",
            "c": "v3"
        },
        {
            "a": "v1",
            "b": "v2",
            "c": "v3"
        },
        {
            "a": "v1",
            "b": "v2",
            "c": "v3"
        }
    ]
记录并分享
Hugo で構築されています。
テーマ StackJimmy によって設計されています。