2016-05-31 30 views
3

我正在使用nginx爲可能位於防火牆後面的Web應用創建反向代理。對於我最初的概念證明,我使用了下面的位置塊來確保它的工作。使用nginx正則表達式位置匹配將URI的動態映射到多個反向代理的不同端口

location/{ 
      proxy_pass https://localhost:2222; 
      proxy_set_header Host $host; 
      proxy_set_header X-Forwarded-For $remote_addr; 
    } 

我在我的網絡應用程序ssh -f -N -T -R2222:localhost:443 [email protected]上打開我的反向隧道。 這與我喜歡的完全相同。我型我nginx-ip到我的瀏覽器,我得到的HTTPS流量從我的web應用程序,但由nginx-ip模糊等

我想允許潛在的幾千反向隧道雖然跨越幾千年的端口(而不是隻2222在上述情況下)。閱讀nginx,以動態使用包含端口號的URI到該特定端口的proxy_pass。

也就是說,我想https://nginx-ip/2222/proxy_pass https://localhost:2222;,我想https://nginx-ip/1111/proxy_pass https://localhost:1111;

我已經嘗試了不少變化,但據我已經能夠理性,我降落在想這應該工作:

location ~* ^/(\d+) { 
      proxy_pass https://localhost:$1; 
      proxy_set_header Host $host; 
      proxy_set_header X-Forwarded-For $remote_addr; 
    } 

事實並非如此。我在我的瀏覽器中得到一個502錯誤的網關,錯誤日誌給我:

2016/05/31 21:02:36 [error] 6188#0:* 3584沒有解析器定義來解析localhost,client: {我的客戶端-IP},服務器:localhost,請求: 「GET/2222/HTTP/1.1」,主持人: 「{nginx的-IP}」

當我使用的127.0.0.1代替localhost我得到一個404 。網頁上說

找不到 在此服務器上找不到請求的URL/2222 /。

是我試圖用nginx配置可能嗎?

重申,我希望能夠通過nginx Web服務器啓動許多(數千個)獨特的反向隧道。我最初的想法是根據我想要代理的其他Web應用程序來改變nginx服務器的傳出端口,並通過URI中的端口將請求分配給我的nginx服務器到不同的端口(通過正則表達式提取它) 。

+1

404錯誤來自後端服務器(打開'ssh'隧道的那個)?如果是這樣,你可能需要添加一個[在這個答案中的URL重寫規則](http://serverfault.com/a/379679/123520)來刪除'/ 2222'。 – Cirdec

+0

哦!是的!起初我沒有意識到這一點。謝謝! – 0xtobit

+0

注意:[這個問題](http://stackoverflow.com/questions/25106424/nginx-proxy-redirection-with-port-from-uri)非常相似。 – 0xtobit

回答

2

爲了解決我的問題,並在@Cirdec的幫助下,我最終走向了一個不同的方向。

而不是使用URI中的路徑引用端口,我成功地使用該端口作爲子域。也就是說,1111.my-host-name將通過端口1111上的127.0.0.1localhost)上的反向代理髮送內容。從我的/etc/hosts文件通配符DNS匹配在/etc/hosts將無法​​正常工作,但你可以硬編碼的幾個條目,以測試它的工作原理

摘錄:這需要爭取一些DNS通配符,以幫助一些重上市(注。 :

nginx-box-ip-address  2222.my-host-name 
nginx-box-ip-address  1111.my-host-name 

這種搭配nginx的配置:

server { 
    listen 443; 
    server_name ~^(?<port_subdomain>[0-9]*).my-host-name$; 

    # NOTE: omitted extra ssl configuration lines 

    location/{ 
      proxy_pass https://127.0.0.1:$port_subdomain; 
      proxy_set_header Host $host; 
      proxy_set_header X-Forwarded-For $remote_addr; 
    } 
} 

現在我可以有我的web應用程序打開反向代理隧道任意端口上我的nginx箱(我的主機名),並達到他們通過一個subdomai ñ。

一步步例如:

  • 在我的web應用程序框之一,我打開了一個反向隧道口2222在我的nginx箱(我的主機名)與ssh -f -N -T -R2222:localhost:443 [email protected]
    • 在不同的Web應用程序框我可以打開不同的隧道相同的nginx箱(我的主機名),通過在不同的Web應用程序運行框中ssh -f -N -T -R1111:localhost:443 [email protected]說口1111
  • 在我的nginx框中,我已經加載了上面的配置。我打開chrome並點擊2222.my-host-name,就好像我直接點擊我的web應用程序框的URL/IP地址(由於反向代理服務器,它只能在防火牆後面)。打到1111.my-host-name帶我到另一個網絡應用程序框,這是完全分開的,並通過一個完全獨立的隧道。
0

你應該能夠與url-rewriting rule的組合來做到這一點,除去指定端口和named capture提取requested_port作爲proxy_pass指令可用變量的數字。

location ~* ^/(?<requested_port>\d+) { 
      rewrite /(\d+)(.*) /$1 break; 
      proxy_pass https://localhost:$requested_port; 
      proxy_set_header Host $host; 
      proxy_set_header X-Forwarded-For $remote_addr; 
    }