内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

Nginx動(dòng)態(tài)反向代理(2022/11/12)-創(chuàng)新互聯(lián)

Nginx動(dòng)態(tài)反向代理(2022/11/12)

在壽縣等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專注、極致的服務(wù)理念,為客戶提供成都做網(wǎng)站、成都網(wǎng)站制作 網(wǎng)站設(shè)計(jì)制作定制設(shè)計(jì),公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站設(shè)計(jì),網(wǎng)絡(luò)營銷推廣,成都外貿(mào)網(wǎng)站建設(shè),壽縣網(wǎng)站建設(shè)費(fèi)用合理。文章目錄
  • Nginx動(dòng)態(tài)反向代理(2022/11/12)
    • 一、搭建環(huán)境
    • 二、技術(shù)方案
    • 三、實(shí)現(xiàn)過程
    • 四、配置結(jié)果

工作中經(jīng)常遇到需要在前端訪問第三方平臺(tái)接口的情況,前端直接訪問會(huì)遇到跨域、http 禁止調(diào)用 https 等問題,故需要在后臺(tái)通過 Nginx 進(jìn)行反向代理。隨著第三方平臺(tái)的增加,反向代理配置文件越來越復(fù)雜,因此筆者在考慮通過參數(shù)傳遞目標(biāo)地址實(shí)現(xiàn)動(dòng)態(tài)反向代理,本文將詳細(xì)介紹實(shí)現(xiàn)過程。

一、搭建環(huán)境
  • CentOS Linux release 7.9.2009 (Core);
  • Nginx/1.22.0;
二、技術(shù)方案

方案一:

通過 query 參數(shù)攜帶反向代理目標(biāo)地址到 nginx,nginx 通過$arg_variable獲取到代理地址,進(jìn)而通過proxy_pass進(jìn)行反向代理。

方案二:

通過 sub url 傳遞反向代理目標(biāo)地址到 nginx,nginx 通過正則匹配獲取到代理地址,進(jìn)而通過proxy_pass進(jìn)行反向代理。

方案對(duì)比:

在實(shí)現(xiàn)的過程中,發(fā)現(xiàn)方案一存在以下問題:

  • 獲取到的代理目標(biāo)地址經(jīng)過了 url 編碼,nginx 無法正確代理;
  • url 編碼將//編碼成了/;
  • 反向代理時(shí) query 參數(shù)會(huì)攜帶反向代理地址,導(dǎo)致部分代理地址無法正確響應(yīng)結(jié)果;

因此,筆者最終選擇了通過方案二來實(shí)現(xiàn),詳細(xì)的實(shí)現(xiàn)過程見下文。

