日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

nginx proxy_pass转发规则解析

發布時間:2024/1/8 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nginx proxy_pass转发规则解析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

綜述

nginx官方網站講解proxy_pass時,只給了規則的說明,并沒有給出具體的示例輔助理解。對于英語不太好的人,理解起來真的很頭痛,只能通過測試來驗證對英文意思的猜測。
nginx對proxy_pass的官方說明見http://nginx.org/en/docs/http/ngx_http_proxy_module.html#proxy_pass
其將proxy_pass的轉發規則分為3類:

  • location為簡單配置(非正則表達式),proxy_pass的url帶path路徑
  • location為簡單配置(非正則表達式),proxy_pass的url不帶path路徑
  • nginx無法確認url的替換規則
  • url中帶path路徑

    判斷條件

    如果域名后面帶了“/”,則認為是url中帶了path路徑。比如:

  • proxy_pass http://127.0.0.1/
  • proxy_pass http://127.0.0.1/aaa
  • proxy_pass http://127.0.0.1/aaa/
  • 轉發規則

    nginx官網原文如下:

    If the proxy_pass directive is specified with a URI, then when a request is passed to the server, the part of a normalized request URI matching the location is replaced by a URI specified in the directive:

    location /name/ {
    proxy_pass http://127.0.0.1/remote/;
    }

    個人理解如下:
    使用proxy_pass配置的url去替換location指定的部分。如下圖就是使用http://127.0.0.1/remote/去替換path中/name/這一段

    url中不帶path路徑

    判斷條件

    與第一點相反,proxy_pass指定url中只有域名,比如ttp://127.0.0.1

    轉發規則

    If proxy_pass is specified without a URI, the request URI is passed to the server in the same form as sent by a client when the original request is processed, or the full normalized request URI is passed when processing the changed URI:

    location /some/path/ {
    proxy_pass http://127.0.0.1;
    }

    個人理解如下:
    轉發url=proxy_pass配置的url+原始url中path部分

    nginx無法確認url的替換規則

    這種場景nginx又細分成3類

    location指定的是正則表達式

    nginx官方要求配置proxy_pass時,不能帶path路徑。

    When location is specified using a regular expression, and also inside named locations.
    In these cases, proxy_pass should be specified without a URI.

    path路徑在location中使用rewrite重寫了

    比如

    location /name/ {
    rewrite /name/([^/]+) /users?name=$1 break;
    proxy_pass http://127.0.0.1/test;
    }
    In this case, the URI specified in the directive is ignored and the full changed request URI is passed to the server.

    這種場景,nginx會忽略proxy_pass中配置的path路徑,然后使用proxy_pass中指定的域名加上rewrite中指定的path路徑即為轉發后的url。

    proxy_pass配置的url中帶變量

    比如

    location /name/ {
    proxy_pass http://127.0.0.1$request_uri;
    }
    In this case, if URI is specified in the directive, it is passed to the server as is, replacing the original request URI.

    這種場景,如果proxy_pass配置的url經過變量轉換后帶path路徑,則直接使用該url。

    其他

    實際上,“nginx無法確認url的替換規則”3個細分類可能存在交叉的地方,這個nginx沒有提到,大家只能動手自己去測試nginx的混合場景的規則了。
    比如我們系統后端服務是沒有context-path的,后面為了容器化需要添加context-path,詳細背景見之前的博客。為了對前端屏蔽變化,因此需要修改nginx的轉發規則。如下圖所示,這樣就涉及到“location指定的是正則表達式”和“proxy_pass配置的url中帶變量”混合場景了。

    If the location is given by regular expression, can not be a URI part in proxy_pass directive, unless there are variables in the directive

    如果location使用正則表達式,proxy_pass中不能指定path,除非proxy_pass中包含變量。

    補充說明

    當時分析nginx轉發規則,是為了解決轉發時,url增加公共前綴,當時不理解為啥在正則表達場景下不能通過在proxy_pass中配置公共前綴,達到增加公共前綴的目的(像簡單模式那樣,使用proxy_pass替換掉url中正則表達式匹配上的那部分)。
    后面在定位我們灰度分流配置時,頓悟nginx轉發規則這樣設計的目的。
    我們需要通過url中的租戶id進行分流,nginx配置如下

    location ~ /tenants/(租戶id)/ {proxy_pass https://$gray;}location ~ / {proxy_pass https://$production;}

    當時第一眼看到這個配置時,感覺灰度分流不會生效,只會走正式邊。因為我們的url是/api/tenants開頭,location配置中少了“/api”,結果測試發現分流正常。
    初步分析,nignx中的正則表達式與我們自己寫代表中的正則表達一樣,它是對整個url進行匹配。并不像普通模式那樣從url起始位置開始進行匹配(當然如果需要從起始位置開始匹配,也可以通過指定"^")。
    因此正則表達式匹配上的部分,可能是url中間的一部分,這樣就不好實用proxy_pass替換掉location中指定的部分。所以nignx要求,正則表達式場景下,配置proxy_pass時不能帶path路徑,除非proxy_pass指定的就是完整的url,這樣nginx要么直接使用proxy_pass中指定的url,要么使用原始url中的path+proxy_pass中指定的域名。
    proxy_pass中包含變量后,nginx這認為你指定了完整的url,因此交叉場景下,proxy_pass包含變量優先級更高。

    淌坑指導-no resolver defined to resolve

    當proxy_pass指定的url中帶變量時,必須指定resolver。具體解釋見https://stackoverflow.com/questions/17685674/nginx-proxy-pass-with-remote-addr(這個解釋也沒給出細節,nginx官方也沒給出具體解釋)
    比如

    set $originaddr http://origin.example.com;
    proxy_pass $originaddr;

    或者
    proxy_pass http://origin.example.com$request_uri;

    可以在server層級指定resolver,比如

    server {
    ????resolver xx.xx.xx.xx;
    ???? … …
    }

    具體resolver配置那個IP,可以查看系統默認配置的DNS服務器- cat /etc/resolv.conf

    趟坑指導-“proxy_set_header Host $proxy_host”

    背景同上

    我們要將服務由虛擬機遷到公司的docker部署平臺,這樣可以自動部署,監控擴容啥的也更方便。
    我們服務很多,nginx上面配置了很多轉發規則,為了對前端屏蔽后端的組網變化,我們保留了nginx,通過nginx轉發到ALB(docker通過ALB對外暴露服務)。
    服務上了docker后,url要增加前綴(見背景文章),因此nginx轉發規則要統一給轉發后的url增加公共前綴,配置方式見上述“其他”章節。
    配置后發現仍然報404(直接訪問ALB是ok的)。
    問題排查思路如下:

  • 確認轉發后的url是不是如自己期望的那樣
    首先想通過nginx日志打印轉發后的規則,沒有發現合適的參數;因此通過tcpdump工具dump報文,發現轉發后的url正確,但是請求頭中的Host并不是ALB對外暴露的域名,而是我們Nignx自己的域名,因此懷疑ALB的路由規則中會包含對域名的檢測。(ALB
    也是一臺Nginx,Nignx可以通過server_name將轉發規則綁定到特定的域名,或者說給不同的域名指定不同的路由規則)。
  • google如何修改Host頭,找到配置項"proxy_set_header Host $proxy_host",配置后驗證ok。
  • 總結

    以上是生活随笔為你收集整理的nginx proxy_pass转发规则解析的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 2020国产精品视频 | 边添小泬边狠狠躁视频 | a视频在线观看免费 | 男男野外做爰全过程69 | 欧美电影一区二区三区 | 97精品超碰一区二区三区 | 日本孕妇孕交 | 欧美人与性禽动交精品 | 99免费精品视频 | 久久综合九色综合网站 | 国产伦精品一区二区三区妓女 | 欧美在线一二三四区 | 精品久久久久久一区二区里番 | 88av视频 | 成人va在线观看 | 欧美日本一道 | 中文字幕免费在线视频 | 久久久综合 | 国产丝袜视频在线 | 草草影院在线观看 | 婷婷午夜精品久久久久久性色av | 青草青青视频 | 亚洲国产99 | 天天干导航 | 亚洲视频456 | av动漫网 | 欧美熟妇另类久久久久久多毛 | 黄色电影在线视频 | 99热在线观看精品 | 青青在线视频观看 | 凸凹人妻人人澡人人添 | 国产99在线观看 | 黄色美女av| 久久成人国产 | 国产夫妻性生活视频 | 国产大片中文字幕在线观看 | 99国产精| 亚洲网站一区 | 91最新地址永久入口 | 91色综合 | 久久久久久亚洲精品 | 日本久久激情 | 日本3p视频 | 激情欧美综合 | 狠狠爱成人| 午夜av一区二区三区 | 亚洲色图第一页 | www.亚洲精品 | 成人看片黄a免费看视频 | 免费黄色高清视频 | 91大片在线观看 | 三级在线观看网站 | 亚洲字幕av一区二区三区四区 | 黄片毛片在线 | 日本精品一区二区三区四区 | 性视频免费看 | 亚洲天堂男人的天堂 | 在线精品免费视频 | 国产成人小视频在线观看 | 中文字幕一区二区三区不卡 | 丰满孕妇性春猛交xx大陆 | 亚洲av无码一区二区三区观看 | 国产又爽又黄免费软件 | 日本免费一区二区三区四区五六区 | 亚洲熟女综合色一区二区三区 | 久久人人艹 | 99久久久无码国产精品 | 日日爽夜夜爽 | 国产精品久久久久久久久岛 | 久久二区三区 | 亚洲高清在线 | 波多野结衣成人在线 | 成人av在线资源 | 国产高清区 | av免费成人| 亚洲欧美偷拍视频 | 免费av软件 | 免费看裸体视频网站 | 二区久久| 久久三区 | 天天干夜夜草 | 久伊人 | 97视频在线观看免费 | 男生女生插插插 | 一区二区三区在线视频播放 | 91操碰| 亚洲精品88| 国产午夜大地久久 | 91精品久久久久久久久 | 伊人22| 素人一区 | 国产宾馆实践打屁股91 | 涩涩涩在线观看 | 国产精品国产三级国产aⅴ中文 | 久久99网站 | 久久久性视频 | 亚洲视屏一区 | 黄色大片在线免费观看 | 荷兰女人裸体性做爰 |