人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動態(tài)

利用njs模塊在nginx配置中引入js腳本

發(fā)布日期:2022-02-01 00:40 | 文章來源:源碼中國

由于許多 web 開發(fā)并不熟悉 lua 語言. 因此 nginx 推出了 njs 模塊, 可以在 nginx 的配置中引入 js 腳本, 從而實現(xiàn)一些更復雜的 nginx 配置功能.

以下介紹 njs 模塊的特性和用法

一 安裝 NJS 模塊

要求 nginx 的版本大于 1.9.11, 因為從該版本才開始支持 load_module 指令

方法一: 動態(tài)加載 NJS 模塊

注意: 不同版本的 nginx 需要相應版本的 NJS 模塊.

  • 將 ngx_http_js_module.so 文件放在nginx 根目錄的 modules 目錄下,
  • 在 nginx.conf 中增加引入模塊
load_module modules/ngx_http_js_module.so;
load_module modules/ngx_stream_js_module.so;

方法二: 編譯時增加模塊

下載源碼 https://hg.nginx.org/njs/?_ga=2.99259804.301589667.1638621670-451035464.1638621670

該倉庫在mercurial中管理, 需要使用 hg 命令下載源碼

hg clone  http://hg.nginx.org/njs

nginx 編譯時增加如下配置

./configure --add-module=<path to njs>/njs/nginx

二 NJS模塊運行環(huán)境的特點

NJS 模塊并不是運行一個 Nodejs, 因此 nginx js 只能像 lua 模塊一樣作為 nginx 的一個中間件, 無法獨立作為一個完整的后臺服務.

與前端同學熟悉的 node 或瀏覽器中運行環(huán)境不同. njs 并沒有使用 v8 解析引擎, nginx 官方基于 ECMAScript 語言規(guī)范定制了一個解析引擎. 因此支持的語法和特性也與標準有所不同.

1. 每次請求時創(chuàng)建運行時環(huán)境, 請求結束時銷毀

node 運行時啟動的虛擬機是常駐內存的, 且該虛擬機運行時會自動完成內存的垃圾回收.

而 NJS 會在每次請求時創(chuàng)建一個新的虛擬機并分配內存, 在請求結束時銷毀該虛擬機并釋放內存.

2. 非阻塞代碼執(zhí)行

njs 采用事件驅動模型對 NJS 運行時環(huán)境進行調度。當 NJS 執(zhí)行阻塞操作(例如讀取網絡數據或發(fā)出外部子請求)時,Nginx 會掛起當前 NJS VM 的執(zhí)行,并在事件完成時重新調度。因此 NJS 的代碼可以以簡單的線性方式來寫

3. 只支持部分 ECAMA 規(guī)范的語法

NJS 基于ECMAScript 5.1 規(guī)范, 并支持 ECMAScript 6 中的部分函數

支持的語法列表 https://nginx.org/en/docs/NJS/compatibility.html?_ga=2.91935000.301589667.1638621670-451035464.1638621670

4. 集成請求處理過程

Nginx 對請求的處理包含多個階段. Nginx的指令通常在某個指定的階運行對請求進行處理. Nginx 的模塊也正是利用這個能力, 來調試或修改一個請求.

NJS 模塊也是通過指令的形式, 實現(xiàn)在特定的階段運行 js 代碼邏輯.

三 NJS 模塊支持的指令及對應的處理階段

處理階段 HTTP 模塊 Stream 模塊
Access – Authentication and access control auth_request and js_content js_access
Pre-read – Read/write payload N/A js_preread
Filter – Read/write response during proxy js_body_filter js_header_filter js_filter
Content – Send response to client js_content N/A
Log / Variables – Evaluated on demand js_set js_set

四 NJS 的簡單用法示例

以下示例用 js 定義一種 log 的格式

在 Nginx 配置目錄下創(chuàng)建一個 logging.js 文件

// 文件位置: [nginx根目錄]/conf/logging.js
// 文件內容: 解析請求, 打印出所有的請求頭
function logAllHeaders(r) {
    var log = `${r.variables.time_iso8601} client=${r.remoteAddress} method=${r.method} uri=${r.uri} status=${r.status}`;
    r.rawHeadersIn.forEach(h => log += ` in.${h[0]}=${h[1]}`);
    r.rawHeadersOut.forEach(h => log += ` out.${h[0]}=${h[1]}`);
    return log;
}
export default { logAllHeaders }
# nginx 的配置文件
http {
   js_import  logging.js;      # js_import 加載一個 js 腳本, 該文件放在nginx 配置文件的目錄下. js 的文件名會作為該模塊的命名空間. 引用函數時可以通過[文件名].[函數名]的方式來引用
   js_set     $log_all_headers logging.logAllHeaders; # js_set 把js文件中的函數 logAllHeaders 的輸出保存到變量 $log_all_headers.
   log_format kvpairs $log_all_headers;          # 自定義一種日志格式 kvpairs
    server {
        listen 80;
        access_log /var/log/nginx/access.log kvpairs; # 設置該規(guī)則下的日志格式為上面自定義的格式
        root /usr/share/nginx/html;
    }
}

