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

Nginx自定義模塊編寫:根據(jù)post參數(shù)路由到不同服務器

運維 系統(tǒng)運維
Nginx可以輕松實現(xiàn)根據(jù)不同的url 或者 get參數(shù)來轉(zhuǎn)發(fā)到不同的服務器,然而當我們需要根據(jù)http包體來進行請求路由時,Nginx默認的配置規(guī)則就捉襟見肘了,但是沒關系,Nginx提供了強大的自定義模塊功能,我們只要進行需要的擴展就行了。

Nginx可以輕松實現(xiàn)根據(jù)不同的url 或者 get參數(shù)來轉(zhuǎn)發(fā)到不同的服務器,然而當我們需要根據(jù)http包體來進行請求路由時,Nginx默認的配置規(guī)則就捉襟見肘了,但是沒關系,Nginx提供了強大的自定義模塊功能,我們只要進行需要的擴展就行了。

我們來理一下思路,我們的需求是:

Nginx根據(jù)http包體的參數(shù),來選擇合適的路由

在這之前,我們先來考慮另一個問題:

在Nginx默認配置的支持下,能否實現(xiàn)服務器間的跳轉(zhuǎn)呢?即類似于狀態(tài)機,從一個服務器執(zhí)行OK后,跳轉(zhuǎn)到另一臺服務器,按照規(guī)則依次傳遞下去。

答案是可以的,這也是我之前寫bayonet之后,在nginx上特意嘗試的功能。

