星期一, 6月 25, 2018

Enable Https by Nginx in docker

對於那些提供 Web Service 的 docker image(如圖左側),要如何賦予 https 的連線能力?當然依各種服務都有不同的做法可行,例如 GitLab 要改 gitlab.rb,Jenkins 是個 war 等等,不過有沒有更簡單一致的做法?那就是隔壁也開一個 Nginx docker container,配置如圖:
假設申請簽署的網站名為 nginx.acme.com,pem 格式的金鑰對紀錄在 nginx.acme.com.key 檔案內,nginx.acme.com.crt 是 pem 格式的憑證檔, Nginx 設定當有以下段落:
  • server {
    • listen 443 ssl;
    • server_name nginx.acme.com;
    • ssl_certificate /etc/ssl/certs/nginx.acme.com.crt;
    • ssl_certificate_key /etc/ssl/certs/nginx.acme.com.key;
    • ...
    • location / {
      • proxy_pass http://172.17.0.2:80;
      • proxy_set_header Host $host;
      • proxy_set_header X-Real-IP $remote_addr;
      • proxy_set_header X-Forwarded-Proto https;
    • }
    • ...
  • }
東拼西湊來的有些不踏實,這裡有比較完整的說明。

[2018/06/27]
這件事似乎有個常見的名詞 SSL Termination,用 HAProxy 也可以,請參考這篇

[2018/08/17]
由於 Nginx 官方 docker image 只聽著 port 80,在不想改官方產出的前提下,可以:

  • 由外面的 443 對應到裡面的 80,-p 443:80
  • Nginx 設定檔 listen 80 ssl;
  • 在某些虛擬機環境,因為防火牆的規則比較亂,可能讓這個 image 開不起來,在這篇有人提到解法:
    • iptables -t filter -F
    • iptables -t filter -X
    • systemctl restart docker

沒有留言:

張貼留言