国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

云服務器|WEB服務器|FTP服務器|郵件服務器|虛擬主機|服務器安全|DNS服務器|服務器知識|Nginx|IIS|Tomcat|

香港云服务器
服務器之家 - 服務器技術 - Nginx - 利用njs模塊在nginx配置中引入js腳本

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

2022-01-18 19:28彌廣 Nginx

這篇文章主要給大家介紹了關于利用njs模塊在nginx配置中引入js腳本的相關資料,通過這個腳本實現一些更復雜的 nginx 配置功能,需要的朋友可以參考下

前言

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

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

一 安裝 NJS 模塊

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

方法一: 動態加載 NJS 模塊

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

  • 將 ngx_http_js_module.so 文件放在nginx 根目錄的 modules 目錄下,
  • 在 nginx.conf 中增加引入模塊
?
1
2
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 命令下載源碼

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

nginx 編譯時增加如下配置

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

二 NJS模塊運行環境的特點

 

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

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

1. 每次請求時創建運行時環境, 請求結束時銷毀

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

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

2. 非阻塞代碼執行

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

3. 只支持部分 ECAMA 規范的語法

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

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

4. 集成請求處理過程

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

NJS 模塊也是通過指令的形式, 實現在特定的階段運行 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 配置目錄下創建一個 logging.js 文件

?
1
2
3
4
5
6
7
8
9
10
11
// 文件位置: [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 }
?
1
2
3
4
5
6
7
8
9
10
11
12
# 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; # 設置該規則下的日志格式為上面自定義的格式
        root /usr/share/nginx/html;
    }
}

五 NJS 支持的指令

參考文檔

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

以下介紹幾個常用的指令

js_body_filter 修改 response 的 body

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

示例

?
1
2
3
4
5
6
7
8
9
10
/**
* 處理 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 處理請求的返回

?
1
2
3
Syntax: js_content function | module.function;
Default:    —
Context:    location, limit_except

示例

?
1
2
3
4
5
6
7
8
9
10
11
http {
    # 引入 js 模塊
    js_import  http.js;                
    server {
        listen 80;
        location /content {
            # 通過 js_content 指令指定要執行的 js 函數
            js_content http.content;
        }
    }
}
?
1
2
3
4
5
6
7
8
9
10
11
// 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 content");
    r.finish()
}
 
export default { content }

js_header_filter 修改返回的請求頭

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

js_import 導入一個 js 文件

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

示例

?
1
2
3
4
5
6
7
8
9
10
11
http {
    # 引入 js 模塊. 文件名會作為該模塊的命名空間. 引用函數時可以通過[文件名].[函數名]的方式來引用
    js_import  http.js;                
    server {
        listen 80;
        location /content {
            # 通過 js_content 指令指定要執行的 js 函數
            js_content http.content;
        }
    }
}

js_set 設置變量

?
1
2
3
Syntax: js_set $variable function | module.function;
Default:    —
Context:    http

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

參考資料

  • 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腳本內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://mp.weixin.qq.com/s/XJgio54JVKMKaupD1BfjTg

延伸 · 閱讀

精彩推薦
857
主站蜘蛛池模板: 天堂√在线观看一区二区 | 成人a毛片 | 女同另类 | 一区二区三区在线播放 | 精品国产乱码久久久久久蜜柚 | 超碰首页 | 国产白浆在线观看 | 九九资源站 | 精品久久久久国产 | 国产麻豆一区二区三区 | 黄色av大片| 国内外精品一区二区三区 | 激情免费视频 | 久久草| 自拍一区视频 | 在线观看成人国产 | 精品久久久久久久 | 可以免费看黄的网站 | 中文字幕 国产 | 日本久久久久久 | 日本黄色一级 | 午夜电影 | 成人高清在线 | 免费成人在线看 | 中文av一区 | 国产精品久久久久久久久久久久 | 国产精品久久嫩一区二区免费 | 欧美日韩综合在线 | 中文字幕国产一区 | 国产精品久久久久久久久久新婚 | 天堂精品 | 中文字幕在线观看日本 | 日韩精品影院 | 麻豆国产尤物av尤物在线观看 | 久久久美女视频 | 性做久久 | 日韩精品专区在线影院重磅 | 欧美成人精品一区二区三区 | 国产黄a三级三级看三级 | 在线成人www免费观看视频 | 中文字幕一区二区三区四区五区 |