一個示例的配置如下:

  1. server { 
  2.     listen       8080; 
  3.     server_name  localhost; 
  4.     location / { 
  5.         proxy_pass http://localhost:8888; 
  6.         error_page 433 = @433; 
  7.         error_page 434 = @434; 
  8.     } 
  9.     location @433 { 
  10.         proxy_pass http://localhost:6788; 
  11.     } 
  12.     location @434 { 
  13.         proxy_pass http://localhost:6789; 
  14.     } 
  15.     error_page   500 502 503 504  /50x.html; 
  16.     location = /50x.html { 
  17.         root   html; 
  18.     } 

看明白了吧?我們使用了 433和434 這兩個非標準http協(xié)議的返回碼,所有請求進入時都默認進入 http://localhost:8888;,然后再根據(jù)返回碼是 433 還是 434 來選擇進入 http://localhost:6788 還是 http://localhost:6789。

OK,也許你已經(jīng)猜到我將這個例子的用意了,是的,我們只要在我們的自定義模塊中,根據(jù)http的包體返回不同的返回碼,進而 proxy_pass 到不同的后端服務器即可。

好吧,接下來,我們正式進入nginx自定義模塊的編寫中來。

一. nginx 自定義模塊編寫 由于這也是我***次寫nginx模塊,所以也是參考了非常多文檔,我一一列在這里,所以詳細的入門就不說了,只說比較不太一樣的地方。 參考鏈接:

  1. nginx的helloworld模塊的helloworld
  2. nginx 一個例子模塊,簡單的將http請求的內(nèi)容返輸出
  3. nginx 自定義協(xié)議 擴展模塊開發(fā)
  4. Emiller的Nginx模塊開發(fā)指南

而我們這個模塊一個***的特點就是,需要等包體整個接收完才能進行處理,所以有如下代碼:

  1. void ngx_http_foo_post_handler(ngx_http_request_t *r){ 
  2.     // 請求全部讀完后從這里入口, 可以產(chǎn)生響應 
  3.     ngx_http_request_body_t* rrb = r->request_body; 
  4.   
  5.     char* body = NULL
  6.     int body_size = 0
  7.   
  8.     if (rb && rb->buf) 
  9.     { 
  10.         body = (char*)rb->buf->pos; 
  11.         body_size = rb->buf->last - rb->buf->pos; 
  12.     } 
  13.   
  14.     int result = get_route_id(r->connection->log,  
  15.                               (int)r->method, 
  16.                               (char*)r->uri.data, 
  17.                               (char*)r->args.data, 
  18.                               body, 
  19.                               body_size 
  20.                               ); 
  21.     if (result < 0
  22.     { 
  23.         ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "get_route_id fail, result:%d", result); 
  24.         result = DFT_ROUTE_ID
  25.     } 
  26.     ngx_http_finalize_request(r, result); 
  27.   
  28. static ngx_int_t ngx_http_req_route_handler(ngx_http_request_t *r) 
  29.     ngx_http_read_client_request_body(r, ngx_http_foo_post_handler); 
  30.     return NGX_DONE; // 主handler結(jié)束 

我們注冊了一個回調(diào)函數(shù) ngx_http_foo_post_handler,當包體全部接受完成時就會調(diào)用。之后我們調(diào)用了get_route_id來獲取返回碼,然后通過 ngx_http_finalize_request(r, result); 來告訴nginx處理的結(jié)果。

這里有個小插曲,即get_route_id。我們來看一下它定義的原型:

  1. extern int get_route_id(ngx_log_t *log, int method, char* uri, char* args, char* body, int body_size) 

***個參數(shù)是 ngx_log_t *log,是為了方便在報錯的時候打印日志。然而在最開始的時候,get_route_id 的原型是這樣:

  1. extern int get_route_id(ngx_http_request_t *r, int method, char* uri, char* args, char* body, int body_size); 

結(jié)果在 get_route_id 函數(shù)內(nèi)部,調(diào)用:

  1. r->connection->log 

的結(jié)果總是null,至今也不知道為什么。

OK,接下來我們只要在get_route_id中增加邏輯代碼,讀幾行配置,判斷一下就可以了~ 但是,我想要的遠不止如此。

二、lua解析器的加入

老博友應該都看過我之前寫的一篇博客: 代碼即數(shù)據(jù),數(shù)據(jù)即代碼(1)-把難以變更的代碼變成易于變更的數(shù)據(jù),而這一次的需求也非常符合使用腳本的原則:

只需要告訴我返回nginx哪個返回碼,具體怎么算出來的,再復雜,再多變,都放到腳本里面去。

所以接下來我又寫了c調(diào)用lua的代碼:

  1. int get_route_id(ngx_log_t *log, int method, char* uri, char* args, char* body, int body_size) 
  2.     const char lua_funcname[] = "get_route_id"; 
  3.     lua_State *L = luaL_newstate(); 
  4.     luaL_openlibs(L); 
  5.     if (luaL_loadfile(L, LUA_FILENAME) || lua_pcall(L, 0, 0, 0)) 
  6.     { 
  7.         ngx_log_error(NGX_LOG_ERR, log, 0, "cannot run configuration file: %s", lua_tostring(L, -1)); 
  8.         lua_close(L); 
  9.         return -1; 
  10.     }  
  11.     lua_getglobal(L, lua_funcname); /* function to be called */ 
  12.     lua_pushnumber(L, method); 
  13.     lua_pushstring(L, uri); 
  14.     lua_pushstring(L, args); 
  15.     lua_pushlstring(L, body, body_size); 
  16.     /* do the call (1 arguments, 1 result) */ 
  17.     if (lua_pcall(L, 4, 1, 0) != 0) 
  18.     { 
  19.         ngx_log_error(NGX_LOG_ERR, log, 0, "error running function %s: %s", lua_funcname, lua_tostring(L, -1)); 
  20.         lua_close(L); 
  21.         return -2; 
  22.     } 
  23.     /* retrieve result */ 
  24.     if (!lua_isnumber(L, -1)) 
  25.     { 
  26.         ngx_log_error(NGX_LOG_ERR, log, 0, "function %s must return a number", lua_funcname); 
  27.         lua_close(L); 
  28.         return -3; 
  29.     } 
  30.     int result = (int)lua_tonumber(L, -1); 
  31.   
  32.     lua_pop(L, 1); /* pop returned value */ 
  33.   
  34.     lua_close(L); 
  35.     return result; 

比較郁悶的是,lua 5.2的很多函數(shù)都變了,比如lua_open廢棄,變成luaL_newstate等,不過總體來說還算沒浪費太多時間。

接下來是req_route.lua的內(nèi)容,我只截取入口函數(shù)如下:

  1. function get_route_id(method, uri, args, body) 
  2.     loc, pf ,appid = get_need_vals(method, uri, args, body) 
  3.     if loc == nil or pf == nil or appid == nil then 
  4.         return OUT_CODE 
  5.     end 
  6.     --到這里位置,就把所有的數(shù)據(jù)都拿到了 
  7.     --print (loc, pf, appid) 
  8.     -- 找是否在對應的url, loc中 
  9.     if not is_match_pf_and_loc(pf, loc) then 
  10.         return OUT_CODE 
  11.     end 
  12.     -- 找是否在對應的appid中 
  13.     if not is_match_appid(appid) then 
  14.         return OUT_CODE 
  15.     end 
  16.     return IN_CODE 
  17. end 

OK,結(jié)合了lua解析器之后,無論多復雜的調(diào)整,我們都基本可以做到只修改lua腳本而不需要重新修改、編譯nginx模塊代碼了。

接下來,就該是體驗我們的成果了。

三、Nginx配置

  1. server { 
  2.     listen       8080; 
  3.     server_name  localhost; 
  4.   
  5.     location /req_route { 
  6.         req_route; 
  7.         error_page 433 = @433; 
  8.         error_page 434 = @434; 
  9.     } 
  10.     location @433 { 
  11.         proxy_pass http://localhost:6788; 
  12.     } 
  13.     location @434 { 
  14.         proxy_pass http://localhost:6789; 
  15.     } 
  16.     error_page   500 502 503 504  /50x.html; 
  17.     location = /50x.html { 
  18.         root   html; 
  19.     } 

OK,enjoy it!

***,放出代碼如下:

https://vimercode.googlecode.com/svn/trunk/nginx_req_route

責任編輯:黃丹 來源: IT技術博客
相關推薦

2011-03-21 09:16:52

2010-05-18 17:07:29

IIS服務器

2011-04-06 15:05:58

nagios監(jiān)控Linux

2009-08-01 12:00:15

ASP.NET服務器自ASP.NET服務器ASP.NET

2011-05-19 10:16:27

ASP.NET

2012-09-24 14:31:55

C#網(wǎng)絡協(xié)議C

2022-07-11 10:37:41

MapPart集合

2021-03-16 10:39:29

SpringBoot參數(shù)解析器

2021-05-28 08:58:41

Golang網(wǎng)卡metrics

2009-06-25 14:53:35

自定義UI組件JSF框架

2009-08-03 13:34:06

自定義C#控件

2018-11-21 09:53:08

服務服務器分類

2009-08-01 09:21:12

ASP.NET服務器自ASP.NET服務器控ASP.NET

2010-04-02 11:08:30

惠普服務器選購

2012-05-18 10:52:20

TitaniumAndroid模塊自定義View模塊

2020-11-19 10:50:43

ImportPython代碼

2009-12-17 15:42:25

Rails自定義Hel

2021-02-04 09:18:20

服務器認證自定義

2015-06-10 10:54:24

自定義路PHP

2016-08-23 13:21:15

MVC路由視圖
點贊
收藏

51CTO技術棧公眾號

gv天堂gv无码男同在线观看| 一区二区在线免费| 91官网在线观看| 成人av在线网址| 国产偷人妻精品一区| 日本在线人成| jizz国产精品| 精品一区二区三区视频在线观看| 亚洲激情在线观看视频免费| 玖玖精品在线视频| 在线观看国产一区二区三区| 国产99久久| 激情成人在线视频| 成人免费视频网站入口| 亚洲区一区二区三| 欧美影视资讯| 久久综合九色综合久久久精品综合| 九九视频这里只有精品| 香蕉视频999| aⅴ在线视频男人的天堂 | 精品国产亚洲在线| 国产又黄又爽免费视频| 亚洲天堂久久久久| 影音先锋久久资源网| 欧美tk—视频vk| 8x8ⅹ国产精品一区二区二区| av天堂一区二区三区| 91成人精品| 欧美一区二区三区播放老司机| 一本久道久久综合| 一级特黄aa大片| 天天射—综合中文网| 欧美男男青年gay1069videost| 亚洲午夜精品久久久中文影院av| 好吊色视频一区二区| 欧美日韩国产一区精品一区| 日韩一级视频免费观看在线| 穿情趣内衣被c到高潮视频| 日韩在线无毛| 日韩精彩视频在线观看| 在线电影欧美日韩一区二区私密| 天堂网在线免费观看| 在线看黄色av| www国产精品av| 国产精品成人品| 午夜国产福利视频| 欧美日本三级| 亚洲成av人综合在线观看| 欧美不卡三区| 亚洲网站免费观看| 欧美专区18| 视频在线观看一区二区| 99999精品| 国产乱码午夜在线视频 | 日本一级免费视频| 国产资源一区| 亚洲午夜一区二区三区| 免费看成人片| 日韩二区三区| 久久久久国产精品麻豆| 91香蕉亚洲精品| 日韩特黄一级片| av中字幕久久| 欧美成人激情免费网| 女人扒开双腿让男人捅 | 成人影视亚洲图片在线| 91精品欧美综合在线观看最新| 全黄性性激高免费视频| 国产人成在线观看| 国产激情精品久久久第一区二区| 欧美亚洲另类激情另类| 黄色录像免费观看| 91精品婷婷色在线观看| 欧美另类在线播放| 欧美黄色一区二区三区| 精品国产精品国产偷麻豆| 亚洲视频在线看| 日本在线视频播放| 北条麻妃一区二区三区在线| 日韩av影视综合网| 欧美日韩精品区别| 亚洲优女在线| 伊人夜夜躁av伊人久久| 久久这里只有精品18| 爱爱爱免费视频在线观看| 成人中文字幕合集| 91啪国产在线| 好吊色在线观看| 久久久99久久| 亚洲狠狠婷婷综合久久久| 三级在线视频| 国产精品乱码久久久久久| 久久99精品久久久久久三级| 99热这里精品| av不卡在线播放| 91免费看蜜桃| 国产乱人乱偷精品视频a人人澡| 久久综合九色| 欧美亚洲一级片| 中文字幕日韩第一页| 国产欧美精品| 久久久久久综合网天天| 欧美黄色一级网站| 久久三级视频| 99在线观看视频| 国产成人精品av在线观| 91婷婷韩国欧美一区二区| 伊人久久大香线蕉午夜av| 香蕉视频在线播放| 亚洲成人激情自拍| 国内精品视频一区二区三区| 日韩不卡在线| 亚洲国产精品人久久电影| 欧美人与禽zoz0善交| 亚洲日韩视频| 51久久精品夜色国产麻豆| 伊人成人在线观看| 99视频一区二区| 正在播放一区二区三区| 黑人巨大精品| 色诱视频网站一区| 无码内射中文字幕岛国片| 午夜激情在线播放| 日韩视频不卡中文| 亚洲色图 激情小说| 一区二区动漫| 国产91免费看片| 区一区二在线观看| 日韩精品一级二级| 久久99精品久久久久久秒播放器| 九色porny在线| 亚洲精品福利视频网站| 成人在线观看黄| 国产精品高潮久久| 91精品蜜臀在线一区尤物| 日本乱子伦xxxx| 欧美肥老太太性生活| 精品国产欧美一区二区五十路| 精品亚洲乱码一区二区| 亚洲免费影视| 国产女精品视频网站免费| 国产精品永久久久久久久久久| 不卡一卡二卡三乱码免费网站| 久久伊人一区| 大菠萝精品导航| 精品粉嫩超白一线天av| 波多野结衣爱爱视频| 亚洲三级网站| 国产伦精品一区二区三区高清版 | 亚洲国产天堂网精品网站| 欧美成人精品一区二区免费看片| 伊人久久亚洲美女图片| 91入口在线观看| 中文字幕伦理免费在线视频| 亚洲动漫第一页| 三上悠亚 电影| 国语精品一区| 国产精品电影在线观看| 六十路在线观看| 亚洲精品国产品国语在线app| 国产欧美一区二| 亚洲天堂一区二区三区四区| 91成人免费观看网站| 亚洲手机在线观看| 欧美极品少妇xxxxⅹ高跟鞋 | 欧美日韩你懂得| 久久精品aⅴ无码中文字字幕重口| 欧美天堂社区| 日韩一中文字幕| 97人妻精品一区二区三区| 亚洲天堂中文字幕| 成人免费在线小视频| 国产精品视频一区二区三区综合| 亚洲精品久久久久国产| 日本三级小视频| 国产一二精品视频| 日韩精品一区二区三区外面| 国产精品蜜臀| 56国语精品自产拍在线观看| 日韩a级片在线观看| 国产99久久久国产精品潘金网站| 无码免费一区二区三区免费播放 | 久久99爱视频| 欧美在线高清| 国产一区二区丝袜高跟鞋图片| 亚洲欧美综合一区二区| 亚洲一区中文日韩| 国模私拍在线观看| 欧美日韩1区| 久久久综合亚洲91久久98| 成人福利一区二区| 欧美第一页在线| 天天操天天干天天摸| 99久久精品99国产精品| 欧美亚洲色图视频| www.久久久.com| 色综合伊人色综合网站| www日本在线| 亚洲欧美福利一区二区| www.com黄色片| 黄色亚洲在线| 少妇精品久久久久久久久久| 91精品丝袜国产高跟在线| 另类图片亚洲另类| 一级欧美一级日韩| 亚洲成人你懂的| 欧美自拍偷拍网| 日韩成人免费电影| 日韩精品综合在线| 欧美亚洲国产激情| 久久国产精品久久| 国产精品一区二区三区四区在线观看| 欧美一区二三区| 亚洲妇熟xxxx妇色黄| 91精品国产高清一区二区三区 | 精品久久久中文| 亚洲一二三在线观看| 久久精品国产成人一区二区三区| 亚洲欧美日韩国产yyy| 加勒比色老久久爱综合网| 午夜精品久久17c| 天堂av在线资源| 欧美性猛交xxxx黑人猛交| 日本少妇色视频| 国产精品一区二区x88av| 免费观看亚洲视频| 日本在线电影一区二区三区| 成人做爰www免费看视频网站| 中文字幕在线直播| 欧美疯狂性受xxxxx另类| 五月婷婷在线观看| 夜夜嗨av一区二区三区四区| 五月激情婷婷综合| 日韩美女一区二区三区| 男人的天堂一区二区| 亚洲欧美色图小说| 国产三级精品三级观看| 欧美激情中文字幕一区二区| a级大片在线观看| 日韩激情视频在线观看| 欧美 日韩 激情| 日本女优一区| 日韩电影天堂视频一区二区| 香蕉视频一区二区三区| 国产精品一香蕉国产线看观看| 卡通欧美亚洲| 欧美一级片久久久久久久| 草草在线视频| 国自在线精品视频| 视频午夜在线| 亚洲精品福利资源站| 无码国产精品高潮久久99| 亚洲成年网站在线观看| 天天射天天干天天| 一本大道av伊人久久综合| 91丝袜一区二区三区| 色综合咪咪久久| 一级黄色av片| 亚洲精品自拍动漫在线| 极品久久久久久| 一区二区三区美女| av免费播放网站| 国产精品美女久久久久久| а天堂中文在线资源| 国产精品不卡一区二区三区| 久久精品女同亚洲女同13| 成人精品小蝌蚪| 在线观看国产网站| 国产一区二区毛片| 超碰在线超碰在线| 成人小视频免费在线观看| 玖玖爱在线精品视频| 久久久精品天堂| 国产精品suv一区二区88| 亚洲欧美日韩国产一区二区三区| 玖玖爱免费视频| 香蕉成人伊视频在线观看| 日本va欧美va国产激情| 在线观看av一区二区| 日韩黄色三级视频| 亚洲免费观看高清完整版在线观看 | 亚洲天堂网站在线观看视频| 亚洲第九十九页| 欧美日韩成人综合| 精品人妻无码一区二区色欲产成人 | 久久不见久久见免费视频7| 亚洲午夜精品一区二区 | av免费播放网址| 麻豆一区二区三| 国产精品99精品无码视亚| 久久激情综合网| 性折磨bdsm欧美激情另类| 91女人视频在线观看| 秋霞欧美一区二区三区视频免费| 亚洲v中文字幕| 中文字幕日韩国产| 亚洲精品mp4| 日本在线免费播放| 91sa在线看| 国产亚洲观看| 欧美日韩最好看的视频| 卡通动漫国产精品| 亚洲精品高清视频| 激情偷拍久久| 男人的天堂最新网址| 91免费视频大全| 91成人福利视频| 欧美在线不卡一区| 欧美一区二区三区久久久| 777午夜精品视频在线播放| 天堂在线视频免费| 亚洲国产精品热久久| 秋霞影院午夜丰满少妇在线视频| 中文字幕久久久| av电影在线观看一区二区三区| 91精品国产91久久久久久吃药 | 欧美色视频一区| 久久久久久久久久成人| 欧美一区二区视频免费观看| 精品电影在线| 国产亚洲精品美女| 国产传媒av在线| 波多野结衣久草一区| 99精品视频精品精品视频| 欧美 日韩 国产一区| 国产成人欧美日韩在线电影| 最新日韩免费视频| 色94色欧美sute亚洲线路二| 日本精品一二区| 亚洲国产一区二区三区四区| 4438x成人网全国最大| 国产精品入口免费视| 久久99成人| 亚洲欧美精品| 日欧美一区二区| 中日韩精品一区二区三区| 中文字幕欧美日韩一区| 成年人二级毛片| 欧美日韩三级视频| 日本中文字幕视频在线| 国产精品电影一区| 欧美精选一区二区三区| 日本熟妇人妻xxxxx| 91麻豆精东视频| 成人免费视频毛片| 亚洲精品成人免费| 丁香花在线电影| 国产精品久久久久久久久久直播| 国内精品福利| 久久久久久久人妻无码中文字幕爆| 久久综合丝袜日本网| 日本在线小视频| 亚洲福利视频二区| 国内激情视频在线观看| 国产色综合一区二区三区| 久久av影视| 免费大片在线观看| 国产夜色精品一区二区av| 欧美人禽zoz0强交| 欧美一二三在线| 爱情岛论坛亚洲品质自拍视频网站| 国产精品久久波多野结衣| 怡红院精品视频在线观看极品| 国产亚洲色婷婷久久99精品91| 午夜成人在线视频| 久久电影视频| 成人精品一区二区三区| 欧美久色视频| 亚洲成人av免费在线观看| 色婷婷精品大在线视频| 成人在线观看黄色| 成人亚洲综合色就1024| 国产精品v一区二区三区| 免费中文字幕av| 欧美最猛黑人xxxxx猛交| 秋霞午夜在线观看| 国产精品一区二区三区观看| 久久国产欧美| 国产精品久久国产精麻豆96堂| 精品久久久久久综合日本欧美 | 亚洲成人免费视频| 国内精品一区视频| 91亚洲永久免费精品| 99精品热6080yy久久| 一级片久久久久| 日韩欧美高清在线| 欧美电影免费观看高清完整| 国产欧美日韩一区二区三区| 亚洲综合精品| 九九热最新地址| 精品网站999www| 182在线视频观看| 9a蜜桃久久久久久免费| 亚洲免费精品| 中文字幕资源站| 亚洲精品久久久久久久久久久久久 | 青青国产在线| 91亚洲va在线va天堂va国| 99综合精品| 国产一区二区视频在线观看免费|