精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

可以在 Nginx 中運行 JavaScript,厲害了!

開發 前端
Nginx 作為市場占有率最高的Web服務器,主打高性能、可擴展。自帶了很多核心功能模塊,并且也有大量的第三方模塊。

 引言

Nginx 作為市場占有率最高的Web服務器,主打高性能、可擴展。自帶了很多核心功能模塊,并且也有大量的第三方模塊。

Web 服務中灰度方案的實現,很多會采用 Nginx + Lua + Redis 方案。Lua 是一個輕量級的腳本語言,體積小、啟動速度快、性能高。通過 lua-nginx-module 模塊將 Lua 語言嵌入到 Nginx 中,可以使用 Lua 腳本擴展 Nginx 功能,并可以訪問 MySQL、Redis 等數據庫。

圖片

Lua 雖然是個強大的腳本語言,但過于小眾。Nginx 團隊選擇非常流行的 JavaScript 研發 NGINX JavaScript 模塊 (njs),讓更多工程師可以使用 JavaScript 來擴展 Nginx 功能,從而更好的發展 Nginx 社區生態。

圖片

NGINX JavaScript 簡介

NGINX JavaScript 簡稱 njs,是 JavaScript 語言的子集,實現了部分 ECMAScript 5.1(strict mode)規范和 ECMAScript 6 規范,可以使用 njs 來擴展 Nginx 功能。

njs 與 Node.js、JavaScript 的區別

一、運行時不同

Node.js 使用 V8 引擎,njs 是專門為 Nginx 定制設計的運行時。Node.js 使用 V8 引擎在內存中有一個持久化的 JavaScript 虛擬機 (VM) 并執行垃圾收集以進行內存管理;而 njs 是專門為 Nginx 設計,非常輕量,會為每個請求初始化一個新的 JavaScript VM 和必要的內存,并在請求完成時釋放內存。

二、語言規范差異

JavaScript 的規范是由 ECMAScript 標準定義,隨著標準版本的更新迭代,會支持更多的語言功能;njs 自研的服務端運行時,更多的優先支撐服務于 Nginx,只實現了 ECMAScript 5.1 和部分 ECMAScript 6,實現更多標準規范的同時,更多會考慮是否是 Nginx 所需要的。

njs 安裝&配置

安裝 nginx-module-njs 動態模塊,需要 Nginx 版本為 1.9.11 之后支持動態模塊的載入。 

  1. yum install nginx-module-njs 

安裝后,在配置文件 nginx.conf 中需要使用 load_module 指令加載 njs 動態模塊。 

  1. load_module modules/ngx_http_js_module.so; 

njs 基本使用

Hello World

