Nginx+Lua配置請求複製

来源:https://www.cnblogs.com/xgf-h/archive/2018/03/27/8656022.html
-Advertisement-
Play Games

通過配置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.0headers-more-nginx-module-0.31LuaJIT-2.1.0-beta2lua-nginx-module-0.10.2ngx_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。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • .rar壓縮文件linux中不識別,.zip在windows和Linux中動能使用。 .gz:由gzip壓縮工具壓縮的文件 .bz2:bzip2壓縮工具壓縮的文件 .tar:由tar打包程式打包的文件。(tar並沒有壓縮功能,只是把一個目錄合併成一個文件)。 .tar.gz:先有tar打包,然後再由 ...
  • 一、SELinux的歷史 SELinux全稱是Security Enhanced Linux,由美國國家安全部(National Security Agency)領導開發的GPL項目,它擁有一個靈活而強制性的訪問控制結構,旨在提高Linux系統的安全性,提供強健的安全保證,可防禦未知攻擊,相當於B1 ...
  • 今天有個人問我du和df的統計結果為什麼會不同。給他解析了一番,後來想想還是寫篇文章從原理上來分析分析。 我們常常使用du和df來獲取目錄或文件系統已占用空間的情況。但它們的統計結果是不一致的,大多數時候,它們的結果相差不會很大,但有時候它們的統計結果會相差非常大。 例如: df中"/"的使用空間是 ...
  • 一、背景和現象 初創公司,架構lanmp,web前端和後端分開伺服器,業務驅動主要是nginx和apache,nginx主要是處理靜態文件和反向代理,前後端、搜索引擎、緩存、隊列等附加的服務都是用docker容器部署。因為比較初級,上傳文件和採集文件都是直接寫在硬碟上,涉及到的目錄共用,就在其中一臺 ...
  • 1、安裝yum源:yum install epel-release -y 2、安裝stress:yum install stress -y 3、使用樣例:stress -c 1 -t 60 4、測試場景舉例 1)測試CPU負荷 輸入命令:stress –c 4 增加4個cpu進程,處理sqrt()函 ...
  • 創建域目錄:mkdir -p /home/weblogic/Oracle/Middleware/user_projects/domains/base_domain/ 創建文件: create_domain.rsp ...
  • 環境: centos6.8 無桌面環境 jdk1.7.0_25 關閉iptables、selinux 安裝前準備: 1、新建weblogic用戶,設置weblogic密碼 2、切換用戶至weblogic下,將已下載的jdk上傳到伺服器上,解壓並移動到/usr/local/jdk1.7 2.1、配置環 ...
  • 在Linux上使用vim命令編輯文本內容,Vim是從 vi 發展出來的一個文本編輯器。代碼補完、編譯及錯誤跳轉等方便編程的功能特別豐富,在程式員中被廣泛使用。簡單的來說, vi 是老式的字處理器,不過功能已經很齊全了,但是還是有可以進步的地方。 vim 則可以說是程式開發者的一項很好用的工具。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...