
這次的專案目標是在 Windows Server 上執行:
- 使用 Docker 部署 Nginx Proxy Manager
- 讓內網使用者能透過自訂網域存取服務
- 套用自簽或匯入的 SSL 憑證
- 反向代理內部多個服務並統一管理
完整建置流程
Step 1:準備 Docker Compose
建立 docker-compose.yml:
version: "3.9"
services:
nginx-proxy-manager:
image: jc21/nginx-proxy-manager:latest
container_name: nginx-proxy-manager
ports:
- "80:80" # 公共 HTTP 連接埠
- "443:443" # 公共 HTTPS 連接埠
- "81:81" # 管理 Web 後台的連接埠
volumes:
- /docker/nginx-proxy-manager/data:/data
- /docker/nginx-proxy-manager/letsencrypt:/etc/letsencrypt
- /docker/nginx-proxy-manager/html:/data/custom_html
restart: unless-stopped
啟動容器:
docker compose up -d
Step 2:確認容器端口是否啟動成功
執行:
docker exec -it nginx-proxy-manager netstat -tlnp
預期會看到:
0.0.0.0:80 LISTEN
0.0.0.0:81 LISTEN
0.0.0.0:443 LISTEN
Step 3:設定每台內網電腦的 hosts
為了使用自訂域名,需要在每台電腦加入 IP 對應。
範例:
123.45.67.89 mattdataadventures.com.tw
在不同環境下面的呼叫方式
Windows:
C:\\Windows\\System32\\drivers\\etc\\hosts
Linux/macOS:
/etc/hosts
用命令提示字元(CLI)做測試:
ping mattdataadventures.com.tw
Step 4:設定 Proxy Host
開啟管理介面:
http://<你電腦的IP>:81
建立 Proxy Host:
- Domain Names:
mattdataadventures_v2.com.tw(反向代理袋裡到另一個主機) - Scheme:
http - Forward Host:
135.35.57.79(不同的電腦 IP) - Forward Port: 3577(設定一個要對外連線的 port)
SSL 設定(主要在 nginx-proxy-manager 上面設定)
- 套用匯入的憑證(包含主憑證 crt、中繼憑證 crt、鑰匙key等等)
- 勾選 Force SSL
- 勾選 HTTP/2 Support
Step 5:測試代理是否運作
打開瀏覽器輸入網址測試:
https://mattdataadventures_v2.com.tw
如果有正常顯示表示代理功能正常運行。
我實際遇到的問題與解決方法
問題 1:443、8443 被佔用 → HTTPS 無法啟動
用 Windows PowerShell 輸入:
netstat -ano | findstr LISTENING
netstat -ano | findstr 443
發現 port 被占用了
我這邊的解決方式是關閉一開始的服務。
並把佔用的 port 都給移除,再重新搭建 docker 環境,就正常了。
問題 2:內網其他主機無法連線
錯誤:ERR_CONNECTION_TIMED_OUT
常見原因:
- Windows 防火牆未放行
- port 被其他程式占用
- OS 層阻擋,不是 NPM 設定問題
你的排查指令
① Windows 查看 port 是否被占用
netstat -ano | findstr 443
② 查看容器內部 port 是否開啟
docker exec -it nginx-proxy-manager netstat -tlnp
③ 查看 NPM logs
docker logs -f nginx-proxy-manager
④ 進入容器檢查 nginx
docker exec -it nginx-proxy-manager sh
netstat -tlnp
問題 3:Windows 防火牆阻擋連線
你使用的設定方式正確:
netsh advfirewall firewall add rule name="NPM 443" dir=in action=allow protocol=TCP localport=443
其他常用開放:
netsh advfirewall firewall add rule name="NPM 80" dir=in action=allow protocol=TCP localport=80
netsh advfirewall firewall add rule name="NPM 81" dir=in action=allow protocol=TCP localport=81
完整排查清單
若代理不通,依下列順序排查最有效:
- 容器是否正常啟動
docker ps - 容器內部 port 是否真的有開
docker exec -it nginx-proxy-manager netstat -tlnp - Windows 是否有程式占用相同 port
netstat -ano | findstr 443 - Windows 防火牆是否放行
netsh advfirewall firewall add rule ... - hosts/DNS 解析是否正確
ping mattdataadventures.com.tw - 後端服務主機是否正常執行
curl135.35.57.79:3577
結語
在這次專案中,成功解決以下問題:
- Windows Server 埠被占用
- Docker NPM 無法綁定 443/8443
- 內網連線逾時
- SSL 憑證警告
- Proxy Host 無法連線
- 防火牆阻擋流量
透過有系統的診斷流程與明確的工具指令,整個架設過程已能穩定重現。
未來若再次部署相同環境,可以直接依照本文流程操作,大幅節省時間並避免重複踩坑。
