最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Nginx流量同時轉(zhuǎn)發(fā)多后端(流量鏡像分發(fā))

 更新時間:2024年10月24日 09:21:56   作者:GEEK JUMP  
在需要同時將請求轉(zhuǎn)發(fā)至多個后端服務(wù)的場景中,Nginx的mirror模塊提供了流量鏡像分發(fā)的功能,本文就來介紹一下Nginx流量同時轉(zhuǎn)發(fā)多后端(流量鏡像分發(fā)),感興趣的可以了解一下

一、背景

請注意,我這里標題提到的是一個請求流量被同時轉(zhuǎn)發(fā)到2個或者多個后端,而非負載均衡的場景!!!

負載均衡的場景我想就不用贅述了,定義一個upstrem, upstrem定了一組提供相同服務(wù)的server地址, 最后通過proxy_pass轉(zhuǎn)發(fā)到這個upstrem。  但是,這個是負載均衡的場景,那就意味著,無論你的算法如何,最終只會轉(zhuǎn)發(fā)到一個server目標上。

那文章標題提到的流量鏡像是什么場景呢?  那就是一次HTTP請求,被同時轉(zhuǎn)發(fā)到多個后端。 例如一次請求,既代理到A服務(wù)、也代理到B服務(wù),發(fā)送了2次或者n次的情況。

為什么有這個流量鏡像分發(fā)需求呢?  我們有這么一個場景, 由于新版服務(wù)和舊版服務(wù)的代碼變更, 出于某種原因,既想保留舊版、也想保留新版做過渡, 所以想把前端的流量分發(fā)2次,這樣新舊系統(tǒng)的數(shù)據(jù)都能保存下來,不影響業(yè)務(wù)使用。 等過段時間,過渡期好了之后,再把舊版server下掉。

尋找了一些資料,openresty+lua也許能實現(xiàn),但是我測試不行。 最終發(fā)現(xiàn)了Nginx本身就有這個功能模塊。 這個就是mirror模塊。

二、Nginx mirror模塊

mirror模塊從Nginx1.13開始就是內(nèi)置了,所以只要是1.13版本以后就可以直接使用,不需要重新編譯nginx。

官方文檔地址: Module ngx_http_mirror_module

從配置樣例來看,很簡單。 首先代理的location / 還是先做主代理站點, proxy_pass到$backend,  之后再加一個mirror  /mirror;  流量鏡像分發(fā)到/mirror的URL,  再看下面定了了/mirror的location定義, 這里面再次定義proxy_pass 到test_backend, 從而完成流量鏡像分發(fā)的目的。

三、實際配置測試

1、準備2個flask服務(wù),8081、8082端口

1、flask-8081.py

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/api/data', methods=['GET', 'POST'])
def save_request_data():
    headers = dict(request.headers)
    if request.is_json:
        # 如果請求體是 JSON 格式
        body = request.get_json(silent=True)
    elif request.content_type and 'form' in request.content_type.lower():
        # 如果請求體是表單數(shù)據(jù)
        body = request.form.to_dict()
    else:
        # 其他類型的請求體(例如純文本)
        body = request.data.decode('utf-8')
    args = request.args.to_dict()
    data = {
        "headers": headers,
        "body": body,
        "args": args
    }
    with open('request_data.txt', 'a') as file:
        file.write(str(data))
        file.write('\n')
    return jsonify({
        "status": "success",
        "message": "Data has been saved."
    })


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8081, debug=True)

2、flask-8082.py

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/api/data', methods=['GET', 'POST'])
def save_request_data():
    headers = dict(request.headers)
    if request.is_json:
        # 如果請求體是 JSON 格式
        body = request.get_json(silent=True)
    elif request.content_type and 'form' in request.content_type.lower():
        # 如果請求體是表單數(shù)據(jù)
        body = request.form.to_dict()
    else:
        # 其他類型的請求體(例如純文本)
        body = request.data.decode('utf-8')
    args = request.args.to_dict()
    data = {
        "headers": headers,
        "body": body,
        "args": args
    }
    with open('request_data.txt', 'a') as file:
        file.write(str(data))
        file.write('\n')
    return jsonify({
        "status": "success",
        "message": "Data has been saved."
    })


if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8082, debug=True)

2、修改nginx的配置文件

    location /api/data/ {
       #優(yōu)先轉(zhuǎn)發(fā)172.16.0.3:8081
       proxy_pass http://172.16.0.3:8081/api/data;
       #同時, 流量鏡像轉(zhuǎn)發(fā)到/mirror/, 172.16.0.3:8082
       mirror /mirror/;
    }
    location /mirror/ {
       internal;
       proxy_pass http://172.16.0.3:8082/api/data;
    }

3、測試結(jié)果

CURL請求代理的nginx端口,然后分別查看8081、8082端口是否同時接收到相同的HTTP請求: 

觀察8081端口程序日志輸出:

觀察8082端口程序日志 輸出:

由此發(fā)現(xiàn),我們在nginx發(fā)生的2次請求, 2個后端8081、8082同時收到了2次請求。 由此證明,我們的流量鏡像分發(fā)是符合預期的。

 4、最終響應(yīng)內(nèi)容是8081還是8082的內(nèi)容?

結(jié)論:   一切都以第一個proxy_pass的站點的實際響應(yīng)結(jié)果為準,不管第二個被mirror流量分發(fā)站點的響應(yīng)情況是否正常

