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

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

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

一、背景

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

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

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

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

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

二、Nginx mirror模塊

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

官方文檔地址: Module ngx_http_mirror_module

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

三、實(shí)際配置測(cè)試

1、準(zhǔn)備2個(gè)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:
        # 如果請(qǐng)求體是 JSON 格式
        body = request.get_json(silent=True)
    elif request.content_type and 'form' in request.content_type.lower():
        # 如果請(qǐng)求體是表單數(shù)據(jù)
        body = request.form.to_dict()
    else:
        # 其他類型的請(qǐng)求體(例如純文本)
        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:
        # 如果請(qǐng)求體是 JSON 格式
        body = request.get_json(silent=True)
    elif request.content_type and 'form' in request.content_type.lower():
        # 如果請(qǐng)求體是表單數(shù)據(jù)
        body = request.form.to_dict()
    else:
        # 其他類型的請(qǐng)求體(例如純文本)
        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;
       #同時(shí), 流量鏡像轉(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、測(cè)試結(jié)果

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

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

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

由此發(fā)現(xiàn),我們?cè)趎ginx發(fā)生的2次請(qǐng)求, 2個(gè)后端8081、8082同時(shí)收到了2次請(qǐng)求。 由此證明,我們的流量鏡像分發(fā)是符合預(yù)期的。

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

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

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

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

四、總結(jié)

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

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

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

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Nginx路徑重寫方式

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

最新評(píng)論

南通市| 嵊州市| 富民县| 海南省| 盖州市| 金昌市| 昭平县| 桂平市| 边坝县| 普格县| 加查县| 伽师县| 杭锦旗| 固阳县| 额尔古纳市| 新余市| 博罗县| 呼伦贝尔市| 怀集县| 隆安县| 雅江县| 观塘区| 汉源县| 鹤庆县| 聊城市| 武安市| 文山县| 阆中市| 杭州市| 奉化市| 同德县| 德格县| 洪洞县| 巫溪县| 逊克县| 崇州市| 吉林市| 开平市| 通渭县| 阿克陶县| 陆河县|