通過配置nginx來將請求進行複製,轉發到其他應用,以下是自己實際搭建的步驟以及自己的理解,方便以後使用 1、環境搭建 參考鏈接: http://www.crackedzone.com/testing-service-with-nginx-copy-request.html https://blog ...
通過配置nginx來將請求進行複製,轉發到其他應用,以下是自己實際搭建的步驟以及自己的理解,方便以後使用
1、環境搭建
參考鏈接:
http://www.crackedzone.com/testing-service-with-nginx-copy-request.html
https://blog.csdn.net/qq_25551295/article/details/51744815
實際搭建環境如下:Linux CenterOS 6.5 ,Nginx1.9.0,headers-more-nginx-module-0.31,LuaJIT-2.1.0-beta2,lua-nginx-module-0.10.2,ngx_devel_kit-0.2.19。
以上是搭建成功的各個對應版本,如果版本不對應可能會導致nginx編譯失敗,githup下載後的插件儘量重命名一下,方便使用。
按照參考鏈接進行編譯Nginx。
編譯插件可能會遇到的問題:
1、缺少gcc庫:yum install -y gcc gcc-c++
2、缺少pcre庫:參考地址
3、缺少openssl庫:yum -y install openssl openssl-devel
2、Nginx+Lua文件配置
a、編寫一個 copy request 的 lua 腳本copy_req.lua
local res1, res2, action action = ngx.var.request_method if action == "POST" then arry = {method = ngx.HTTP_POST, body = ngx.req.read_body()} else arry = {method = ngx.HTTP_GET} end if ngx.var.svr == "on" then res1, res2 = ngx.location.capture_multi { { "/product" .. ngx.var.request_uri , arry}, { "/test" .. ngx.var.request_uri , arry}, } else res1, res2 = ngx.location.capture_multi { { "/product" .. ngx.var.request_uri , arry}, } end if res1.status == ngx.HTTP_OK then local header_list = {"Content-Length", "Content-Type", "Content-Encoding", "Accept-Ranges"} for _, i in ipairs(header_list) do if res1.header[i] then ngx.header[i] = res1.header[i] end end ngx.say(res1.body) #此處代表只返回生產環境的返回結果 else ngx.status = ngx.HTTP_NOT_FOUND end
此處文件地址引用是可以寫覺得地址,相對地址是相對於nginx目錄的。
b、配置對應的Nginx配置文件,此處本文地址是conf/vhost/fenliu.conf,在nginx.conf下端加入include vhost/*.conf;
fenliu.conf文件配置如下:
upstream product { server 127.0.0.1:80; } upstream test { server 192.168.1.1:88; } server { listen 8000; #lua_code_cache off; location ~* ^/product { log_subrequest on; rewrite ^/product(.*)$ $1 break; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://product; access_log logs/product-upstream.log; } location ~* ^/test { log_subrequest on; rewrite ^/test(.*)$ $1 break; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://test; access_log logs/test-upstream.log; } location ~* ^/(.*)$ { client_body_buffer_size 2m; set $svr "on"; #開啟或關閉copy功能 content_by_lua_file conf/vhost/copy_req.lua; } }
此文件很重要,這裡備註的是本人自己的理解,^/product,^/test主要就是對這兩個路徑訪問的url進行轉發,一個轉發到生產,一個到測試,多了一個rewrite是為了重寫請求地址,下麵會講到,
^/(.*)$才是重點,是將所有非product,test請求進行請求複製轉發。
以上面配置為例,實際使用的流程如下:
1、請求地址:http://ip:8000/hello/req.do
2、nginx不匹配product和test會走最後一個,通過Lua配置會變成兩個請求/product/hello/req.do和/test/hello/req.do
3、這時會被nginx的product和test攔截到,進行轉發到生產和測試環境,此時地址是不對的,所以使用rewrite進行url重寫,
rewrite ^/product(.*)$ $1 break; 匹配/product/hello/req.do會變成/product(/hello/req.do),$1代表/hello/req.do,重寫後的地址就會變成我們想要的地址,轉發後就變成http://product/hello/req.do。