2017-05-26 58 views
1

我想做一個關於nginx作爲使用Docker技術的反向代理的簡單配置。我正在考慮使用此解決方案:https://hub.docker.com/r/jwilder/nginx-proxy/nginx反向代理與碼頭工具 - 負載均衡

我需要實現以下行爲:

- >當請求到達www.example.com,它會去容器一個

- >當請求到達WWW .example.com/part,它會去容器B(不同的容器)

我不擅長Nginx服務器配置。我知道,在運行其他需要代理的容器時,我需要傳遞VIRTUAL_HOST,VIRTUAL_PORT變量,但我不知道要調整什麼,或者可能傳遞,以便強制nginx服務器根據位置切換流量。這是Nginx服務器及其位置指令的問題還是其他需要調整的東西?

預先感謝您在這裏度過的寶貴時間和精力。

所以這裏是對這個問題的更新 - 希望我會更精確地描述我的問題在哪裏。那麼,我已經花了很多時間在這個上,另一件事是我只能在沒有人使用這個系統的夜晚玩過配置。

我們在我們的環境中運行RHEL7(Maipo 7.3)上的Docker守護進程。在那裏,我們有幾個碼頭集裝箱,其中一個是基於mkodockx/docker-nginx-proxy:stable的平臺。請參閱下面的配置文件 - 基本思路是使用開關-e VIRTUAL_HOST = some_host運行每個映像。

我以爲我需要找到一種方法來傳遞另一個環境變量來獲取正確的位置指令創建;我正在調整圖像中/ app目錄中的nginx.tmpl。

請參見配置文件:

# Generated nginx site conf       
map $http_x_forwarded_proto $proxy_x_forwarded_proto { 
    default $http_x_forwarded_proto; 
    ''  $scheme; 
} 
map $http_upgrade $proxy_connection { 
    default upgrade; 
    '' close; 
} 

gzip_types text/plain text/css application/javascript application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; 
log_format vhost '$host $remote_addr - $remote_user [$time_local] ' 
       '"$request" $status $body_bytes_sent ' 
       '"$http_referer" "$http_user_agent"'; 
access_log off; 
error_log /proc/self/fd/2; 
client_max_body_size 10m; 
proxy_http_version 1.1; 
proxy_buffering off; 
proxy_set_header Host $http_host; 
proxy_set_header Upgrade $http_upgrade; 
proxy_set_header Connection $proxy_connection; 
proxy_set_header X-Real-IP $remote_addr; 
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
proxy_set_header X-Forwarded-Proto $proxy_x_forwarded_proto; 

server { 
     listen 80 default_server; 
     server_name _; 
     return 503; 
}  
upstream A.B.C.com {  
    server 172.17.0.7:8080;  
}   
server { 
    limit_conn perip 50; 
    limit_req zone=persec burst=80 nodelay; 
    server_name A.B.C.com; 
    location/{ 
      proxy_pass http://A.B.C.com; 
    } 
}   
upstream D.E.F.com {  
    server 172.17.0.16:8080;  
}   
server { 
    limit_conn perip 50; 
    limit_req zone=persec burst=80 nodelay; 
    server_name D.E.F.com; 
    location/{ 
      proxy_pass http://D.E.F.com; 
    } 
}   
upstream G.H.I.com {  
    server 172.17.0.8:80;  
}   
server { 
    limit_conn perip 50; 
    limit_req zone=persec burst=80 nodelay; 
    server_name G.H.I.com; 
    location/{ 
      proxy_pass http://G.H.I.com; 
    } 
}   
upstream J.K.L.com {  
    server 172.17.0.5:80;  
}   
server { 
    limit_conn perip 50; 
    limit_req zone=persec burst=80 nodelay; 
    server_name J.K.L.com; 
    location/{ 
      proxy_pass http://J.K.L.com; 
    } 
}   
upstream M.N.O.com {  
    server 172.17.0.6:80;  
}   
server { 
    limit_conn perip 50; 
    limit_req zone=persec burst=80 nodelay; 
    server_name M.N.O.com; 
    location/{ 
      proxy_pass http://M.N.O.com; 
    } 
} 

這裏是我的步驟:

1)我登錄到使用集裝箱碼頭工人EXEC - 它代理的bash

2)然後我調整nginx.tmpl文件 - 使用vim

3)然後我在容器中運行forego start -r命令

4)然後我檢查生成default.conf文件 - Nginx的是自動重啓

5)然後我試圖驗證網址

我的問題是,我需要有某種方式另一個容器中,這將成爲其內容URL,比方說DEFcom/schedule;當前的nginx.tmpl模板只會添加內部容器的IP(172.x.x.x:80)並創建另一個服務器塊/部分;我無法指定位置部分。

所以我想出了我的解決方案(新的nginx模板),它可以指定(傳遞)另一個變量。但是最後發生的事情是,新容器的所有內容都是從根(「/」)而不是從/ schedule部分提供的。然而,從URL D.E.F.com提供內容的現有容器實際上在URL D.E.F.com/content上有它的內容 - 但是您可能會看到,在產生的nginx配置中沒有指定此位置。兩臺服務器都自動添加到相同的上游部分。但這意味着,至少根據文件,將會有一種負載平衡,這不是預期的。我感到迷失在這裏。

那麼我在這裏忽略什麼或錯在哪裏?

再次,非常感謝您花費你的時間和精力。

回答

1

它與Nginx配置非常相關。隨着官方的Nginx碼頭工人的形象,你需要添加Nginx的配置是這樣的:

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    server_name www.example.com; 

    location/{ 
      # First attempt to serve request as file, then 
      # as directory, then fall back to displaying a 404. 
      try_files $uri $uri/ =404; 

      proxy_pass http://container_A:80; 
    } 
} 

server { 
    listen 80 default_server; 
    listen [::]:80 default_server; 

    server_name www.example.com; 

    location /part { 
      # First attempt to serve request as file, then 
      # as directory, then fall back to displaying a 404. 
      try_files $uri $uri/ =404; 

      proxy_pass http://container_B:80; 
    } 
} 

這裏的棘手問題是主機container_Acontainer_B。這些是由--name container_A--name container_B標誌表示的兩個容器中,並且你必須用戶定義通過指定通過首先創建經由docker network create <name-of-the-network>一個泊塢網絡並運行相同多克爾網絡中的每個容器網絡運行它們:

docker run .... --network=<name-of-the-network> ....

Docker Engine中的服務發現功能將發現用戶定義網絡中的主機container_Acontainer_BHere就是一個例子。

+0

恩,謝謝你的回答。我最大的問題是我想運行/啓動一個新的容器,它應該動態地處理對www.example.com/part的請求 - 也就是像-e VIRTUAL_HOST = www.example.com/part那樣傳遞請求,但我是不知道這是可能的...? – ivo

+0

是的,這是可能的,只要確保你在單獨的Docker網絡中運行每個容器,並且只從該網絡公開* nginx服務的端口*。 –

+0

嗯,不好意思,但我正在努力解決這個問題。我可以調整docker-gen的nginx.tmpl文件以根據需要添加更多的環境變量;我正在添加VIRTUAL_PATH,我嘗試指定位置部分 - 在我的情況下是「/ part」。所以我最終不得不使用具有不同位置設置的服務器塊,但仍無法使用。我找不到原因。 – ivo