三、實(shí)現(xiàn)過程
  1. 配置 DNS 解析服務(wù)器:因?yàn)?code>proxy_pass使用變量時(shí)無法正確解析域名,因此需要手動(dòng)指定 DNS 解析服務(wù)器;

    location /_proxy/ {
        # 配置 DNS 服務(wù)器,proxy_pass 采用變量時(shí)需要指定
        resolver 114.114.114.114 valid=3600s;
    }
  2. 獲取代理地址:通過正則表達(dá)式獲取代理目標(biāo)地址,以 https://127.0.0.1/_proxy/https://api.github.com/search/users?q=test 為例;

    location /_proxy/ {
        # 配置 DNS 服務(wù)器,proxy_pass 采用變量時(shí)需要指定
        resolver 114.114.114.114 valid=3600s;
    
        # 通過正則截取路由中的 sub url
        if ($request_uri ~* "/_proxy/(.*)") {
            set $proxy_url $1;
        }
    }
  3. 進(jìn)行反向代理:通過正則獲取代理地址中的主機(jī)地址,并通過proxy_pass進(jìn)行反向代理;

    location /_proxy/ {
        # 配置 DNS 服務(wù)器,proxy_pass 采用變量時(shí)需要指定
        resolver 114.114.114.114 valid=3600s;
    
        # 通過正則截取路由中的 sub url
        if ($request_uri ~* "/_proxy/(.*)") {
            set $proxy_url $1;
        }
    
        # 解析請(qǐng)求地址,并進(jìn)行反向代理
        set $is_matched 0;
        if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {
            set $is_matched 1;
            set $proxy_protocol http$2;
            set $proxy_host $3;
            set $proxy_uri $4;
            set $proxy_url $proxy_protocol://$proxy_host$proxy_uri;
    
            proxy_pass $proxy_url$is_args$args;
        }
    }

    注:proxy_pass 通過變量指定地址時(shí),不會(huì)將 query 參數(shù)傳遞給目標(biāo)地址,因此需要通過$is_args$args手動(dòng)傳遞 query 參數(shù)。

  4. WebSocket 支持:根據(jù)$http_upgrade的值實(shí)現(xiàn)動(dòng)態(tài)升級(jí) WebSocket 連接;

    # map 指令根據(jù)客戶端請(qǐng)求頭中 $http_upgrade 的值構(gòu)建 $connection_upgrade 的值;如果 $http_upgrade 沒有匹配,默認(rèn)值為 upgrade,如果 $http_upgrade 配置空字符串,值為 close
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    location /_proxy/ {
        # 配置 DNS 服務(wù)器,proxy_pass 采用變量時(shí)需要指定
        resolver 114.114.114.114 valid=3600s;
    
        # 通過正則截取路由中的 sub url
        if ($request_uri ~* "/_proxy/(.*)") {
            set $proxy_url $1;
        }
    
        # 解析請(qǐng)求地址,并進(jìn)行反向代理
        set $is_matched 0;
        if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {
            set $is_matched 1;
            set $proxy_protocol http$2;
            set $proxy_host $3;
            set $proxy_uri $4;
            set $proxy_url $proxy_protocol://$proxy_host$proxy_uri;
    
            proxy_pass $proxy_url$is_args$args;
        }
    
    
        # 請(qǐng)求服務(wù)器升級(jí)協(xié)議為 WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    
        # 設(shè)置讀寫超時(shí)時(shí)間,默認(rèn) 60s 無數(shù)據(jù)連接將會(huì)斷開
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    }
  5. 反向代理優(yōu)化:通過添加部分請(qǐng)求頭對(duì)反向代理進(jìn)行優(yōu)化;

    # map 指令根據(jù)客戶端請(qǐng)求頭中 $http_upgrade 的值構(gòu)建 $connection_upgrade 的值;如果 $http_upgrade 沒有匹配,默認(rèn)值為 upgrade,如果 $http_upgrade 配置空字符串,值為 close
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    location /_proxy/ {
        # 配置 DNS 服務(wù)器,proxy_pass 采用變量時(shí)需要指定
        resolver 114.114.114.114 valid=3600s;
    
        # 通過正則截取路由中的 sub url
        if ($request_uri ~* "/_proxy/(.*)") {
            set $proxy_url $1;
        }
    
        # 解析請(qǐng)求地址,并進(jìn)行反向代理
        set $is_matched 0;
        if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {
            set $is_matched 1;
            set $proxy_protocol http$2;
            set $proxy_host $3;
            set $proxy_uri $4;
            set $proxy_url $proxy_protocol://$proxy_host$proxy_uri;
    
            proxy_pass $proxy_url$is_args$args;
        }
    
    
        # 請(qǐng)求服務(wù)器升級(jí)協(xié)議為 WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    
        # 設(shè)置讀寫超時(shí)時(shí)間,默認(rèn) 60s 無數(shù)據(jù)連接將會(huì)斷開
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    
        # Host 主機(jī)名,為了避免目標(biāo)服務(wù)做限制此處采用目標(biāo)地址的 Host
        proxy_set_header Host $proxy_host;
        # X-Real-IP 將真實(shí)訪問者的遠(yuǎn)端 IP 地址轉(zhuǎn)發(fā)給代理服務(wù)器
        proxy_set_header X-Real-IP $remote_addr;
        # X-Forwarded-For 標(biāo)記客戶端通過代理連接到服務(wù)器的源 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # X-Forwarded-Host 標(biāo)記客戶端通過代理連接到服務(wù)器的原始主機(jī)
        proxy_set_header X-Forwarded-Host $host:$server_port;
        # X-Forwarded-Server 代理服務(wù)器的主機(jī)名
        proxy_set_header X-Forwarded-Server $host;
        # X-Forwarded-Port 定義客戶端請(qǐng)求的原始端口
        proxy_set_header X-Forwarded-Port $server_port;
        # X-Forwarded-Proto 標(biāo)記客戶端通過代理連接到服務(wù)器的協(xié)議
        proxy_set_header X-Forwarded-Proto $scheme;
        # proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
    }
  6. 異常處理:對(duì)不合法的代理地址進(jìn)行提示;

    # map 指令根據(jù)客戶端請(qǐng)求頭中 $http_upgrade 的值構(gòu)建 $connection_upgrade 的值;如果 $http_upgrade 沒有匹配,默認(rèn)值為 upgrade,如果 $http_upgrade 配置空字符串,值為 close
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }
    
    location /_proxy/ {
        # 配置 DNS 服務(wù)器,proxy_pass 采用變量時(shí)需要指定
        resolver 114.114.114.114 valid=3600s;
    
        # 通過正則截取路由中的 sub url
        if ($request_uri ~* "/_proxy/(.*)") {
            set $proxy_url $1;
        }
    
        # 解析請(qǐng)求地址,并進(jìn)行反向代理
        set $is_matched 0;
        if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {
            set $is_matched 1;
            set $proxy_protocol http$2;
            set $proxy_host $3;
            set $proxy_uri $4;
            set $proxy_url $proxy_protocol://$proxy_host$proxy_uri;
    
            proxy_pass $proxy_url$is_args$args;
        }
    
    
        # 請(qǐng)求服務(wù)器升級(jí)協(xié)議為 WebSocket
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
    
        # 設(shè)置讀寫超時(shí)時(shí)間,默認(rèn) 60s 無數(shù)據(jù)連接將會(huì)斷開
        proxy_read_timeout 300s;
        proxy_send_timeout 300s;
    
        # Host 主機(jī)名,為了避免目標(biāo)服務(wù)做限制此處采用目標(biāo)地址的 Host
        proxy_set_header Host $proxy_host;
        # X-Real-IP 將真實(shí)訪問者的遠(yuǎn)端 IP 地址轉(zhuǎn)發(fā)給代理服務(wù)器
        proxy_set_header X-Real-IP $remote_addr;
        # X-Forwarded-For 標(biāo)記客戶端通過代理連接到服務(wù)器的源 IP
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        # X-Forwarded-Host 標(biāo)記客戶端通過代理連接到服務(wù)器的原始主機(jī)
        proxy_set_header X-Forwarded-Host $host:$server_port;
        # X-Forwarded-Server 代理服務(wù)器的主機(jī)名
        proxy_set_header X-Forwarded-Server $host;
        # X-Forwarded-Port 定義客戶端請(qǐng)求的原始端口
        proxy_set_header X-Forwarded-Port $server_port;
        # X-Forwarded-Proto 標(biāo)記客戶端通過代理連接到服務(wù)器的協(xié)議
        proxy_set_header X-Forwarded-Proto $scheme;
        # proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;
    
        # 如果目標(biāo)地址為非 http、https、ws、wss 請(qǐng)求,提示錯(cuò)誤信息
        default_type application/json;
        if ($is_matched = 0) {
            return 200 '{"code": 404, "message": "The proxy url is invalid!", "proxy_url": $proxy_url}';
        }
        # 調(diào)試輸出
        # return 200 '{"code": 200, "proxy_url": $proxy_url$is_args$args, "proxy_host": $proxy_host, "request_uri": $request_uri}';
    }
