用Docker建立nginx反向代理

大家讲道理
發布: 2023-03-07 22:20:02
原創
2423 人瀏覽過

反向代理伺服器是一種通常位於網頁伺服器之前的伺服器,它可以提供網頁伺服器本身沒有的附件功能。

例如,反向代理可以提供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,想運行其他的容器,可以看看

git

hub上的項目,以得到更多的資訊。

**

結論

**
為docker容器產生nginx反向代理配置,可以透過使用docker API自動的完成。這個方式可以簡化部署,提供可用性。

這個方案對執行在單一host上的容器很方便。為分散式主機提供組態依賴服務發現。可以看看docker服務發現的內容,然後找到解決方案。

翻譯。原文見:http://jasonwilder.com/blog/2014/03/25/automated-nginx-reverse-proxy-for-docker/

反向代理伺服器是一種通常位於網頁伺服器之前的伺服器,它可以提供web伺服器本身沒有的附件功能。 例如,反向代理可以提供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服務發現的內容,然後找到解決方案。 ###

以上是用Docker建立nginx反向代理的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板