nginx.conf: 

  1. http {  
  2.     js_import http.js;  
  3.     # or js_import http from http.js;  
  4.     server {  
  5.         listen 8000;  
  6.         location / {  
  7.             js_content http.hello;  
  8.         }  
  9.     }  

http.js: 

  1. function hello(r) {  
  2.     r.return(200, "Hello world!");  
  3.  
  4. export default { hello }; 

js_import : 導入一個 njs 模塊,沒有指定模塊名稱則默認為文件名稱。

js_content : 使用 njs 模塊里導出的方法處理這個請求。

HTTP Proxying

使用 njs 模塊處理 HTTP 請求,并使用 subrequest 發起子請求。

nginx.conf: 

  1. js_import http.js;  
  2. location /start {  
  3.     js_content http.content;  
  4.  
  5. location /foo {  
  6.     proxy_pass <http://backend1> 
  7.  
  8. location /bar {  
  9.     proxy_pass <http://backend2> 

http.js: 

  1. function content(r) {  
  2.     r.subrequest('/api/5/foo', {  
  3.           method: 'POST',  
  4.           body: JSON.stringify({ foo: 'foo', bar: "bar" })  
  5.     }, function(res) {  
  6.             if (res.status != 200) {  
  7.                 r.return(res.status, res.responseBody);  
  8.                 return;  
  9.             }  
  10.             var json = JSON.parse(res.responseBody);  
  11.             r.return(200, json.content);  
  12.     });  
  13.  
  14. export default { content }; 

r.subrequest : 可以去請求內部的其他 API ,headers 和該請求相同,并且可以在 location 塊里使用 proxy_set_header 來設置或覆蓋原來的 header。

自定義日志輸出格式

使用 njs 定制 Nginx 日志的輸出格式。

nginx.js: 

  1. js_import  logging.js;  
  2. js_set     $access_log_headers logging.kvAccess;  
  3. log_format kvpairs $access_log_headers;  
  4. server {  
  5.     listen 80;  
  6.     root /usr/share/nginx/html;  
  7.     access_log /var/log/nginx/access.log kvpairs;  

logging.js: 

  1. function kvAccess(r) {  
  2.     var log = `${r.variables.time_iso8601} client=${r.remoteAddress} method=${r.method} uri=${r.uri} status=${r.status}`;  
  3.     r.rawHeadersIn.forEach(h => log += ` in.${h[0]}=${h[1]}`);  
  4.     r.rawHeadersOut.forEach(h => log += ` out.${h[0]}=${h[1]}`);  
  5.     return log;  
  6.  
  7. export default { kvAccess } 

js_set : 將 njs 模塊里的 kvAccess 方法執行后,執行結果放到 $access_log_headers 變量中。但如果只被引用在 log_format 中,則只會在日志記錄階段被執行。

r : HTTP request 對象。屬性列表:http://nginx.org/en/docs/njs/reference.html#http

訪問數據庫

一、訪問 Redis

使用 redis2-nginx-module 動態模塊,結合 subrequest 來訪問 Redis 數據。

nginx.conf: 

  1. js_import http.js;# GET /redis_get?key=some_keylocation = /redis_get {     # 解碼 uri 中的參數 key,賦值到變量 $key     set_unescape_uri $key $arg_key;     redis2_query get $key;     redis2_pass 127.0.0.1:6379;}# GET /redis_set?key=one&val=first%20valuelocation = /redis_set {     set_unescape_uri $key $arg_key;     set_unescape_uri $val $arg_val;     redis2_query set $key $val;     redis2_pass 127.0.0.1:6379;}# GET /get_redis_data?key=some_keylocation /get_redis_data {    js_content http.get_redis_data;} 

http.js: 

  1. function serialize(obj) {    var str = [];    for (var p in obj) {        if (obj.hasOwnProperty(p)) {            str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));        }    }    return str.join("&");};function get_redis_data(r) {    r.subrequest('/redis_get', {          args: serialize(r.args),          method: 'GET'    }, function(res) {            if (res.status != 200) {                r.return(res.status, res.responseBody);                return;            }            r.return(200, res.responseBody);    });    return log;}export default { get_redis_data } 

set_unescape_uri :解碼 uri 中參數的 %XX 編碼。

redis2_query : 執行的 Redis 命令。

redis2_pass : Redis 后端服務。

redis2_pass 返回值為類似 redis-cli 執行后的返回值,需要有一個 parser 來解析是否執行成。

二、訪問 MySQL

使用 drizzle-nginx-module 動態模塊,結合 subrequest 來訪問 MySQL 數據。

nginx.conf: 

  1. upstream backend {  
  2.     drizzle_server 127.0.0.1:3306 dbname=test  
  3.         password=some_pass user=monty protocol=mysql 
  4.  
  5. server {  
  6.     js_import http.js;  
  7.     location /mysql {  
  8.          set_unescape_uri $name $arg_name;  
  9.          # 為防止 SQL 注入攻擊,使用 set_quote_sql_str 來設置 sql 語句中的變量  
  10.          set_quote_sql_str $quoted_name $name;  
  11.          drizzle_query "select * from cats where name = $quoted_name";  
  12.          drizzle_pass backend;  
  13.          drizzle_connect_timeout    500ms; # default 60s  
  14.          drizzle_send_query_timeout 2s;    # default 60s  
  15.          drizzle_recv_cols_timeout  1s;    # default 60s  
  16.          drizzle_recv_rows_timeout  1s;    # default 60s  
  17.     }  
  18.     # GET /get_mysql_data?name=cat_name  
  19.     location /get_mysql_data {  
  20.         js_content http.get_mysql_data;  
  21.     }  

http.js: 

  1. function serialize(obj) {  
  2.     var str = [];  
  3.     for (var p in obj) {  
  4.         if (obj.hasOwnProperty(p)) {  
  5.             str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));  
  6.         }  
  7.     }  
  8.     return str.join("&");  
  9. };  
  10. function get_mysql_data(r) {  
  11.     r.subrequest('/mysql', {  
  12.           args: serialize(r.args),  
  13.           method: 'GET'  
  14.     }, function(res) {  
  15.             if (res.status != 200) {  
  16.                 r.return(res.status, res.responseBody);  
  17.                 return;  
  18.             }  
  19.             r.return(200, res.responseBody);  
  20.     });  
  21.     return log; 
  22.   
  23. export default { get_mysql_data } 

set_quote_sql_str : 為防止 SQL 注入攻擊,來設置 sql 語句中的變量。

drizzle_query : 執行的 SQL 語句。

drizzle_pass : Drizzle 或 MySQL 服務的 upstream。

結語

在 njs 之前,Nginx+Lua 生態雖然已日趨成熟,但 Nginx 畢竟是一個 Web 服務器,JavaScript 作為 Web 開發的最流行的語言,可以使用 JavaScript 生態來擴展 Nginx 的功能,可能會更加的有一些想象力做更多的事情。 

 

責任編輯:龐桂玉 來源: 前端大全
相關推薦

2021-03-01 12:06:12

Nginx命令Linux

2022-01-11 12:13:33

JavaScript編程語言

2018-04-11 14:30:33

2017-02-23 08:00:04

智能語音Click

2018-05-14 22:58:14

戴爾

2023-05-06 06:47:46

Bing聊天機器人

2021-03-29 13:06:25

開源工具開源

2021-11-01 07:50:44

TomcatWeb應用

2021-12-27 07:59:50

ECMAScript JSON模塊Node.js

2021-04-19 11:22:24

人工智能人臉識別科學

2020-06-08 17:35:27

Redis集群互聯網

2021-06-03 09:30:30

Python操作注冊表regedit

2020-03-10 13:35:23

Gihub搜索開源

2022-04-08 08:11:28

Python代碼

2022-01-25 08:36:29

array.flat映射函數數組

2024-02-26 12:42:40

2017-10-20 11:50:39

2017-07-27 16:51:19

數字化環衛信息化

2019-11-25 21:53:48

代碼算法BUG

2022-05-03 23:44:21

Python動態鏈接庫Ctypes
點贊
收藏

51CTO技術棧公眾號

秋霞久久久久久一区二区| 久久亚洲影音av资源网| 欧美爱爱视频免费看| 欧美视频一二区| 最新国产乱人伦偷精品免费网站| 日韩女优av电影| 色一情一区二区三区四区| 伊人影院中文字幕| 伊人久久大香线蕉综合四虎小说 | 天堂www中文在线资源| av在线网页| 国产香蕉久久精品综合网| 国产区精品视频| 欧美日韩国产精品综合| 欧美高清视频看片在线观看| 亚洲国产一区二区视频| 免费精品视频一区| 国产精品国产av| 欧美精品午夜| 国产亚洲在线播放| 黄色一级片免费播放| 91福利区在线观看| 国产精品久久久久久久久免费樱桃| 91在线免费看片| 国产主播第一页| 黄色另类av| 最新的欧美黄色| 手机免费看av片| 欧美一级在线| 欧美性猛交xxx| 亚洲一区二区三区免费观看| 丰满肥臀噗嗤啊x99av| 肉肉av福利一精品导航| 九九热最新视频//这里只有精品| av直播在线观看| 国产精品一站二站| 在线观看亚洲a| 少妇久久久久久被弄到高潮| 国产女人在线观看| 国产毛片精品一区| 国产伦精品一区二区三区精品视频| 777777国产7777777| eeuss鲁片一区二区三区| 精品1区2区3区| 国产在线青青草| 中文在线免费| 久久亚洲综合av| 国产精品视频福利| 国产免费黄色录像| 美女在线视频一区| 国产精品美女免费视频| 亚洲国产成人精品综合99| 成人网18免费网站| 日韩中文在线观看| 国产在线观看免费视频软件| 日韩中文在线电影| 久久中文久久字幕| 全程偷拍露脸中年夫妇| 欧美高清一区| 国内成人精品一区| 国产成人无码精品| 老**午夜毛片一区二区三区| 日本免费在线精品| 天天天天天天天干| 精彩视频一区二区三区| 2019国产精品视频| 欧美一级淫片aaaaaa| 91在线观看免费视频| 日本一区二区精品视频| 亚洲成人影院麻豆| 一区二区三区欧美| 国产特级黄色大片| 视频二区不卡| 91麻豆精品国产91久久久资源速度 | 精品久久久影院| 北岛玲一区二区| 日韩精品欧美激情一区二区| 久久五月天色综合| 欧美一级高潮片| 久久久噜噜噜久久狠狠50岁| 国产日韩一区在线| 亚洲国产精品成人久久蜜臀| 91视频国产资源| 亚洲精品无人区| 欧美hdxxx| 一本大道av一区二区在线播放| 日日噜噜夜夜狠狠| 亚洲天堂中文字幕在线观看| 亚洲精品一区中文| 欧美h片在线观看| 99香蕉国产精品偷在线观看| 国产精品久久久久久久电影| 999久久久久久| 97久久精品人人爽人人爽蜜臀| 日本一区二区三区视频在线观看| 黄色片免费在线观看| 激情成人中文字幕| 99久久99精品| 天堂99x99es久久精品免费| 尤物精品国产第一福利三区| 欧美人妻精品一区二区免费看| 久久久久国产精品一区三寸 | 久久大胆人体视频| 神马国产精品影院av| 亚洲一区二区91| 久久国产精品免费| 精品视频高清无人区区二区三区| 成人动漫在线免费观看| 亚洲一区二区三区四区的 | 波多野结衣亚洲色图| 精品999日本| 成人xxxxx| 免费在线观看污视频| 亚洲一区二区视频在线观看| 亚洲免费av一区二区三区| jizz18欧美18| 久久在线免费观看视频| 黑人精品无码一区二区三区AV| 日本vs亚洲vs韩国一区三区二区| 2020国产精品久久精品不卡| 色综合久久久久综合一本到桃花网| 欧美日韩国产色视频| 免费黄视频在线观看| 日韩午夜电影网| 日本成人激情视频| 五月婷婷丁香六月| 亚洲自拍偷拍图区| 日韩高清在线一区二区| 日韩国产欧美一区二区| 日本三级韩国三级久久| 色呦呦视频在线| 亚洲精品成人精品456| 最新中文字幕2018| 欧美激情在线精品一区二区三区| 国语自产在线不卡| 亚洲国产日韩在线观看| 亚洲欧美成aⅴ人在线观看| 伊人影院综合在线| 国产欧美日韩免费观看| 欧美激情亚洲自拍| 国产高清在线观看视频| 一区二区三区在线免费播放| 亚洲精品在线网址| 欧美精品啪啪| 成人在线视频电影| 多野结衣av一区| 亚洲激情视频网| 美日韩一二三区| www.成人在线| 国产91在线免费| 欧美色图五月天| 国产91在线播放精品91| 国产中文字幕在线| 在线观看亚洲一区| 一本在线免费视频| 国产一区二区三区免费看| 激情五月六月婷婷| 国产精品午夜av| 欧美一级免费看| 黄色影院在线播放| 欧美午夜精品久久久久久超碰 | 一路向西2在线观看| 精品精品久久| 国产精品成人免费电影| 日本三级在线播放完整版| 这里只有精品视频在线观看| 久久免费视频99| 99免费精品在线观看| 日本黄网站免费| 成人av资源电影网站| 成人日韩av在线| 暧暧视频在线免费观看| 日韩精品久久久久久久玫瑰园| 无码人妻精品一区二区三区蜜桃91| 欧美国产日产图区| 婷婷激情小说网| 伊人精品在线| 日韩不卡av| 国产一区二区av在线| 国内免费久久久久久久久久久 | 国产最新免费视频| 成人亚洲一区| 福利精品视频| 欧美最新精品| 欧美日韩国产成人在线| 日本福利片在线| 6080国产精品一区二区| 欧美日韩综合在线观看| 国产精品理论片在线观看| 国产情侣久久久久aⅴ免费| 久久亚洲综合| 蜜桃视频一区二区在线观看| 伊人成综合网伊人222| 成人在线播放av| 免费看男女www网站入口在线| 神马国产精品影院av| 欧美一级特黄aaaaaa大片在线观看 | 日韩在线一区二区三区免费视频| 黄色福利在线观看| 欧美日韩综合色| 国产网站在线看| 中文字幕一区二区在线观看| 欲求不满的岳中文字幕| 国产原创一区二区三区| www.亚洲天堂网| 欧美涩涩网站| 亚洲黄色成人久久久| 婷婷精品在线观看| 99视频免费观看蜜桃视频| 成人黄页网站视频| 欧美在线视频一区二区| 国产三线在线| 美日韩在线视频| 91电影在线播放| 亚洲乱码一区二区| 男人天堂一区二区| 日韩一级二级三级| 国产精品久久久久久久免费| 91黄色激情网站| 天天爽夜夜爽夜夜爽精品| 亚洲精品欧美综合四区| 99精品中文字幕| 久久久久久久久久久久久久久99 | 国产精品毛片久久久久久久| 亚洲av无码国产精品久久| 丁香六月久久综合狠狠色| 亚洲欧美日本一区二区| 美女尤物国产一区| 黄色aaa级片| 久久精品91| 日韩欧美国产免费| 日韩午夜免费视频| 男人天堂av片| 亚洲国产精品第一区二区| 欧美大片免费播放| 一本精品一区二区三区| 中文字幕日韩精品久久| 97精品国产一区二区三区| 色大师av一区二区三区| 国产精品欧美在线观看| 欧美日韩一区二区三区在线观看免| 欧美日日夜夜| 久久精品国产精品国产精品污 | 国内精品麻豆美女在线播放视频| 91精品国产综合久久久久久丝袜 | 看高清中日韩色视频| 欧美三级电影在线| 麻豆亚洲一区| 欧美禁忌电影| 一区二区成人国产精品 | 丰满人妻中伦妇伦精品app| 99精品国产在热久久下载| 欧美日韩一道本| 日韩影院在线观看| 色婷婷成人在线| 久久99精品国产.久久久久久| 亚洲图色中文字幕| 国产精品中文字幕日韩精品 | 久久综合影院| 亚洲精品自在在线观看| 91九色精品国产一区二区| 欧美成人三级| 国产精品日韩久久久久| 国产成人精品一区二区三区视频| 国产精品视频男人的天堂| 亚洲欧美在线综合| 国产传媒一区二区三区| 女同久久另类99精品国产| 久久婷婷开心| 日韩大片在线| 国产又粗又猛又爽又黄的网站| 伊人精品视频| 五月天婷婷激情视频| 国产自产2019最新不卡| 中国xxxx性xxxx产国| 久久久国产精品午夜一区ai换脸| 91视频免费在观看| 一区二区三区在线视频免费 | 色诱视频网站一区| 一卡二卡在线观看| 337p日本欧洲亚洲大胆色噜噜| 日韩精品福利| 久久精品人人做人人爽| xxxx成人| 国产精品视频区1| 国产精品巨作av| 亚洲欧洲免费无码| 影音先锋中文字幕一区| 男人的天堂日韩| 国产成人av一区| 极品蜜桃臀肥臀-x88av| 亚洲制服丝袜一区| 中文字幕观看在线| 亚洲激情中文字幕| 黄色精品在线观看| 欧美在线视频播放| 清纯唯美激情亚洲| 婷婷亚洲婷婷综合色香五月| 午夜欧美精品| 五月天av在线播放| 91亚洲男人天堂| 丁香花五月激情| 91国偷自产一区二区开放时间 | 97精品国产综合久久久动漫日韩| 亚洲综合精品一区二区| 国内亚洲精品| 131美女爱做视频| 韩国女主播成人在线| 91激情视频在线观看| 天天综合天天做天天综合| 国产麻豆免费观看| 一区二区三区视频观看| 国产v日韩v欧美v| 91久久精品www人人做人人爽| 精品视频国产| 日韩精品一区二区三区久久| 豆国产96在线|亚洲| 很污很黄的网站| 在线免费观看一区| 日本大臀精品| 97婷婷涩涩精品一区| 91蜜桃臀久久一区二区| 日韩video| 精品中文字幕一区二区| 久久日免费视频| 91精品福利视频| 人成免费电影一二三区在线观看| 欧美国产日韩一区二区| 99热这里有精品| 影音先锋在线亚洲| 蜜桃免费网站一区二区三区| 久久中文字幕人妻| 精品久久久久久久久久久| 免费观看成年人视频| 欧美另类精品xxxx孕妇| 国产精品黄色片| 亚洲美女搞黄| 男人的j进女人的j一区| a天堂中文字幕| 欧美亚洲自拍偷拍| 成年人在线观看| 国产精品亚洲片夜色在线| 国产一区二区三区四区二区| mm1313亚洲国产精品无码试看| 久久久www免费人成精品| 久久久久久不卡| 亚洲视频在线观看网站| 日韩在线免费| 亚洲精品9999| 狠狠色丁香久久婷婷综| 永久免费看mv网站入口| 91麻豆精品国产91久久久久久 | 亚洲在线观看网站| 一区二区在线看| 少妇一级淫片免费看| 91精品国产91久久久久久最新 | 亚洲男人的天堂在线| 精品国产免费人成网站| 日本不卡一区二区三区视频| 久久婷婷丁香| 免费一级黄色录像| 777a∨成人精品桃花网| 女人黄色免费在线观看| 狠狠色综合网站久久久久久久| 国产精品久久久久久模特| 97人妻人人揉人人躁人人| 欧美美女一区二区三区| 牛牛在线精品视频| 久久久久资源| 蜜臀久久久99精品久久久久久| www欧美com| 亚洲第一男人av| 免费成人动漫| 超碰免费在线公开| 大尺度一区二区| 久久久久久久久久成人| 日韩在线观看免费全| 国产厕拍一区| 国产理论在线播放| 一区二区三区欧美日| 三级做a全过程在线观看| 国产日韩在线精品av| 激情综合视频| 四虎国产成人精品免费一女五男| 精品女同一区二区| 日韩一级二级| 国产中文字幕乱人伦在线观看| 国产欧美精品区一区二区三区 | 日本成人一区二区| 阿v天堂2018| 中文字幕第一区第二区| 亚洲精品97久久中文字幕| 国产成人综合精品| 亚洲欧美伊人| 我想看黄色大片| 日韩久久精品成人| 欧美成人精品午夜一区二区| 国产第一页视频| 亚洲成a人v欧美综合天堂下载| 一级毛片视频在线|