環境:proxmox,vm 跑 ubuntu,對外有固定 IP,自架 DNS Server ,router 是 vm 跑 openwrt
最近因為玩 vllm, 及一堆服務,每個服務的需求環境不同,可以開 vm 解決,但網域的設定,要耗費精神跟 nginx 搏鬥,
原來是 :
a01.com 在 server a01,經由 router-01 對外
a02.com 在 server a02,經由 router-02 對外
a03.com 在 server a03,經由 router-03 對外
都是 80 443 轉 port,很單純。
但現在會是:
b01.com 在 server a01,port 8080,經由 router-01 對外
b02.com 在 server a01,port 3000,經由 router-01 對外
b03.com 在 server a01,port 9001,經由 router-01 對外
我想要 :
已完成生產用的服務,獨立一個 VM:
網域 : b01.com 在 server b01,port 8080,router-01
其他在測試的,就繼續維持。
這一來,網域管理,nginx proxy 就複雜了。
所以,找了 nginx proxy manager 來幫忙。
1.安裝 (Docker Compose)
vm 裝 ubuntu, ip : 192.168.8.203,gateway : 192.168.8.3,router 轉 80,443 port 到 192.168.8.203。
Docker Compose 安裝: (自行 google :docker 安裝)
習慣將服務裝在目錄 /opt 下面,
sudo mkdir /opt/nmp
cd /opt/nmp
sudo nano docker-compose.yml
# 建立一個 docker-compose.yml:
version: ‘3.8’
services:
app:
image: ‘jc21/nginx-proxy-manager:latest’
restart: unless-stopped
ports:
– ’80:80′ # HTTP 流量入口
– ‘443:443’ # HTTPS 流量入口
– ’81:81′ # NPM 管理後台入口
volumes:
– ./data:/data # 設定檔資料庫 (記得備份這個!)
– ./letsencrypt:/etc/letsencrypt # 憑證存放區 (這個也要備份!)
然後啟動:
sudo docker compose up -d
啟動後,瀏覽器打開 http://192.168.8.203:81 就能看到登入畫面。
要註冊帳號,密碼


2.設定
點開 Proxy Hosted 或 選 Hosts/Proxy Hosts


右上,新增 : AddProxy Host

案例: 服務端192.168.8.73是用 docker, 服務 port 在 3000,網域名 : a.com.tw

SSL : 選 Request a New Certificate
Force SSL , HTTP/2 Support 打開,
Save.

會跑一下子,如果沒問題,直接跳到

2. 舊 Apache 系統 (解決 SNI 錯誤)
另一個 oa.candle.com.tw 是跑在舊的 Apache 上,而且 Apache 本身已經設定好 SSL (Port 443)。當我用 NPM 指向它時,瀏覽器報錯:Misdirected Request。
原因:NPM 預設是用「IP」去跟後端握手,但 Apache 上面有多個站點,它看到你沒報上「網域名稱 (SNI)」,就拒絕連線了。
✅ 解法: 在 Advanced 分頁,貼上這些指令來「騙」過 Apache:
# 強制開啟 SNI
proxy_ssl_server_name on;
# 告訴後端 Apache:「我要連的是 oa.candle.com.tw ($host)」
proxy_ssl_name $host;
# 因為是內網傳輸,就不要檢查後端憑證有沒有過期了,省事
proxy_ssl_verify off;

因為原來的系統已經安裝 SSL
所以連線用 https :

但還是要把 SSL 在NPM上裝一次,

搞定。
備註一下:
AI / LLM 服務 (解決卡頓問題)
如果是 vLLM 服務,後端用 Docker 跑。 AI 回答時會「卡住」,然後一次噴出一大段字,沒有「打字機」的流暢感。
原因:Nginx 預設會開啟 Buffering (緩衝),把資料存多一點再一次傳,但這剛好跟 LLM 的串流 (Streaming) 特性衝突。
✅ 解法: 在 NPM 編輯該 Proxy Host,切換到 Advanced 分頁,貼上:
# 關閉緩衝,讓 AI 的字元能即時吐出來
proxy_buffering off;
# 增加 Timeout,避免 AI 思考太久 (超過 60 秒) 被 Nginx 切斷
proxy_read_timeout 600s;
存檔後,串流速度馬上變正常!
、 備份
NPM 資料在掛載的那兩個 Volume 裡。
- ./data (這裡面有 SQLite 資料庫)
- ./letsencrypt (你的 SSL 憑證都在這)
# 簡單暴力的備份指令
tar -czvf npm-backup.tar.gz ./data ./letsencrypt docker-compose.yml
或整個 vm 備份。