在一台主機docker上跑著數個不同的網站容器,如何把80和443埠流量正確的轉送給對應容器呢?
PHP中文网
PHP中文网 2017-06-20 10:05:52
0
2
1392

求助。 。有dalao寫過教學的話把文章連結貼出來也行。 。百度了一圈已經昏迷。 。

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(2)
習慣沉默

折騰了一個下午,找到了docker的解決方案
github:https://github.com/JrCs/docke...

把重要的重點部分摘出來

單獨容器(建議方法)

nginx 代理還可以使用 jwilder/docker-gen
映像和官方 nginx 映像作為兩個獨立的容器運行。

您可能想要這樣做是為了防止將 docker 套接字綁定到公開暴露的容器服務(避免將 docker 套接字掛載在 nginx 暴露的容器中)。從安全角度來看更好。

要將 nginx 代理程式作為單獨的容器運行,您需要:

1)將模板檔案nginx.tmpl掛載到docker-gen容器中。您可以使用以下命令來取得最新的官方 nginx.tmpl:

雷雷

2) 設定 NGINX_DOCKER_GEN_CONTAINER 環境變數為 docker-gen 容器的名稱或 id。

範例:

  • 首先使用捲啟動 nginx(官方鏡像):

雷雷
  • 第二次啟動帶有共享捲和模板檔案的 docker-gen 容器:

雷雷
  • 然後啟動這個容器(NGINX_DOCKER_GEN_CONTAINER變數必須包含docker-gen容器名稱或id):

雷雷

然後按照前面的描述啟動要代理的任何容器。

  • 如果因為某些原因你無法使用 docker --volumes-from 選項,你可以使用 NGINX_PROXY_CONTAINER 變數指定 nginx 容器的名稱或 id。

讓我們加密

使用 Let's Encrypt 服務自動為虛擬主機建立有效的憑證。

設定以下環境變數以啟用對被代理的容器的 Let's Encrypt 支援。這個環境變數需要在每個要代理的應用程式容器中宣告。

  • LETSENCRYPT_HOST

  • LETSENCRYPT_EMAIL

LETSENCRYPT_HOST 變數很可能需要與 VIRTUAL_HOST 變數相同,且必須是可公開存取的領域。使用逗號分隔符號指定多個主機。

以下環境變數是可選的,它們參數化 Let's Encrypt 用戶端的工作方式。

  • LETSENCRYPT_KEYSIZE

LETSENCRYPT_KEYSIZE

變數決定請求密鑰的大小(以位元為單位,預設為4096)。 多域(SAN)憑證

如果您想要建立多域(SAN)證書,請將基域新增為
LETSENCRYPT_HOST

環境變數的第一個域。

測試證書

如果要建立沒有 5 個證書/週/域限制的測試證書,請定義值為 trueLETSENCRYPT_TEST 環境變數(在使用 LETSENCRYPT_HOST 請求證書的容器中)。如果您想要對所有容器全域執行此操作,請按如下所述設定 ACME_CA_URI。

自動更新憑證

每小時(3600 秒)檢查一次證書,並更新將在接下來的 30 天(90 天/3)內到期的每個證書。

範例:
雷雷

可選容器環境變數

可選的letsencrypt-nginx-proxy-companion容器環境變數用於自訂配置。

  • ACME_CA_URI - CA ACME API 端點的目錄 URI(預設值:https://acme-v01.api.letsencrypt.org/directory)。如果您將其值設為https://acme-staging.api.letsencrypt.org/directory,LetsEncrypt 將使用沒有 5 個憑證/週/網域限制的測試伺服器。您也可以為每個容器建立測試證書(請參閱讓我們加密測試證書)

例如

雷雷
  • DEBUG - 將其設為 true 以啟用入口點腳本的偵錯和 LetsEncrypt 憑證的生成,這可以幫助您找出任何設定問題。

  • 「com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true」標籤 - 在 nginx-proxy 容器上設定此標籤,告訴 docker-letsencrypt-nginx-proxy-companion 容器將其用作代理。

  • ACME_TOS_HASH - 讓您將替代的 TOS 雜湊傳遞給 simpl_le,以支援其他 CA 的 ACME 實作。

範例:

如果您想了解如何使用此容器的其他範例,請查看:

  • Karl Fathi 的例子

  • Karl 的更多範例

  • 喬治·伊耶斯的例子

  • Dmitry 的簡單 docker-compose 範例

注意,這裡有一個坑,也怪我自己沒看清楚,如果鏡像已經暴露端口就設置VIRTUAL_HOST、LETSENCRYPT_HOST、LETSENCRYPT_EMAIL就行,如果沒有就得在設置好三個環境變量之後自己加入--expose 容器內應用服務連接埠參數啟動。如果容器是discourse這樣的,就得在app.yml內設定好環境變數之後把連接埠對映的80:80改為未佔用連接埠:80,然後再儲存重建啟動。

大家讲道理

由於容器只能直接綁定宿主機的端口,例如我有10個web容器,那麼這些容器都需要80或者443,這樣-p參數不可行,所以要么是通過一個容器作為網關反向代理容器,用nginx,nginx容器進行-p,其他得php-fpm,node這樣得web容器,透過nginx做反向代理來進行訪問,憑證也直接交給nginx伺服器,進行443轉送就可以實現了。

其實這些都是基礎只是跟docker沒關係

這篇文章是一個lnmp環境,
/a/11...

如果是多個php-fpm或node或python後端服務的話,那麼nginx應該是下面這樣得

server{
  listen 80;
  server_name web1;
  location /{
    proxy_pass  ....
  }
}

server{
  listen 80;
  server_name web2;
  location /{
    proxy_pass  ....
  }

}

server{
  listen 80;
  server_name web3;
  location /{
    proxy_pass  ....
  }
}
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板