五 NJS 支持的指令

參考文檔

NJS 支持的指令并不多. 要實現(xiàn)復雜的功能需要與 Nginx 的其他指令結合一起使用.

以下介紹幾個常用的指令

js_body_filter 修改 response 的 body

Syntax:	js_body_filter function | module.function [buffer_type=string | buffer];
Default:	—
Context:	location, limit_except
This directive appeared in version 0.5.2.

示例

/**
* 處理 response body 的函數
* @param { object } r - http 對象
* @param { buffer_type } data - 請求的 body 的數據
* @param { boolean } flags - 是否是最后一個數據塊
*/
function filter(r, data, flags) {
    r.sendBuffer(data.toLowerCase(), flags);
}

js_content 處理請求的返回

Syntax:	js_content function | module.function;
Default:	—
Context:	location, limit_except

示例

http {
    # 引入 js 模塊
    js_import  http.js;                 
    server {
        listen 80;
        location /content {
            # 通過 js_content 指令指定要執(zhí)行的 js 函數
            js_content http.content;
        }
    }
}
// http.js 文件
function content(r) {
    r.status = 200;
    r.headersOut['Content-Type'] = "text/plain; charset=utf-8";
    r.headersOut['Content-Length'] = 12;
    r.sendHeader();
    r.send("I am conte

js_header_filter 修改返回的請求頭

Syntax:	js_header_filter function | module.function;
Default:	—
Context:	location, limit_except
This directive appeared in version 0.5.1.

js_import 導入一個 js 文件

Syntax:	js_import module.js | export_name from module.js;
Default:	—
Context:	http
This directive appeared in version 0.4.0.

示例

http {
    # 引入 js 模塊. 文件名會作為該模塊的命名空間. 引用函數時可以通過[文件名].[函數名]的方式來引用
    js_import  http.js;                 
    server {
        listen 80;
        location /content {
            # 通過 js_content 指令指定要執(zhí)行的 js 函數
            js_content http.content;
        }
    }
}

js_set 設置變量

Syntax:	js_set $variable function | module.function;
Default:	—
Context:	http

該指令引用的函數會在變量第一次被引用時執(zhí)行. 并且函數內僅支持同步的操作

參考資料

  • NJS 支持的js語法: https://nginx.org/en/docs/njs/compatibility.html?_ga=2.128028686.301589667.1638621670-451035464.1638621670
  • Harnessing the Power and Convenience of JavaScript for Each Request with the NGINX JavaScript Module:? https://www.nginx.com/blog/harnessing-power-convenience-of-javascript-for-each-request-with-nginx-javascript-module
  • NJS模塊文檔: http://nginx.org/en/docs/http/ngx_http_js_module.html#example
  • 源碼: https://hg.nginx.org/njs/?_ga=2.99259804.301589667.1638621670-451035464.1638621670
  • NJS 內置的對象, 方法, 函數: https://nginx.org/en/docs/njs/reference.html
  • NJS 用法示例: https://github.com/nginx/njs-examples/#hello-world-example-http-hello

總結

到此這篇關于利用njs模塊在nginx配置中引入js腳本的文章就介紹到這了,更多相關nginx配置引入js腳本內容請搜索本站以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持本站!

美國服務器租用

版權聲明:本站文章來源標注為YINGSOO的內容版權均為本站所有,歡迎引用、轉載,請保持原文完整并注明來源及原文鏈接。禁止復制或仿造本網站,禁止在非www.sddonglingsh.com所屬的服務器上建立鏡像,否則將依法追究法律責任。本站部分內容來源于網友推薦、互聯(lián)網收集整理而來,僅供學習參考,不代表本站立場,如有內容涉嫌侵權,請聯(lián)系alex-e#qq.com處理。

實時開通

自選配置、實時開通

免備案

全球線路精選!

全天候客戶服務

7x24全年不間斷在線

專屬顧問服務

1對1客戶咨詢顧問

在線
客服

在線客服:7*24小時在線

客服
熱線

400-630-3752
7*24小時客服服務熱線

關注
微信

關注官方微信
頂部