服務(wù)運行情況以及響應(yīng)信息表格如下:

8081 正常8082正常以8081內(nèi)容為準, 正常, 2臺都會轉(zhuǎn)發(fā)
8081 正常8082異常以8081內(nèi)容為準, 正常,  8082不會在后臺轉(zhuǎn)發(fā)
8081 異常8082正常以8081內(nèi)容為準, 異常, 8082會在后臺轉(zhuǎn)發(fā)
8081 異常8082異常以8081內(nèi)容為準, 異常, 8082不會在后臺轉(zhuǎn)發(fā)

四、總結(jié)

mirror流量鏡像分發(fā)的場景還是有實際存在意義的,要不然官方也不會把它納入到內(nèi)置模塊當中。具體的需求情況需要自己判定。

流量轉(zhuǎn)發(fā)畢竟是2次轉(zhuǎn)發(fā)過程,對于nginx的壓力、以及性能應(yīng)該是會有損耗的,但是具體損耗沒測試過, 這個讀者朋友可以自行測試。

到此這篇關(guān)于Nginx流量同時轉(zhuǎn)發(fā)多后端(流量鏡像分發(fā))的文章就介紹到這了,更多相關(guān)Nginx 流量鏡像分發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Nginx通過geo模塊設(shè)置白名單的例子

    Nginx通過geo模塊設(shè)置白名單的例子

    今天小編就為大家分享一篇Nginx通過geo模塊設(shè)置白名單的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Windows設(shè)置nginx啟動端口的方法

    Windows設(shè)置nginx啟動端口的方法

    在服務(wù)器配置與開發(fā)過程中,nginx 作為一款高效的 HTTP 和反向代理服務(wù)器,被廣泛應(yīng)用,而在 Windows 系統(tǒng)中,合理設(shè)置 nginx 的啟動端口,是確保其正常運行與滿足業(yè)務(wù)需求的關(guān)鍵步驟,本文將詳細介紹 Windows 設(shè)置 nginx 啟動端口的方法,需要的朋友可以參考下
    2025-02-02
  • nginx強制使用https訪問的方法(http跳轉(zhuǎn)到https)

    nginx強制使用https訪問的方法(http跳轉(zhuǎn)到https)

    這篇文章主要介紹了nginx強制使用https訪問的方法(http跳轉(zhuǎn)到https),具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2017-01-01
  • nginx如何根據(jù)報文里字段轉(zhuǎn)發(fā)至不同地址

    nginx如何根據(jù)報文里字段轉(zhuǎn)發(fā)至不同地址

    要在 Nginx 中根據(jù) POST 請求的 JSON 負載中的 id 字段的值進行轉(zhuǎn)發(fā),你可以使用 Nginx 的 ngx_http_lua_module 模塊,這個模塊允許你在 Nginx 配置中使用 Lua 腳本,本文介紹nginx如何根據(jù)報文里字段轉(zhuǎn)發(fā)至不同地址,感興趣的朋友一起看看吧
    2024-12-12
  • ubuntu系統(tǒng)中nginx啟動腳本

    ubuntu系統(tǒng)中nginx啟動腳本

    這篇文章主要介紹了ubuntu系統(tǒng)中nginx啟動腳本,可以實現(xiàn)nginx的自啟動,需要的朋友可以參考下
    2014-02-02
  • Nginx?Socket代理的實現(xiàn)方法

    Nginx?Socket代理的實現(xiàn)方法

    Nginx的socket代理通常指的是Nginx通過stream模塊來處理非HTTP的?TCP?流量,本文就來介紹一下Nginx?Socket代理的實現(xiàn)方法,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • Nginx服務(wù)器配置性能優(yōu)化方案

    Nginx服務(wù)器配置性能優(yōu)化方案

    這篇文章主要為大家詳細介紹了Nginx服務(wù)器配置性能優(yōu)化方案,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Nginx 跨域配置中add_header 和 proxy_set_header區(qū)別

    Nginx 跨域配置中add_header 和 proxy_set_header區(qū)別

    本文主要介紹了Nginx 跨域配置中add_header 和 proxy_set_header區(qū)別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2026-02-02
  • 加速nginx性能: 開啟gzip和緩存

    加速nginx性能: 開啟gzip和緩存

    nginx 是一個高性能的 Web 服務(wù)器,之前也寫過一些關(guān)于 nginx 的文章。為了提高博客的響應(yīng)速度,可以從設(shè)置 nginx 的 gzip 和緩存這2方面入手。為字體開啟 gzip 和緩存能大大減少帶寬的消耗
    2017-03-03
  • Nginx路徑重寫方式

    Nginx路徑重寫方式

    這篇文章主要介紹了Nginx路徑重寫方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評論

上思县| 宣城市| 浦东新区| 贺兰县| 伊春市| 肇源县| 利津县| 闽清县| 万全县| 拉萨市| 石门县| 昭平县| 莲花县| 庆云县| 大宁县| 富宁县| 顺昌县| 图木舒克市| 潜江市| 保德县| 内江市| 公主岭市| 鄯善县| 吉首市| 吉林市| 宁强县| 平潭县| 柯坪县| 太和县| 尼木县| 青阳县| 雅安市| 城步| 毕节市| 锡林郭勒盟| 临沧市| 津南区| 遂宁市| 隆林| 泊头市| 铁岭市|