反向代理伺服器是一種通常位於網頁伺服器之前的伺服器,它可以提供網頁伺服器本身沒有的附件功能。
例如,反向代理可以提供SSL結束、負載平衡、請求路由、快取、壓縮,甚至A/B測試。
當用docker容器執行web服務時,執行一個反向代理可以簡化部署。
**
為什麼要為docker使用反向代理?
**
docker容器被分配隨機的IP和端口,這使得從客戶端的角度來定位這些容器比較困難。預設地,這些IP和連接埠是私有的,不能從外部訪問,除非它們和宿主機綁定。
把容器和宿主機綁定,會阻止運作在同一個連接埠上的容器。例如,每次都只能有一個docker綁定到連接埠80。另外,這也使得部署新版本的容器變得複雜。因為新版本只有在舊版停止服務後,才能啟動服務。
反向代理可以解決上面的這些問題,同時透過提供0宕機時間來改善可靠性。
**
產生反向代理程式設定
當容器啟動和停止時,設定反向代理的配置是一件負責的事。通常配置需要手動更新,這需要大量的時間,而且容易出錯。
幸運的是,docker提供了一個遠端呼叫API,可以觀察容易,並存取容器的IP和端口,已經配置元資料。另外,docker也提供了一個即時事件API,當容器啟動和停止時,可以用來發送通知。這些API可以用來自動產生反向代理配置。
docker-gen是一個小應用。它使用docker的API,把容器的元資料導入模板。產生模板後,可以用它重啟服務。
使用docker-gen,可以自動產生nginx配置,並當配置改變時,重新載入nginx。同樣的方法可以用在docker log管理。
**
針對docker的nginx反向代理
#**
下面的nginx模板範例可以用來產生docker容器的反向代理配置。這個模板使用golang。 groupby模板函數被用來給運行中的容器分組,分組是基於VIRTUAL_HOST環境變數做的。這個方式簡化了遍歷容器,以便產生負載平衡的後台,同時也支援了0宕機的部署。
{{ range
#containers := groupBy #「Env.VIRTUAL_HOST」 }}
upstream {{
#host }} {
#{{ range
value := containers }}
{{ with
address := index #value.Addresses 0 }}
server {{
address.IP }}:{{ $address.Port }};
{{ end }}
{{ end }}
#}
server {
#ssl_certificate /etc/nginx/certs/demo.pem;
#ssl_certificate_key /etc/nginx/certs/demo.key;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name {{ $host }}; location / { proxy_pass http://{{ $host }}; include /etc/nginx/proxy_params; }
}
{{ end }}
#這個範本使用下面的指令執行:
docker-gen -only-exposed -watch -notify “/etc/init.d/nginx reload” templates/nginx.tmpl /etc/nginx/sites-enabled/default
-only-exposed - 仅使用暴露出端口的容器. -watch - 运行后,观察容器的事件,并重新生成模板. -notify "/etc/init.d/nginx reload" - 重新加载nginx. templates/nginx.tmpl - nginx模板. /etc/nginx/sites-enabled/default - 目标文件.
下面是設定了兩個容器demo1和demo2的模板
upstream demo1.localhost {
server 172.17.0.4:5000;
server 172.17.0.3:5000;
}
server {
#ssl_certificate /etc/nginx/certs/demo.pem;
#ssl_certificate_key /etc/nginx/certs/demo.key;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name demo1.localhost; location / { proxy_pass http://demo.localhost; include /etc/nginx/proxy_params; }
}
upstream demo2.localhost {
server 172.17.0.5:5000;
}
server {
#ssl_certificate /etc/nginx/certs/demo.pem;
#ssl_certificate_key /etc/nginx/certs/demo.key;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name demo2.localhost; location / { proxy_pass http://demo2.localhost; include /etc/nginx/proxy_params; }
}
**
試試看
#* *
可以試試看我做好的build。 https://index.docker.io/u/jwilder/nginx-proxy/
執行nginx代理容器:
#docker run -e VIRTUAL_HOST=foo.bar.com -t …
如果你使用HTTPS,想運行其他的容器,可以看看
github上的項目,以得到更多的資訊。
**
結論
**
為docker容器產生nginx反向代理配置,可以透過使用docker API自動的完成。這個方式可以簡化部署,提供可用性。
這個方案對執行在單一host上的容器很方便。為分散式主機提供組態依賴服務發現。可以看看docker服務發現的內容,然後找到解決方案。
翻譯。原文見:http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/
反向代理伺服器是一種通常位於網頁伺服器之前的伺服器,它可以提供web伺服器本身沒有的附件功能。 例如,反向代理可以提供SSL終結、負載平衡、請求路由、快取、壓縮,甚至A/B測試。
**
為什麼要為docker使用反向代理?**
docker容器被分配隨機的IP和端口,這使得從客戶端的角度來定位這些容器比較困難。預設地,這些IP和連接埠是私有的,不能從外部訪問,除非它們和宿主機綁定。 把容器和宿主機綁定,會阻止運作在同一個連接埠上的容器。例如,每次都只能有一個docker綁定到連接埠80。另外,這也使得部署新版本的容器變得複雜。因為新版本只有在舊版停止服務後,才能啟動服務。反向代理可以解決上面的這些問題,同時透過提供0宕機時間來改善可靠性。
****當容器啟動和停止時,設定反向代理的配置是一件負責的事。通常配置需要手動更新,這需要大量的時間,而且容易出錯。
docker-gen是一個小應用。它使用docker的API,把容器的元資料導入模板。產生模板後,可以用它重啟服務。 使用docker-gen,可以自動產生nginx配置,並當配置改變時,重新載入nginx。同樣的方法可以用在docker log管理。 **
針對docker的nginx反向代理
host }} {
{{ range
value := containers }}
{{ with
#address := index value.Addresses 0 }}
server {{
address.IP }}:{{ $address .Port }};
{{ end }}
{{ end }}
}
server {
#ssl_certificate /etc/nginx/certs/demo.pem;
#ssl_certificate_key /etc/nginx/certs/demo.key;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name {{ $host }}; location / { proxy_pass http://{{ $host }}; include /etc/nginx/proxy_params; }
}
{{ end }}
這個模板使用下面的指令執行:
docker-gen - only-exposed -watch -notify “/etc/init.d/nginx reload” templates/nginx.tmpl /etc/nginx/sites-enabled/default
-only-exposed - 仅使用暴露出端口的容器. -watch - 运行后,观察容器的事件,并重新生成模板. -notify "/etc/init.d/nginx reload" - 重新加载nginx. templates/nginx.tmpl - nginx模板. /etc/nginx/sites-enabled/default - 目标文件.
下面是配置了兩個容器demo1和demo2的模板
upstream demo1.localhost {
server 172.17.0.4:5000;
server 172.17.0.3:5000;
}
server {
#ssl_certificate /etc/nginx/certs/demo.pem;
#ssl_certificate_key /etc/nginx/certs/demo.key;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name demo1.localhost; location / { proxy_pass http://demo.localhost; include /etc/nginx/proxy_params; }
}
upstream demo2.localhost {
server 172.17.0.5:5000;
}
server {
#ssl_certificate /etc/nginx/certs/demo.pem;
#ssl_certificate_key /etc/nginx/certs/demo.key;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; server_name demo2.localhost; location / { proxy_pass http://demo2.localhost; include /etc/nginx/proxy_params; }
}
**
試試看
#* *
可以試試看我做好的build。 https://index.docker.io/u/jwilder/nginx-proxy/
運行nginx代理容器:
以上是用Docker建立nginx反向代理的詳細內容。更多資訊請關注PHP中文網其他相關文章!