不多廢話,今天是 nginx.conf
的設定內容,大部分的全域設定是參考網路上常見的範例,我目前還沒有進行微調,主要的重點是 resolver 127.0.0.11
和 server{}
中的內容。更多細節可以參考 nginx 反向代理官方文件。
nginx
http {
sendfile on; # 啟用 sendfile,提升文件傳輸效能
tcp_nopush on; # 延遲發送部分封包,提升效能
tcp_nodelay on; # 禁用 Nagle 演算法,減少延遲
keepalive_timeout 65; # 保持連線的時間設定為 65 秒
types_hash_max_size 2048; # 調整 MIME 類型雜湊表的大小,以容納更多類型
include /etc/nginx/mime.types; # 包含預設的 MIME 類型設定
default_type application/octet-stream; # 設定預設的 MIME 類型
# 記錄檔設定
access_log /var/log/nginx/access.log; # 存取記錄
error_log /var/log/nginx/error.log; # 錯誤記錄
# Gzip 壓縮設定
gzip on; # 啟用 Gzip 壓縮
gzip_disable "msie6"; # 禁用對 IE6 的 Gzip 支援
# SSL 設定
ssl_protocols TLSv1.2 TLSv1.3; # 啟用 TLS 1.2 和 1.3 協議
ssl_prefer_server_ciphers on; # 優先使用伺服器端的加密套件
resolver 127.0.0.11 valid=30s; # 設定 Docker 內部的 DNS (還記得上一篇的網路架構圖嗎?),並設置解析結果的有效期為 30 秒
# 將 HTTP 請求重新導向到 HTTPS
server {
listen 80 default_server; # 監聽 HTTP 80 埠,作為預設伺服器
listen [::]:80 default_server; # 監聽 IPv6 的 HTTP 80 埠
server_name _; # 匹配所有網域名稱
return 301 https://$host$request_uri; # 將所有請求重新導向到 HTTPS
}
# 針對 Odoo 開發環境的反向代理設定
server {
listen 443 ssl; # 監聽 HTTPS 443 埠並啟用 SSL
server_name odoo-dev.internal.example.com odoo-dev.internal.example.local; # 針對這兩個內部網域提供服務
ssl_certificate /etc/nginx/certs/odoo_Certificate.crt; # 設定 SSL 憑證
ssl_certificate_key /etc/nginx/certs/odoo_Certificate.key; # 設定 SSL 私鑰
location / {
proxy_set_header X-Client-Domain "internal"; # 設定自訂標頭,標示這是內部請求
set $upstream odoo-dev:8069; # 定義 upstream 變數,指向 Odoo 容器的 8069 埠
proxy_pass http://$upstream; # 將請求轉發到 Odoo 容器
proxy_set_header Host $host; # 傳遞原始的 Host 標頭
proxy_set_header X-Real-IP $remote_addr; # 傳遞原始客戶端的 IP
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 傳遞 X-Forwarded-For 標頭
proxy_set_header X-Forwarded-Proto $scheme; # 傳遞 X-Forwarded-Proto 標頭,標示原始協議
# 處理上游伺服器錯誤的設定
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_connect_timeout 1s; # 設定連接超時為 1 秒
proxy_read_timeout 1s; # 設定讀取超時為 1 秒
proxy_send_timeout 1s; # 設定傳送超時為 1 秒
proxy_intercept_errors on; # 啟用錯誤攔截,當上游伺服器回傳錯誤時自動顯示錯誤頁面
}
# 設定允許的 IP 範圍
allow 10.0.0.0/8; # 允許來自 10.0.0.0/8 的內部網段
allow 172.16.0.0/12; # 允許來自 172.16.0.0/12 的內部網段
allow 192.168.0.0/16; # 允許來自 192.168.0.0/16 的內部網段
deny all; # 拒絕所有其他 IP 的存取
}
}
這裡有幾個要點需要注意:
resolver 127.0.0.11
:我不是像大部分教學那樣直接使用 proxy_pass http://odoo-dev:8069;
,因為這個反向代理同時處理至少三個 Web 服務(例如 odoo-dev
、odoo-prod
、pgAdmin
)。如果其中一個服務的容器未啟動,Nginx 會無法啟動並直接報錯。使用 Docker 預設的 DNS(127.0.0.11
)並將 upstream
設成變數,可以讓 Nginx 在發生內部連接問題時,先超時後再回傳 500 錯誤,而不至於整個 Nginx 無法啟動。
網域名稱設計:我們需要兩個網域的設定(odoo-dev.internal.example.com
和 odoo-dev.internal.example.local
)是因為 example.com
是正式環境的網域名稱,那我們怎麼在本機測試呢? example.local
就是用於同時模擬正式環境而且讓我們可以在開發的本機測試。透過這樣的設定,我可以將本機的請求轉發到 Nginx,並透過 Docker 的映射將請求轉發至 reverse-proxy。
hosts
設定如果你要在本機測試 Odoo 的 WebApp-Deployment
,可以透過 hosts
檔案設定,讓 example.local
網域指向本機:
Windows:
在管理者權限的 PowerShell 中執行以下指令,編輯 hosts
檔案:
Start-Process notepad.exe "C:\Windows\System32\drivers\etc\hosts"
然後在檔案中加入:
127.0.0.1 odoo-dev.internal.example.local
Linux:
編輯 hosts
檔案:
sudo vim /etc/hosts
然後在檔案中加入:
127.0.0.1 odoo-dev.internal.example.local
完成後,在瀏覽器輸入 odoo-dev.internal.example.local
,它會解析到本機的 127.0.0.1
,並最終轉發到 odoo-dev
上。
ssl_certificate /etc/nginx/certs/odoo_Certificate.crt;
# 設定 SSL 憑證ssl_certificate_key /etc/nginx/certs/odoo_Certificate.key;
# 設定 SSL 私鑰
這部分是 nginx
用來啟用 HTTPS
的關鍵設定,SSL 憑證和私鑰的路徑需要正確設定,以確保 nginx
能夠處理安全的 HTTPS
連接。下一章我們會介紹這些相關的名詞。