Docker Nginx Proxy Manager內網反向代理架設完整流程(含問題排查與防火牆設定)【Docker超理解|進階篇】

在 Windows Server 環境上使用 Docker 建置 Nginx Proxy Manager(NPM),是一個能快速建立反向代理、管理多個服務、套用 SSL 憑證的做法。 本文依照實際專案經驗,將整個流程重新整理成有邏輯、可複製的紀錄,並完整收錄過程中遇到的錯誤、診斷方式與解決方法。

這次的專案目標是在 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

完整排查清單

若代理不通,依下列順序排查最有效:

  1. 容器是否正常啟動 docker ps
  2. 容器內部 port 是否真的有開 docker exec -it nginx-proxy-manager netstat -tlnp
  3. Windows 是否有程式占用相同 port netstat -ano | findstr 443
  4. Windows 防火牆是否放行 netsh advfirewall firewall add rule ...
  5. hosts/DNS 解析是否正確 ping mattdataadventures.com.tw
  6. 後端服務主機是否正常執行 curl 135.35.57.79:3577

結語

在這次專案中,成功解決以下問題:

  • Windows Server 埠被占用
  • Docker NPM 無法綁定 443/8443
  • 內網連線逾時
  • SSL 憑證警告
  • Proxy Host 無法連線
  • 防火牆阻擋流量

透過有系統的診斷流程與明確的工具指令,整個架設過程已能穩定重現。

未來若再次部署相同環境,可以直接依照本文流程操作,大幅節省時間並避免重複踩坑。

參考資源

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *