Nginx

根據 url 將流量重定向到不同的 ip 地址維護埠和 url 資訊

  • January 31, 2015

我們有一個 QA 版本、一個 UAT 版本和一個 DEV 版本的 webapp。使用者需要通過http://uat.company.com:41002/webapphttp://qa.company.com:41002/webapp和訪問這些http://dev.company.com:41002/webapp。在埠 41001 和埠 8080 上還有一個不同的 webapp,它們需要訪問。

這些 url 必須在公司外部可用,並且我們只有一個可以訪問它們的公共 IP 地址。因此,DNS 記錄需要所有 3 個地址指向一個 IP。在那個單一的 IP 地址上,有一個伺服器正在執行 nginx。在後台我需要每個 url 指向不同的伺服器

http://uat.company.com --> 123.123.123.1
http://qa.company.com  --> 123.123.123.2
http://dev.company.com --> 123.123.123.3

恐怕我不知道正確的術語,但是 URI 和埠的其餘部分也必須轉移到 IP 地址。即如果有人訪問

http://uat.company.com:41002/webapp/somepage`

它看起來好像是他們訪問過的頁面,但實際上他們會查看

http://123.123.123.1:41002/webapp/somepage

或者如果他們訪問

http://qa.company.com:8080/static/home.html

他們真的會看

http://123.123.123.2:8080/static/home.html

但他們的瀏覽器仍然會說http://qa.company.com:8080/static/home.html

我試過了

server {

   server_name uat.company.com;

   listen 41001;
   listen 41002;
   listen 8080;

   location / {
           proxy_pass http://123.123.123.1:$server_port$uri;
           proxy_set_header Host $host;
   }

}

但是,這給了我一個帶有日誌的錯誤網關 502 頁面:2015/01/28 16:04:49 [crit] 30571#0: *1 connect() to 123.123.123.1:41002 failed (13: Permission denied) while connecting to upstream, client: 172.23.128.245, server: uat.company.com, request: "GET /webapp/ HTTP/1.1", upstream: "http://123.123.123.1:41002/webapp/", host: "uat.company.com:41002"

我希望這更清楚。


更新 來自 Xaviers 的建議,即 SELinux 可能一直在阻礙,我已禁用它並且我確實走得更遠。使用上面的 nginx 配置現在似乎連接到第二個伺服器:但是埠仍然沒有通過。我打電話

uat.company.com:41002/webapp/

如果直接呼叫服務,這將重定向到

uat.company.com:41002/webapp/spring/config/main

然而,通過代理髮生的事情是它正在返回或結束於

uat.company.com/webapp/spring/config/main

因此無法載入頁面…

我已經確定了我的設置存在什麼問題。

  1. SELinux 阻止我連接上游。我現在已禁用此功能,稍後會考慮正確設置

  2. proxy_pass 正在按預期工作,但是我需要的參數是http://123.123.123.1:$server_port/$uri$is_args$args;

3)proxy_set_header Host $host正確地將主機名設置回我想要的,但是牠吃掉了埠號。我需要的正確格式是proxy_set_header Host $host:$server_port

可能有更簡潔的解決方案,我還沒有一個完整的工作解決方案,因為我已經削減它以使其工作,但是我的配置的一個工作部分是:

server {
   listen 41002;
   server_name uat.comapny.com;

   location /webapp {
       proxy_pass http://123.123.123.1:41002/$uri$is_args$args;
       proxy_set_header Host $host:$server_port;
   }
}

一旦我充實了它,我將發布一個更通用的版本。非常感謝所有幫助過的人。

引用自:https://serverfault.com/questions/663063