2026 年 Nginx Proxy Manager 教學:輕鬆管理反向代理與 SSL
既然 Nginx 本身就能做反向代理,為什麼還需要 NPM?原因在於「管理成本」。當你只有一兩個服務時,手寫設定檔當然沒問題;但當服務數量來到十個、二十個,問題就會逐一浮現:
server 區塊,還要記得建立對應的 sites-available 與 sites-enabled 連結。設定檔一多,想找出是哪個服務造成 502 錯誤,得一個一個 grep。
團隊成員若不懂 Nginx 語法,完全無法協助維護。
NPM 把上述流程全部圖形化。你只要在介面上填寫「來源網域」、「目標 IP 與埠號」,剩下的設定檔產生、驗證、重載,通通由它幫你處理。對於自架愛好者與小型團隊來說,這個效率提升非常明顯。
2026 年的版本演進與適用族群
NPM 專案從 2017 年發展至今,已經迭代相當多版本。近幾年的更新重點放在資料庫架構調整、更嚴謹的憑證管理流程、更完整的 API 支援,以及對新版本 Nginx 核心的跟進。截至 2026 年,官方 Docker 映像檔依然是最推薦的部署方式,安裝與升級都相當單純。
它特別適合以下幾種人:
在家用 NAS 或迷你主機上架設多個服務的自架玩家。
需要快速為內部系統加上 HTTPS 的中小企業 IT 人員。
想學習反向代理概念,但不想一開始就掉進設定檔地獄的初學者。
需要透過 API 自動化管理代理規則的開發者。
Nginx Proxy Manager 核心功能總覽
在動手安裝之前,先快速瀏覽一下 NPM 提供的主要功能,這樣你在後續設定時會更清楚每個選項的用途。
視覺化網頁介面與多使用者管理
NPM 最大的賣點就是那套直覺的網頁控制台。左側選單把所有功能分類清楚:Proxy Hosts(反向代理主機)、Redirection Hosts(重新導向)、Streams(TCP/UDP 轉發)、Access Lists(存取清單)、SSL Certificates(憑證管理)、Users(使用者)。
它支援多使用者帳號,並且可以針對每個使用者設定權限。管理員能建立完整權限的帳號給自己,同時開設只能檢視或管理特定主機的帳號給同事,這在團隊協作時相當方便。
一鍵申請 Let's Encrypt SSL 憑證
SSL 憑證的申請與續期是 NPM 最受歡迎的功能。你只要在建立 Proxy Host 時勾選「Request a new SSL Certificate」,系統就會自動透過 HTTP-01 或 DNS-01 挑戰向 Let's Encrypt 申請憑證,並且在到期前自動續期。
它也支援匯入自訂憑證,例如你從商業 CA 購買的萬用字元憑證,或是內部自簽憑證。對於使用 Cloudflare、Route53 等 DNS 服務的玩家,NPM 內建 DNS 挑戰支援,可以申請萬用字元憑證(*.example.com),這對於服務數量多、又不想逐一開放驗證路徑的情況非常實用。
存取清單與身分驗證機制
Access Lists 功能讓你可以在反向代理這一層加上額外的保護。你可以設定:
兩者並用:先過濾 IP,再要求密碼,形成多層防護。
這裡要特別提醒:Basic Auth 走的是明文驗證,一定要搭配 HTTPS 使用,否則密碼會在傳輸過程中被攔截。
Stream 流量轉發:支援非 HTTP 協定
除了 HTTP/HTTPS,NPM 也支援 TCP 與 UDP 的流量轉發(Stream)。這代表你可以用它來代理 SSH、MySQL、RDP、遊戲伺服器等非 HTTP 服務。設定方式與 Proxy Host 類似,只要指定來源埠號與目標位址即可。
不過要注意,Stream 模式無法套用 HTTP 層級的 SSL 憑證管理,憑證必須在後端服務自己處理,或是使用 SNI 分流的方式來設定。
安裝環境準備與 Docker 部署實戰
接下來進入實作階段。NPM 官方最推薦的安裝方式是 Docker,以下步驟適用於 Ubuntu、Debian、樹莓派,以及各大 NAS 系統。
系統需求與前置條件
在開始之前,請先確認以下條件都已經滿足:
一個網域:用來指向你的伺服器,並且具備 DNS 管理權限。
另外,請確認 80/443/81 這三個埠目前沒有被其他服務佔用。你可以用以下指令檢查:
sudo ss -tlnp | grep -E ':(80|443|81)\s'
如果發現已經有 Apache 或系統版 Nginx 在跑,建議先停用它們,避免衝突。
使用 Docker Compose 部署 NPM
首先建立一個專屬目錄,並在其中建立 docker-compose.yml:
mkdir -p /opt/npm && cd /opt/npm
nano docker-compose.yml
接著貼入以下內容:
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
environment:
DISABLE_IPV6: 'true'
TZ: 'Asia/Taipei'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
healthcheck:
test: ["CMD", "/usr/bin/check-health"]
interval: 30s
timeout: 10s
retries: 3
這裡有幾個重點說明:
ports 中的 80 與 443 是給外部服務使用的,81 則是 NPM 自己的管理介面。volumes 把資料與憑證掛載到本機,確保容器重建後設定不會消失。這一步非常重要,千萬不要省略。TZ 設定時區,讓 log 時間與你所在位置一致,除錯時會方便很多。
若你使用 SELinux 的系統(如部分 RHEL 系),可能需要調整掛載選項。
存檔後啟動容器:
docker compose up -d
docker compose logs -f
看到類似「Backend PID 1 listening on port 3000」的訊息,就代表啟動成功了。若你使用防火牆,記得開放對應埠號:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 81/tcp
首次登入與初始化設定
打開瀏覽器,輸入 http://你的伺服器IP:81,就會看到 NPM 的登入畫面。預設帳號密碼是:
Email:[email protected]
Password:changeme
首次登入後,系統會強制要求你修改成自己的 Email 與密碼。請務必使用高強度密碼,因為這個介面一旦被取得,等於整個反向代理的設定都門戶洞開。
登入後建議先做幾件事:
到 Users 頁面確認管理員帳號資訊正確。
考慮把管理介面的 81 埠改成其他埠號,或限制只允許內網存取,降低被暴力破解的風險。
實戰:建立你的第一個反向代理主機
環境準備完成後,我們來實際建立一個反向代理。假設你想把 blog.example.com 指向內網一台跑在 192.168.1.100:8080 的部落格服務。
先設定好 DNS 記錄
在新增 Proxy Host 之前,請先到你的網域註冊商或 DNS 服務商(Cloudflare、Route53、Google Domains 等)新增一筆 A 記錄:
名稱:blog
類型:A
值:你伺服器的公開 IP
TTL:預設即可
設定完成後,可以用以下指令確認解析是否生效:
dig blog.example.com +short
nslookup blog.example.com
如果你使用 Cloudflare,記得先把該筆記錄的代理狀態(橘色雲朵)關掉,改用 DNS only(灰色雲朵),直到憑證申請完成為止。這是因為 Let's Encrypt 的 HTTP-01 驗證需要直接連到你的伺服器,中間隔一層 CDN 有時會造成驗證失敗。憑證搞定後再開回去即可。
新增 Proxy Host 的完整步驟
回到 NPM 介面,點選左側的 Hosts → Proxy Hosts,然後點右上角的 Add Proxy Host。你會看到一個包含三個分頁的視窗:Details、Custom Locations、Advanced。
在 Details 分頁中填入以下資訊:
blog.example.com。這裡可以一次填入多個網域,例如同時支援有無 www 的版本。http(因為後端服務沒有憑證)。若後端本身有 HTTPS,則選 https。192.168.1.100。若服務與 NPM 在同一台 Docker 主機上,也可以用容器名稱。Forward Port:填 8080。
填完後先不要急著按 Save,我們接著處理 SSL。
申請 SSL 憑證並強制 HTTPS
切換到 SSL 分頁,這裡是 NPM 最方便的地方:
Request a new SSL Certificate。HTTP/2 Support:勾選,提升傳輸效率。
max-age 為 31536000。這會告訴瀏覽器在未來一年內都必須使用 HTTPS 連線。按下 Save 之後,NPM 會開始向 Let's Encrypt 申請憑證。整個過程通常在數十秒內完成。如果成功,你會看到該筆記錄的 SSL 欄位變成一把綠色鎖頭。
此時打開瀏覽器連到 https://blog.example.com,應該就能看到你的服務,而且網址列顯示安全連線。憑證會在到期前 30 天內自動續期,完全不需要手動介入。
進階設定技巧:讓 NPM 發揮完整實力
基本的反向代理設定完成後,接下來介紹幾個實用進階技巧,這些能解決你未來八成以上的需求。
自訂 Nginx 設定檔片段
雖然 NPM 圖形介面涵蓋多數情境,但總有些特殊需求需要直接寫 Nginx 指令。在 Proxy Host 編輯頁的 Advanced 分頁中,有一個「Custom Nginx Configuration」欄位,你可以在此插入自訂設定。
例如,要調高上傳檔案大小限制:
client_max_body_size 0;
要設定特定的回應標頭:
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
或是針對長連線的應用調整逾時時間:
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
proxy_connect_timeout 60s;
這些設定會直接插入該 Proxy Host 對應的 server 區塊中。修改完畢後按下 Save,NPM 會自動驗證語法並重載 Nginx,如果語法有錯會直接跳出錯誤訊息,不會讓整個服務掛掉,這點設計相當貼心。
多個服務共用同一個網域
有時候你希望一個網域底下掛多個服務,例如 example.com/app1 和 example.com/app2 分別指向不同的後端。這時可以使用 Custom Locations 分頁。
操作步驟如下:
先在 Details 分頁設定一個主要的 Forward Host,作為根路徑 / 的目標。
切到 Custom Locations,點 Add Location。
在 Location 欄位填入 /app1。
設定該路徑對應的 Forward Hostname 與 Port。
視需要加入自訂設定,例如重寫路徑的 rewrite 指令。
要注意的是,並非所有應用都能順利在子路徑下運作。許多現代前端框架會使用絕對路徑載入資源,導致子路徑代理時出現 404。遇到這種情況,比較穩妥的做法還是替每個服務分配獨立的子網域。
使用 Access List 保護內部服務
假設你有一個管理介面,只想讓公司 IP 或自家固定 IP 存取。做法是:
先到 Access Lists 頁面,點 Add Access List。
命名為「內部限定」之類的名稱。
在 Authorization 區塊設定一組帳號密碼(可選)。
在 Access 區塊設定規則,例如 Allow 203.0.113.0/24,然後在最後加一條 Deny all。
規則的順序很重要,NPM 會由上往下比對。設定完成後,回到 Proxy Host 編輯頁,在 Details 分頁的 Access List 下拉選單中選擇剛建立的清單即可。
這樣一來,非白名單的 IP 連線會直接被拒絕,連服務的登入頁面都看不到,安全層級提升不少。
WebSocket 與大檔案上傳調校
如果你代理的是 Nextcloud、Jellyfin、Home Assistant 這類應用,通常會遇到兩個問題:一是 WebSocket 連線中斷,二是大檔案上傳失敗。
前者只要在建立 Proxy Host 時勾選 Websockets Support 即可解決。後者則需要調整 Nginx 的 body size 限制,方法是在 Advanced 分頁加入:
client_max_body_size 0;
proxy_request_buffering off;
client_max_body_size 0 代表不限制上傳大小,而 proxy_request_buffering off 則讓請求直接串流到後端,避免大檔案先被寫入暫存磁碟造成延遲。
常見問題排解與疑難雜症
再順利的設定也難免遇到狀況。以下整理幾個最常見的問題與解法。
502 Bad Gateway 的排查順序
502 是反向代理最常見的錯誤,代表 NPM 無法連到後端服務。排查順序建議如下:
確認後端服務有在跑:在 NPM 主機上執行 curl -I http://192.168.1.100:8080,看看是否有回應。
確認網路可達:用 ping 或 nc -zv 192.168.1.100 8080 測試連線。
檢查 Docker 網路:如果後端也在 Docker 中,確認兩者是否在同一個 network,或是改用主機 IP 而非容器名稱。
檢查防火牆:後端主機的防火牆可能擋掉了來自 NPM 的連線。
查看 NPM log:執行 docker compose logs --tail=100,通常會看到具體的錯誤原因。
SSL 憑證申請失敗的常見原因
Let's Encrypt 驗證失敗時,NPM 會顯示錯誤訊息。最常見的原因包括:
DNS 尚未生效:剛設定的 A 記錄可能還在傳播,建議等 10 到 30 分鐘再試。
80 埠被佔用或未開放:HTTP-01 驗證需要透過 80 埠,確認防火牆與 ISP 都沒有阻擋。
Cloudflare 代理干擾:如前所述,申請期間先關閉橘色雲朵。
網域申請次數超限:Let's Encrypt 對同一網域有每週 5 次的失敗上限,短時間內反覆嘗試會導致暫時被鎖。這時可以改用 DNS 挑戰繞過。
多個 Proxy Host 搶同一個網域:確認沒有重複設定。
憑證自動續期失敗怎麼辦
NPM 會定期檢查憑證狀態並自動續期。如果發現續期一直失敗,可以先確認以下幾點:
檢查 SSL Certificates 頁面,看該憑證的狀態與到期日。
點進憑證詳情,查看最近一次的續期記錄與錯誤訊息。
確認 letsencrypt 目錄的檔案權限正確,容器有寫入權限。
若是 DNS 挑戰,確認 API Token 沒有過期或被撤銷。
真的搞不定時,最乾脆的做法是把該筆憑證刪除,然後回到 Proxy Host 重新申請一次。NPM 的設計讓這個流程只需要幾分鐘。
安全性強化與最佳實踐
把服務暴露到網際網路上,安全永遠是第一優先。以下是幾項建議:
變更管理介面埠號:81 埠是眾所皆知的位置,建議改成其他埠號,或透過防火牆限制只允許內網存取。
啟用 HSTS:避免降級攻擊,但啟用前請確保所有子網域都已支援 HTTPS。
定期更新映像檔:執行 docker compose pull && docker compose up -d,取得最新的安全性修補。
最小權限原則:只開放必要的埠號,後端服務盡量不要直接暴露在外網。
啟用 Fail2ban:可以搭配 NPM 的 log 設定規則,自動封鎖反覆嘗試登入的 IP。
備份設定:定期備份整個 /opt/npm 目錄,包含資料庫與憑證。
另外,NPM 本身提供的 Block Common Exploits 選項一定要開,它會阻擋許多自動化掃描工具試圖存取 /.env、/wp-config.php 之類的敏感檔案,成本極低但效果明顯。
備份、還原與遷移
NPM 的所有設定與資料都存放在掛載出來的 data 與 letsencrypt 目錄中,因此備份相當單純。只要把整個安裝目錄打包即可:
tar -czvf npm-backup-$(date +%F).tar.gz /opt/npm
要還原或遷移到新主機時,步驟如下:
在新主機安裝 Docker 與 Docker Compose。
把備份檔解壓到相同路徑。
執行 docker compose up -d。
確認所有 Proxy Host 與憑證都正常運作。
由於憑證也一併備份,遷移後不需要重新申請,服務可以無縫接軌。建議把備份排程進 cron,例如每天凌晨自動打包並保留最近 30 份,避免手動忘記。
2026 年的觀察與未來展望
走過這幾年,NPM 在自架社群的定位越來越明確:它不是要取代專業的負載平衡器或 API Gateway,而是要成為「個人與小型團隊最容易上手的中介層」。2026 年的版本在幾個方向上有明顯進展:
API 完整性提升:更多操作可以透過 REST API 完成,方便與自動化流程整合,例如用 Terraform 或 Ansible 管理代理規則。
憑證管理更智慧:對於多網域、萬用字元憑證的處理更加穩定,減少了過去常見的續期失敗案例。
可觀測性改善:內建的健康檢查與更清楚的 log 格式,讓除錯效率提升。
社群外掛生態:越來越多第三方工具支援 NPM,例如自動同步 Cloudflare DNS、整合監控系統等。
當然,它也有其限制。如果你需要複雜的流量分流策略、A/B 測試、細緻的速率限制,或是需要服務網格等級的功能,那麼直接使用 Nginx 設定檔、Traefik 或 Caddy 可能會更適合。但對於「我只想讓十幾個服務好好掛上 HTTPS」這個需求來說,NPM 依然是性價比最高的選擇。
結語:把時間留給真正重要的事
自架服務的樂趣在於掌控與學習,但繁瑣的維運工作常常消磨掉這份熱情。Nginx Proxy Manager 的價值,就在於它把重複性高、容易出錯的設定工作自動化,讓你能把時間花在開發應用、研究新技術,而不是反覆編輯設定檔與搶救憑證。
這篇文章從反向代理的概念談起,帶你完成 Docker 部署、初始化設定、建立第一個 Proxy Host、申請 SSL 憑證,一路講到進階調校與疑難排解。如果你跟著做了一遍,相信你現在已經有一套穩定運作的反向代理環境。
接下來,不妨試著把手邊其他服務一個一個搬進來,體驗一下所有服務都有漂亮網域與綠色鎖頭鎖頭的成就感。記得定期更新映像檔、備份設定,並且隨時關注官方專案的更新公告。祝你自架順利,我們下次見。