WebHostPro:在您的 QNAP NAS 上代管網站
WebHostPro 在 QNAP NAS 上執行網站:靜態網站、擁有自己資料庫的 PHP 網站,以及連到 NAS 上應用程式的代理,每個都有自己的網域與憑證,全部在一個面板中管理。它是免費的,可從本站的 App Center 儲存庫安裝。
- 可在採用 Intel 或 AMD 處理器(x86_64)的 QNAP NAS 上執行,需 QTS 6.0 或 QuTS hero 6.0 或更新版本。
- 從 App Center 的 QNAP Utilities 儲存庫安裝,名稱為 (example) WebHostPro。
- 面板:
https://<NAS>:9541/;網站會在連接埠 9542 與 9543 回應,直到您將它們改為 80 與 443。 - 以 Bucket & Code Server IDE 的 App Builder 從原始碼建置。
01簡介
WebHostPro 在 QNAP NAS 上運行網站。它是一組網頁伺服器:每個網站前面是 nginx,使用它的網站後面是 Apache httpd,還有 PHP 8.1 到 8.5、MariaDB、Percona Server、PostgreSQL、memcached 與 Valkey,並附有九種語言的面板,用來新增、修改與移除網站。
02畫面
03第一次啟動
App Center 的 開啟 按鈕會連到面板 https://<NAS>:9541/;未加密的 9540 連接埠會轉到那裡。全新安裝時,面板會顯示首次登入:至少 10 個字元的密碼,輸入兩次。套件不會設定密碼,也不會產生密碼,面板只保存您所設密碼的雜湊值。
這個頁面只接受來自 NAS 所在網路內(私人、迴路或連結本地位址)電腦的密碼,而且只在面板啟動後的 60 分鐘內有效;在有人設定之前,這一小時內第一個開啟面板的網路使用者就能決定密碼。要再次開啟,請在 App Center 重新啟動 WebHostPro。登入階段持續 8 小時,同一位址連續 10 次登入失敗,該位址會被鎖定 15 分鐘。
04網站
網站是一個網域加上它的別名、一種類型(靜態檔案、PHP,或指向 NAS 或區域網路上服務的代理,包含容器,並支援 websocket)、一個網頁伺服器(nginx 或 Apache httpd),以及需要時的資料庫。代理的目標是私有範圍內的位址,而不是主機名稱。每個網站都有自己的帳號 ws-<ID>,它擁有該網站的資料夾並執行它的 PHP,因此一個網站的 PHP 讀不到另一個網站的檔案。資料夾位於 QTS 的共用資料夾或 WebHostPro 的資料夾中,其 public/ 是文件根目錄。
PHP 網站會執行自己的 PHP-FPM 主程序,它的 PHP 分頁包含版本(8.1 到 8.5)、時區、限制、錯誤、工作階段與安全性、OPcache 與 JIT、APCu、擴充套件、額外的 php.ini 行,以及 PHP 工作程序(集區)。php.ini 行會對照該版本 PHP 自己列出的指令檢查;會載入程式碼、執行命令、指定檔案或含有密碼的名稱會被拒絕。集區有程序管理器(依需求、動態或靜態)、程序數量(預設為依需求、5 個)、閒置時間、每個程序的請求數、請求時間限制,以及慢請求記錄,記錄分頁會顯示它。一個網站當機或 PHP 負載過高,不會影響其他網站,修改一個網站的 PHP 設定也只會重新啟動該網站的 PHP。結束的主程序會被重新啟動,一分鐘內結束五次後就保持停止;logs/php8.N-ID.log 會記錄這件事。
每個網站都能以自己的帳號、用自己的 PHP 執行排程工作:網站的 PHP 檔案、一個命令或網站自己的網址,每分鐘或依任何 cron 排程執行。網站頁面會顯示每次執行的結果與輸出,工作開始失敗時,MailServerPro 會寄出報告。
每個 PHP 網站都有自己的 Valkey(使用 Redis 的協定)和自己的 memcached,各自在只有該網站能開啟的資料夾裡的通訊端上,所以都不需要密碼,也不佔網路連接埠;網站的快取分頁會顯示這兩個通訊端。每個最多保存 64 MB,重新啟動會清空兩者。每個 PHP 版本都有 imagick,搭配可讀寫 JPEG、PNG、WebP、GIF、AVIF 並可讀取 HEIC 的 ImageMagick。它的政策會拒絕 SVG、MSL 這類會讀取其他檔案或執行程式的格式。
Apache 網站的 .htaccess 也能使用 Digest 驗證、群組檔案中的群組、替換頁面文字的 Substitute,以及限制下載速度的 RATE_LIMIT 篩選器。
PHP 網站也能擁有自己的 PECL 擴充功能:網站的 PHP 分頁會以網站自己的帳號、在沒有網路的情況下,於 Bucket & Code Server IDE 的建置環境中建置,且只有該網站的 PHP 會載入它。
WebHostPro 按一下即可接管這台 NAS 的網頁伺服器角色,全新安裝時會詢問一次:QTS 管理介面從連接埠 443 移到 44443,QTS 網頁伺服器從 80 移到 8880,每一步都先確認再進行下一步,QTS 的網站移到 WebHostPro 後面;在「前端與連接埠」頁面按一下即可歸還 80 與 443。
導覽會從標準連接埠與 TurboDNS 帶到您的第一個網站,並在檢查 DNS 設定後,建議透過路由器的 DHCP 發送 DNS 伺服器位址。
由 nginx 提供的 PHP 網站與靜態網站有快取分頁。nginx 除了 gzip,也用 Brotli 與 zstd 壓縮文字回應。PHP 網站可以開啟頁面快取(預設關閉):帶有登入 cookie 的訪客一律取得新頁面,X-Cache 標頭顯示 HIT、MISS、STALE、UPDATING 或 BYPASS,清除快取會清空它。靜態檔案可讓瀏覽器保留 1、7、30 或 365 天。nginx 接受的請求主體上限是網站的最大請求(PHP 分頁的 post_max_size),超過時回應 413;代理網站在前端沒有主體限制。
新增網站是一個網域精靈:網域、DNS、網域註冊商、網站、資料庫(PHP 網站才有)、憑證與確認。DNS 步驟詢問由誰回應這個區域(這台 NAS 上的 TurboDNS;網域註冊商或 DNS 服務商的伺服器;或是 Cloudflare 或 OVHcloud,區域由這台 NAS 上的 TurboDNS 保存),以及這台 NAS 有哪些公用位址。網域註冊商步驟列出要在購買網域的地方填入的內容,每個值都有複製按鈕,下方是路由器的轉送與前端的狀態。確認步驟的試跑會同時顯示網站的計畫與 TurboDNS 的計畫,一次套用就送出兩者。憑證來自 Let’s Encrypt(HTTP-01 由前端在 80 連接埠提供檔案;DNS-01 則透過 TurboDNS 或 Cloudflare;剩下 30 天或更短時由 WebHostPro 更新),或是上傳的憑證、NAS 本身的憑證或自簽憑證。
套用之後,網站的概覽會有卡片完成 <名稱> 的設定:網站已套用、TurboDNS 中的記錄、在網域註冊商處、即時檢查、憑證與收尾。立即檢查會讀取上層區域的名稱伺服器、這台 NAS 的 TurboDNS、三個公用解析器與前端,並說明它無法得知 53、80 與 443 連接埠能否從網際網路連到 NAS;憑證那一列會向 Let’s Encrypt 申請憑證。TurboDNS 中的記錄那一列,在 TurboDNS 對這個網域的計畫找不到要改的東西時就算完成,不論是精靈的試跑、該列的「傳送記錄」還是再次傳送都一樣,完成後顯示自 <時間> 起已在 TurboDNS 中。;記錄已在區域中的網站,光靠試跑就會完成。
每一項變更都先是草稿。試跑會把整個網頁層寫入一個暫存資料夾,在其中執行 nginx -t、httpd -t 與 php-fpm -t,並列出新增、修改與移除的檔案及其差異。套用會照該計畫執行,先保留運行中檔案的快照,平順地重新載入,若有步驟失敗就還原快照。刪除網站必須輸入其名稱;它的資料夾與資料庫會保留。
對於代理網站,此 NAS 上的應用程式會列出 WebHostPro 有範本的已安裝應用程式:Rtorrent 16
及其附加元件、Radarr、Sonarr、Prowlarr、Lidarr、Bazarr、Seerr、Tautulli、qBittorrent、Transmission、TunerHub、Weblate、Tolgee、Bucket
& Code Server IDE、Plex Media Server 與 Jellyfin。選擇應用程式後,會以其套件使用的連接埠填入目標,並在應用程式需要時開啟 WebSocket;前端隨後會把
X-Forwarded-Host 與 X-Real-IP
送給應用程式,給有長時間請求的應用程式最多一小時的回應時間,並對會傳送媒體與事件的應用程式不經緩衝直接串流這些內容。只有應用程式本身能變更的設定(例如 *arr 應用程式的 URL Base)會在選單下方以一行說明。
05預設網站
針對沒有任何網站使用的名稱(例如 NAS 的位址或名稱)的請求,會由預設網站回應:NAS 有 WebHostPro 可用的 QTS 共用資料夾 Web 時就是該資料夾,否則是 WebHostPro
資料存放資料夾中的起始頁面。它由 Apache httpd 提供,因此資料夾中的 .htaccess 檔案可以運作(Options 行會被忽略)。它的 PHP
以專用帳號執行。安裝或更新後,它以草稿形式開啟:下一次試跑並套用後即上線。它在前端的連接埠上回應:在前端與連接埠頁面把前端移到 80 之後是 80,在此之前是 9542。QTS 的網頁伺服器占用連接埠 80
時,WebHostPro 中此網站的頁面會說明要在 QTS 中關閉哪個設定。它絕不提供位於 Web 資料夾內的其他網站資料夾、名稱以點開頭的檔案與資料夾(.well-known 除外),以及以
@ 開頭的 QTS 資料夾,也不顯示資料夾清單。WebHostPro 不會變更該資料夾的權限。
共用資料夾 Web 中連結到其他共用資料夾或磁碟區的資料夾,會像在 QTS 的網頁伺服器上一樣運作,PHP 也一樣。
透過 HTTPS 時,它使用 NAS 自己的憑證,也就是 QTS 用於自身頁面的那一份;只要那仍是 QNAP 的自簽憑證,瀏覽器就會顯示警告。對沒有 TLS 的網站發出的 TLS 請求會被拒絕。
WebHostPro 會自行輪替日誌:達到 10 MiB 或滿一週時輪替,保留五份以 gzip 壓縮的副本,nginx 與 httpd 重新開啟日誌時不會遺失任何請求。
06資料庫
網站在資料庫頁面或自己的資料庫分頁取得 MariaDB、Percona Server 或 PostgreSQL 的資料庫與使用者。Percona Server 8.4 在建立第一個 Percona 資料庫時完成設定,監聽 127.0.0.1:9555 與一個 socket;從不使用它的 NAS 永遠不會啟動它。資料庫頁面有 MariaDB 與 Percona Server 各一張卡片,含八項設定(緩衝池、連線數、最大封包、redo 記錄、暫存資料表、資料表快取、閒置時間、慢查詢時間)與額外的 my.cnf 行,這些行會對照伺服器自己的選項清單檢查。變更先是草稿;套用會重新啟動伺服器,因此它的資料庫會有幾秒鐘沒有回應。
07與 NAS 上其他應用程式的搭配
當 TurboDNS 在 NAS 上執行時,精靈的 DNS 步驟會把區域交給它,套用時就送出記錄。沒有 MailServerPro 時,記錄中不含郵件記錄:新的區域會取得名稱伺服器 ns 與 ns1(除非您指定第二台名稱伺服器,否則兩者都是這台 NAS),以及網站名稱、ns 與 ns1 的 A 與 AAAA 記錄;TurboDNS 已在提供的區域保留自己的名稱伺服器。若已安裝 MailServerPro,區域會取得 TurboDNS 的主機代管範本與您確認過的 NAS 公用位址、網站本身名稱的 A 與 AAAA 記錄(範本只涵蓋網域、www、ns、ns1 與郵件名稱,所以像 shop.example.com 這樣的第二個網站會取得自己的記錄),以及 MailServerPro 的 DKIM、MTA-STS、TLS-RPT 與 TLSA 記錄。套用之前不會有任何東西寫入 TurboDNS,確認步驟會先顯示每一筆記錄。
DNS 步驟的第三個答案「Cloudflare 或 OVHcloud,區域由此 NAS 上的 TurboDNS 保存」會把和第一個答案相同的記錄送到 TurboDNS,而由 DNS 服務商回應這個網域。TurboDNS 透過服務商的 API 推送區域,而且只在您操作時才推送:在 TurboDNS 開啟該區域,到「Cloudflare 與 OVH」分頁,按「檢視變更」,再按「推送變更」。網域註冊商步驟這時不會列出名稱伺服器、glue 記錄或 53 連接埠:網域註冊商保留服務商的名稱伺服器,區域也不需要在路由器上轉送 53 連接埠。即時檢查接著在公用解析器與前端通過,網域註冊商的名稱伺服器與 Glue 記錄兩列則略過。
若已安裝 Bucket & Code Server IDE,網站的檔案分頁可在編輯器中開啟它的資料夾。
08沒有公用位址時
位於 CGNAT 之後、或位於不轉送任何連接埠的路由器之後的 NAS,也能透過 Cloudflare Tunnel 把選定的網站發布到網際網路。前端與連接埠頁面上的卡片透過 Cloudflare 讓網站可從網際網路存取需要您的 Cloudflare 帳戶 API 權杖,以及名稱伺服器屬於 Cloudflare 的區域。WebHostPro 接著建立自己的通道並啟動 cloudflared,由它主動連線到 Cloudflare。每個已套用的網站都有一個開關,開啟後會在區域中為網站的名稱建立指向通道、經 Cloudflare 代理的 CNAME 記錄;若某個名稱已有不是 WebHostPro 建立的 A、AAAA 或 CNAME 記錄,WebHostPro 會拒絕它。關閉通道會刪除 WebHostPro 建立的記錄與通道。Cloudflare 會終結 TLS,也看得到流量;免費方案中,每個請求最多上傳 100 MB。
09安裝
建議方式:從 App Center 安裝。只要加入本站的儲存庫一次,之後這個套件就能像其他應用程式一樣從 App Center 安裝與更新。
- App Center → ⚙ 設定 → 應用程式儲存庫 → 新增。
- 名稱填
QNAP Utilities,貼上https://www.qnaputilities.com/repo.xml,按 新增。 - 在左側欄開啟 QNAP Utilities,安裝 (example) WebHostPro。
10需求
一台搭載 x86_64 處理器(Intel 或 AMD)、執行 QTS 6.0 或 QuTS hero 6.0 以上版本的 QNAP NAS。
面板使用 9541 連接埠(HTTPS;9540 會轉到那裡),前端(nginx)使用 9542(HTTP)與 9543(HTTPS,nginx 支援時還有供 HTTP/3 使用的 UDP),其後的 httpd 使用 127.0.0.1:9544。資料庫、快取與選用服務只監聽 127.0.0.1。只有當您在前端與連接埠頁面點選時,前端才會移到 80 與 443 連接埠;該頁面列出在 QTS 中釋放這些連接埠的步驟,以及每個步驟會破壞什麼;WebHostPro 絕不會自行更改 QTS 的設定。
在 QuTS hero 上,啟用進階資料夾權限的共用資料夾無法存放網站:套用會停止,指出該資料夾並再次詢問。WebHostPro 0.14.4 已在 QTS 6.1.0 與 QuTS hero 6.1.0 上試過。



