反向代理是一種伺服器,它位於客戶端與應用伺服器(z.B. odoo)之間,負責將客戶端的請求轉發到內部的應用伺服器,並將應用伺服器的回應返回給客戶端。這樣的設計提供了一層額外的間接層,使得應用伺服器本身不直接暴露給客戶端。
在我們的案例中,Nginx 作為反向代理,它會接收來自瀏覽器或 API 客戶端的請求,然後將這些請求轉發給運行 odoo 的內部容器。
使用反向代理的原因有很多,尤其在多層應用部署中:
安全性提升:
負載均衡:
SSL/TLS 加密:
HTTP Request 管理:
我們直接來看看加上 reverse-proxy 後的 docker-compose
設定吧。這個設定檔已經是放在 WebApp-Deployment
中,因此部分路徑與上一章有些不同,大致的檔案結構可以參考第二章:模組、整合與部署:三層 Git Repo 結構的設計思考。
services:
reverse-proxy:
image: nginx:1.27-alpine # 使用 Nginx 1.27 的輕量化 Image
restart: always # 如果容器崩潰,會自動重啟
ports:
- "80:80" # 將主機的 HTTP 端口 80 映射到容器的 80 端口
- "443:443" # 將主機的 HTTPS 端口 443 映射到容器的 443 端口
volumes:
- ./reverse-proxy/nginx.conf:/etc/nginx/nginx.conf # 掛載主機的 Nginx 主設定檔
- ./reverse-proxy/conf.d:/etc/nginx/conf.d # 掛載其他 Nginx 設定檔,如虛擬主機配置
- ./config/certs:/etc/nginx/certs # 掛載 SSL/TLS 憑證,後面會特別有一章講怎麼處理敏感的設定
- ./reverse-proxy/html:/usr/share/nginx/html # 掛載自訂的錯誤頁面
networks:
- dev-net # 使用 `dev-net` 網路來與 odoo 通訊
postgresql-dev:
image: postgres:16.4
restart: always
networks:
- dev-net # 使用 `dev-net` 網路,與 odoo 容器進行通訊
env_file:
- ./config/dev.env # 掛載環境變數文件,後面會特別有一章講怎麼處理敏感的設定
volumes:
- db-dev-data:/var/lib/postgresql/data
odoo-dev:
build: ./odoo-dev/source # 從指定的 odoo 原始碼目錄構建 odoo 的 Docker 映像
restart: always
depends_on:
- postgresql-dev # 依賴於 PostgreSQL 資料庫,確保在 odoo 啟動前,資料庫已啟動
networks:
- dev-net
env_file:
- ./config/dev.env # 掛載環境變數文件,設定 odoo 的連線資料
volumes:
- odoo-dev-data:/var/lib/odoo # 將 odoo 的數據持久化存放在名為 `odoo-dev-data` 的 volume 中
由於篇幅所限這裡僅展示了 odoo-dev
的設定,但基本上 odoo-prod
也會使用相似的設定。
跟上一章最大的差別除了加入了 reverse-proxy 的設定,還有我們把 odoo-dev
跟主機的埠口映射拿掉了,會改由 Nginx 映射出來的 80/443 埠口處理用戶請求,並把跟 odoo-dev 有關的內容透過內部的 dev-net
轉發給 odoo container。
講完 docker-compose
的設定後,為了避免大家對 Docker 和網路不熟悉導致設定看得頭昏眼花,先幫大家畫了一下網路拓樸圖,架構包含兩個獨立的網路:dev-net
和 prod-net
,分別負責開發環境與生產環境的網路隔離。reverse-proxy
服務作為主要的入口,透過不同的網域將流量轉發至內部的 odoo 開發環境與生產環境。每個服務都有自己專屬的內部 IP 位址,並透過 Docker 的 DNS (127.0.0.11
) 來進行內部解析。
postgresql-dev
和 odoo-dev
:這兩個服務運行在 dev-net
,並透過內部網路進行資料庫連接和應用處理。postgresql-prod
和 odoo-prod
:這是生產環境的服務,位於 prod-net
,彼此進行資料庫與應用系統的交互。reverse-proxy
:同時連接 dev-net
和 prod-net
,負責處理外部請求,並根據不同的網域名稱將流量轉發到對應的 Odoo 容器。至於 network bridge
怎麼把 reverse-proxy
forward 到 host,這部分會根據 host OS 的不同有所差別,但總之 Docker 會幫你處理好,我就先不深入了。
下一篇文章將會專注於 nginx.conf
的詳細設定,我們會介紹如何設定 Nginx 作為反向代理,並確保所有的 HTTP 請求都能正確地重定向到 HTTPS,保護流量的安全。