我們在 D13 - NGINX Image 時介紹了 NGINX 的基本用法,
假設我們的 API 開發完成,Domain 跟 DNS 也處理好了,NGINX 也導向我們的 API 服務,
接下來,距離把 API 提供給前端串接,就剩下最後一步了,
為了安全考量,我們必須替 API 簽署 SSL 憑證,把 API 從 HTTP 架成 HTTPS
,
例如從 http://louis.example.com
變成 https://louis.example.com
,有了憑證跟 HTTPS 的安全機制,才能保護使用者的 Request 不受駭客竊聽,Request 傳輸的內容會被加密,只有 Client (使用者的瀏覽器) 跟 Server 才有辦法解開並看到內容,
因此,今天的主題就是研究如何借助 Docker 來處理 SSL 憑證。
如果不想購買付費的 SSL 憑證,第一首選就是使用 Let'sEncrypt
跟 Certbot
的組合技,
Let'sEncrypt 這個網站可以申請免費的憑證,當然,前提是我們擁有要申請憑證的網域,
而 Certbot 則是一個能自動處理申請的工具,它能夠自動讀取 NGINX 的設定檔,讀取找出我們設定的網域,接著向 Let'sEncrypt 申請對應的憑證來使用,
還能自動判斷憑證的過期時間,幫我們更新憑證,
jonasal/nginx-certbot
這個 Docker image 雖然這不是官方的 Image,但同樣也有很高的使用量,
它把 NGINX 跟 Certbot 結合起來後,讓我們可以用 Docker 架設好 NGINX 的同時,也把 HTTPS 處理好,
更詳細的介紹,讀者可以閱讀他們的 Docker hub 或 Github 首頁,
雖然說是研究,但嘗試之後才發現它真的很容易使用,很簡單的設定就能讓 Certbot 正常運作,
讓我們直接看設定檔:
# docker-compose.yml
version: '3'
services:
nginx:
image: jonasal/nginx-certbot:3
restart: unless-stopped
environment:
- CERTBOT_EMAIL=your-email@example.com
ports:
- 80:80
- 443:443
volumes:
- ./letsencrypt:/etc/letsencrypt
- ./user_conf.d:/etc/nginx/user_conf.d
其中是 CERTBOT_EMAIL 是必要的環境變數,為的是讓 Certbot 可以對簽署者寄送重要的通知,
Port 的部分,因為要把 80 Port 的流量都導向 443 (HTTPS 預設使用的 Port),因此這兩個 Port 都需要用到,
Volume 綁定了兩個資料夾,
第一個 letsencrypt/
資料夾,是儲存 SSL 憑證檔案的地方,
第二個 user_conf.d/
資料夾,這是 nginx-certbot image 特別定義的,用來讓我們放入自訂的 NGINX 設定檔,
如果讀者好奇這個資料夾的設計原因,可以進一步閱讀 The user_conf.d Folder 的說明。
再來是我們的 NGINX 設定檔,請把 louis-ithelp.example.com
的地方替換成你所擁有的網域:
# user_conf.d/louis.conf
server {
# Listen to port 443 on both IPv4 and IPv6.
listen 443 ssl default_server reuseport;
listen [::]:443 ssl default_server reuseport;
# Domain names this server should respond to.
server_name louis-ithelp.example.com;
# Load the certificate files.
ssl_certificate /etc/letsencrypt/live/louis/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/louis/privkey.pem;
ssl_trusted_certificate /etc/letsencrypt/live/louis/chain.pem;
# Load the Diffie-Hellman parameter.
ssl_dhparam /etc/letsencrypt/dhparams/dhparam.pem;
return 200 'Let\'s Encrypt certificate successfully installed!';
add_header Content-Type text/plain;
}
以上的設定檔都是從官方的 Github Repo 中找到的範例,讀者也可以到 Example 看看,
執行 docker compose 後,根據官方文件所說,需要稍等一下下,等待 Certbot 執行完 SSL 的簽署,
sudo docker compose up -d
接著就能使用我們的 HTTPS 網站了:
到此,一個基本的 HTTPS API 服務就用 Docker 給運作起來了,
如果你已經擁有一個網域,可以馬上來試一下,
如果還沒有的話 ... 你也可以馬上買一個 ヽ(✿゚▽゚)ノ
那今天的研究就到這邊,程式碼可以在 這裡 找到。