四、配置結(jié)果
# map 指令根據(jù)客戶端請(qǐng)求頭中 $http_upgrade 的值構(gòu)建 $connection_upgrade 的值;如果 $http_upgrade 沒有匹配,默認(rèn)值為 upgrade,如果 $http_upgrade 配置空字符串,值為 close
map $http_upgrade $connection_upgrade {
    default upgrade;
    '' close;
}

location /_proxy/ {
    # 配置 DNS 服務(wù)器,proxy_pass 采用變量時(shí)需要指定
    resolver 114.114.114.114 valid=3600s;

    # 通過正則截取路由中的 sub url
    if ($request_uri ~* "/_proxy/(.*)") {
        set $proxy_url $1;
    }

    # 解析請(qǐng)求地址,并進(jìn)行反向代理
    set $is_matched 0;
    if ($proxy_url ~* "^(http|ws)(s?):\/\/?([a-zA-Z0-9\-\.]+:?\d*)([^\?]*)") {
        set $is_matched 1;
        set $proxy_protocol http$2;
        set $proxy_host $3;
        set $proxy_uri $4;
        set $proxy_url $proxy_protocol://$proxy_host$proxy_uri;

        proxy_pass $proxy_url$is_args$args;
    }


    # 請(qǐng)求服務(wù)器升級(jí)協(xié)議為 WebSocket
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;

    # 設(shè)置讀寫超時(shí)時(shí)間,默認(rèn) 60s 無數(shù)據(jù)連接將會(huì)斷開
    proxy_read_timeout 300s;
    proxy_send_timeout 300s;

    # Host 主機(jī)名,為了避免目標(biāo)服務(wù)做限制此處采用目標(biāo)地址的 Host
    proxy_set_header Host $proxy_host;
    # X-Real-IP 將真實(shí)訪問者的遠(yuǎn)端 IP 地址轉(zhuǎn)發(fā)給代理服務(wù)器
    proxy_set_header X-Real-IP $remote_addr;
    # X-Forwarded-For 標(biāo)記客戶端通過代理連接到服務(wù)器的源 IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    # X-Forwarded-Host 標(biāo)記客戶端通過代理連接到服務(wù)器的原始主機(jī)
    proxy_set_header X-Forwarded-Host $host:$server_port;
    # X-Forwarded-Server 代理服務(wù)器的主機(jī)名
    proxy_set_header X-Forwarded-Server $host;
    # X-Forwarded-Port 定義客戶端請(qǐng)求的原始端口
    proxy_set_header X-Forwarded-Port $server_port;
    # X-Forwarded-Proto 標(biāo)記客戶端通過代理連接到服務(wù)器的協(xié)議
    proxy_set_header X-Forwarded-Proto $scheme;
    # proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto;

    # 如果目標(biāo)地址為非 http、https、ws、wss 請(qǐng)求,提示錯(cuò)誤信息
    default_type application/json;
    if ($is_matched = 0) {
        return 200 '{"code": 404, "message": "The proxy url is invalid!", "proxy_url": $proxy_url}';
    }
    # 調(diào)試輸出
    # return 200 '{"code": 200, "proxy_url": $proxy_url$is_args$args, "proxy_host": $proxy_host, "request_uri": $request_uri}';
}

參考鏈接:

  • 真正的 nginx 萬能代理 - BigZhu very big
  • Nginx 根據(jù)鏈接參數(shù)動(dòng)態(tài)代理配置_FEN_TA的博客

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)頁名稱:Nginx動(dòng)態(tài)反向代理(2022/11/12)-創(chuàng)新互聯(lián)
本文來源:http://www.rwnh.cn/article46/jdehg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站響應(yīng)式網(wǎng)站、品牌網(wǎng)站設(shè)計(jì)、域名注冊(cè)服務(wù)器托管、網(wǎng)站營銷

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

商城網(wǎng)站建設(shè)
射洪县| 和龙市| 象州县| 翁源县| 麦盖提县| 临沭县| 中卫市| 台山市| 辽阳县| 武功县| 阳谷县| 铜陵市| 钦州市| 电白县| 北京市| 丰县| 安化县| 天水市| 西华县| 英德市| 天镇县| 祥云县| 胶州市| 读书| 垣曲县| 琼结县| 晋宁县| 垣曲县| 星子县| 龙泉市| 越西县| 阳高县| 德惠市| 苏州市| 蓝田县| 绥棱县| 郎溪县| 阿拉善左旗| 武平县| 大宁县| 宁津县|