內容目錄
Synology NAS 架設 WordPress 系列文章節
- 00 篇為導讀:
- 01~05 篇為前置準備:
- 01. 固定IP、網域、DNS設定 (使用 中華電信、GoDaddy、Cloudflare)
- 02. Synology Webstation 套件設定與上傳Wordpress安裝包
- 03. 路由器通訊埠轉發設定 (以 Asus、TP-Link 兩大品牌做教學)
- 04. 安全性憑證設定 (Let’s Encrypt 與 Cloudflare origin CA 兩種方案教學)
- 05. 安裝與設定 MariaDB 資料庫 (使用 PhpMyAdmin進行管理)
- 06~10 篇為 WordPress 初期設定:
- 06. 安裝 WordPress
- 07. 修正 Synology Nginx 無法使用永久連結問題
- 08. 設定文章永久連結
- 09. 透過網站狀態,檢查網站問題
- 10. 跳過 FTP ,讓安裝與更新更方便
- 11 篇後為 WordPress 插件介紹、各種選配項目:
- 11. 必裝 WordPress 外掛推薦 :JetPack、SiteKit、CodeSnippets 等
- 12. 有 JetPack 了?關閉本地登入選項,避免網站遭暴力破解
- 13. SEO搜尋引擎優化插件 Rank Math
- 14. 自動產生文章目錄的插件 Easy Table of Contents
- 15. 避免產生不必要的縮圖 ThumbPress
- 16. 佈景主題設定教學
- 17. 透過 Synology Hyper Backup,備份網站資料與設定
- (日後不定時更新)
Synology 套件安裝

套件安裝的部分沒什麼難度,進入 NAS 上的套件中心安裝 Web Station、MariaDB 10、PHP 這三個套件即可。比較特別的是 PHP 在 Synology 的套件中心裡有分好幾個版本,安裝 phpMyAdmin 時會一併安裝 PHP 8.0,要不要多安裝其他 PHP 版本建議參考 WordPress 提供的 PHP 版本的表格。
以本篇寫稿時會比較建議使用 PHP 7.4 (最新的穩定相容版本),部分 WordPress 外掛最低也要求 7.4 以上,所以 7.3 以下的版本就不建議再安裝了。我自己則是希望運作效能好一點選擇安裝 PHP 8.2 版,雖然說相容性還在測試中,不過至今沒遇到什麼問題。
PHP 版本的部分不需要太糾結,WordPress 安裝後要換還是可以換,換起來還非常方便。
上傳 WordPress 安裝包
WordPress 的安裝包可以至官網下載,網頁往下滾動可以看到下載的連結。點擊下載後的壓縮檔可以直接上傳至 NAS 的 web 共用資料夾中再解壓縮。解壓縮後最外層的資料夾名稱可依個人需求重新命名 (例如 wordpress_blog、wordpress_shop等,方便識別不同專案),更改名稱不會影響到 WordPress 的運作。
Web Station 功能說明與設定
Web Station 以功能上來說算是一種虛擬主機服務,可以讓你在 NAS 上同時運作多個網站,並且依照用戶連線方式的不同提供的相對應的網站 (名稱對應、連接埠對應、別名對應)。若您有打算在同一台上架設多個網站,那麼以下的步驟重複執行即可。
指令碼語言設定
指令碼語言設定主要用途是去定義 Web Station 在運作網頁服務時可以調用多少硬體資源、可執行哪些擴充模組、可上傳多大檔案等參數。當 PHP 安裝好後會自動幫你建立一個預設設定檔 (Default Profile),個人是建議每當要架設新的網頁服務時都獨立新建一個新設定檔,避免不同的網頁服務互相共用設定導致怪問題發生。
- 打開 WebStation 後點選側邊欄的
指令碼語言設定
,再點選上方工具列的新增
會跳出編輯設定的彈窗,名稱
與描述
皆可自行命名 (方便自己識別就好),PHP 版本
上個段落有提過了看個人偏好穩定還是效能選擇即可,最後將啟用 PHP 快取
打勾後點選下一步

- 擴充模組的部分 WordPress 官方有列出所有必要、建議、備用方案的模組清單,以下是 WordPress 有提及且 Synology 也有提供勾選的模組,把
必要模組
、建議開啟
、備用模組
這三類勾選後點擊下一步。- 必要模組:
curl、exif、imagick、intl、mysqli、openssl、zip - 建議開啟:
memcached (快取)、zlib (Gzip 壓縮 / 解壓縮) - 備用模組 (當必要模組不可用時的替代方案,部分外掛可能也會用到),非必要但多安裝沒有壞處:
gd、iconv、shmop、sodium - 非必要也不建議開啟:
ssh2、ftp、sockets (這些連線方式如果用不到一律建議關閉,以防哪天變成資安漏洞)
- 必要模組:

- FPM (FastCGI Process Manager) 設定的部分會依照 NAS 規格不同有所差異,這邊附上我自己建議的參數
需要注意的是最大程序數
的數量會跟下一步核心設定中memory_limit
有所關聯,當網站高負載時最高有可能消耗掉memory_limit * 最大程序數
。Wordpress 基本功能約莫 128M 的記憶體就很夠了,假如memory_limit
設定 128M、最大程序數
設定 16 的話最多就會吃掉 2G 的記憶體,若 NAS 的記憶體不足的話就可能遇到問題。
項目 | 建議設定 | 以 DS923+ 為例 (CPU 2核心 4 執行緒) |
FPM 模式 pm | 動態 | |
最大程序數 pm.max_children | CPU 執行緒數量 * 2 ~ 4 且 數量 * memory_limit 不得超過 NAS 的可用記憶體大小 | 16 |
初始伺服器數 pm.start_servers | CPU 核心數的 * 0.5 ~ 1 | 4 |
最小備用伺服器數 pm.min_spare_servers | 初始伺服器數 * 0.5 ~ 1 | 4 |
最大備用伺服器數 pm.max_spare_servers | 初始伺服器數 * 0.5 ~ 1.5 | 6 |
PHP工作流程
PHP-fpm 與伺服器程序 (php-cgi process,後續簡稱 process) 之間的關係,可以把伺服器程序想像成餐廳內場的廚師、fpm 想像成餐廳外場的經理,在 PHP 5.3 以前沒有外場人員,當客人來店裡時廚師都需要開火、炒菜、關火、走出去上菜,由於一直往返內餐廳外場需要不斷開火、關火導致出餐效率拉不上來。
有了 fpm 後,process 只須專心負責在內場炒菜,不需要一直開火、關火,上菜等餐廳外場的事就交給 fpm,當客人爆滿時 fpm 還能呼叫排休的廚師回來加班支援;當客人減少時 fpm 也會請閒置的廚師先去休息。
所以上面提到的 最大程序數
、伺服器數
其實就是在設定這間餐廳剛開店、尖峰時段、離峰時段要安排多少廚師。而每個找來的廚師在下廚時都需要一定的活動空間 memory_limit
,如果找來的廚師太多但餐廳後場可容納的空間 (可用的記憶體) 太少就會發生問題。

PHP-fpm 運作模式差異
fpm 模式有分成靜態(static)、動態(dynamic)、因應需求(ondemand) 這三種模式,三個模式在新建、關閉伺服器程序 (process) 的模式如下表所示

因應需求與動態模式最大的差別在經歷過較高的負載後,動態
只會把主動把閒置 process 主動關閉到剩下 最大備用伺服器數
,後續需要等每個 process 執行超過 max_requests
的請求數才會關閉;而 因應需求
則會更加激進,只要當閒置超過 process_idle_timeout
的時間就會主動關閉,直到剩下 最小備用伺服器數
為止。
什麼?你說怎麼好像哪裡冒出兩個沒見過的名詞?沒錯!這兩個頗重要的參數 Synology 並沒有開放讓使用者自行設定,透過 ssh 查看後發現這兩個參數 Synology 沒有去定義,就給他維持預設…
- max_requests:伺服器程序應於完成多少次請求後關閉,預設值為 0 (即永不關閉)
- process_idle_timeout:當伺服器程序閒置多少時間後關閉,預設值為 10秒 (僅 因應需求 模式生效)
max_requests
最主要的目的是要避免記憶體洩漏 (memory leak) 的問題,以防有設計不良的程式在需要時拿了記憶體用但完了不釋放出來的問題。一般 max_requests
都會建議設定個 500~1000 左右,後續再依記憶體用量趨勢做微調。
max_requests
另一功能就是當流量進入離峰時段時,可以慢慢的將多出來的閒置 process 湊滿足夠的請求次數使其關閉。但 Synology 預設為 0 的情況下,多出來的閒置 process 只有在遇到問題 (例:bug crash、 out of memory) 時才會意外關閉,所以才建議不要把 最大備用伺服器數
設定過高,避免資源長期被佔用。
而 process_idle_timeout
代表 process 處理完請求後的幾秒內,沒被分配到下一個請求的話 fpm 就將此 process 關閉。但預設的 10 秒就關閉有點太快了,當流量負載會讓伺服器程序數量介於 最小~最大備用伺服器數
時,fpm 容易把效能浪費在重複關閉進程、新建程序這件事。
因 process_idle_timeout
無法更改的關係,故不建議使用 因應需求
的模式。 動態
模式的話則需要注意別把 最大備用伺服器數
設定的太高,不然經歷過流量高峰後,除非他自己當掉否則是不會自己消失的。靜態
模式雖然在離峰時段不會吐出資源,但相對的進入尖峰時段時不需重新建立程序,不會有請求回應延遲的問題,如果你的網站不分時段都有一定的流量就挺適合這模式的。
- 核心設定的部分絕大部分參數都可以按照預設值即可,需要特別提到的有以下幾個:

項目 | 建議設定 | 我的設定 |
memory_limit 限制每個 process 能使用多少記憶體 | 至少 128M 以上,建議 256M 以上 (預設:128M) – max_children * memory_limit 要低於可用記憶體 – 必須大於 post_max_size + 128 M | 512M |
post_max_size 每個連線請求,上傳資料大小的上限 | 32~128M (預設:32M) – 若無上傳大檔案的需求不需調太高 | 128M |
upload_max_filesize 上傳時,單個檔案大小的上限 | 32~128M – 若無上傳大檔案的需求不需調太高 – 不可大於 post_max_size | 128M |
max_execution_time PHP 腳本最大值行時間 | 120 以上 (預設:240) – 若日後有遇到 Fatal error: Maximum execution time 則需延長時間 | 180 |
apc.shm_size PHP APC 快取大小上限 | 32~256M 部分的 WordPress 安裝快取外掛會用到 APC 快取 (例:W3 Total Cache),沒用到的話維持 32M 即可 | 256M |
allow_url_fopen 允許 PHP 腳本開啟遠端文件 | 0 (預設: 1 或 On) – 不建議開啟,除非日後安裝的外掛插件會用到此功能 – 開啟後會有代碼注入的漏洞風險 | 0 (off) |
error_log 遇到錯誤、警告時,將記錄寫在何處 | /volume1/web/php_error.log (預設:空值,不會記錄) – log 檔路徑建議維持在 Web 共用資料夾中 – 使用其他的共用資料夾會有 http 群組權限問題需處裡 |
網頁服務
定義好指令碼語言設定後,接著就要告訴 WebStation 哪個資料夾要作為網頁服務
- 打開 WebStation 後點選側邊欄的網頁服務,再點選上方工具列的新增會跳出選擇服務類型的彈窗,選擇原生指令碼語言網站,將服務設定為 PHP + 稍早建立的自訂設定檔,接著點下一步

- 依序填寫以下項目並套用:
- 名稱:識別用,僅能輸入英文數字
- 描述:識別用,可以輸入中文與空白
- 主目錄:指定 NAS 剛剛放 WordPress 安裝包的目錄
- HTTP 後端伺服器:建議選 Nginx
- 逾時秒數:維持預設的 60 秒即可

網頁入口
定義好網頁服務後,接著就要設定用什麼方式連接到網頁服務
- 點選側邊欄的網頁入口,再點選上方工具列的新增會跳出選擇入口類型的彈窗,選擇網頁服務入口

- 依序填寫以下項目並套用:
- 服務:選擇剛剛建立的網頁服務
- 入口類型:因為是要對外透過網址的連線的,故這邊選擇名稱對應
- 主機名稱:填寫網站要使用的網址
- 連接埠:勾選 80 / 443
- 其他設定維持預設點選新增完成設定

到這步驟 Web Station 就幾乎設定完成了,如果要測試上傳的 Worpdress 安裝包是否能正常運作,可以先額外設定一個連接埠對應入口透過 IP+Port 的方式連線到 WordPress 的網頁服務,若能看見 WordPress 的安裝畫面就代表一切 OK,可以進入下一步設定路由器通訊埠轉送的設定。

補充:關閉 web 資料夾訪問權限
剛剛在講解入口類型差異時,是否有注意到透過未定義成入口的方法連線到 NAS 時,均會轉送至預設伺服器 (即 web 共用資料夾)。若有人得知了你的固定 IP 地址或 Synology DDNS 的話,就可以去猜常見的檔案名稱與路徑(比方說 /password.txt、/error.log),試圖從中尋找有無漏洞或個人資料。
訪問 .php 的檔案會回傳 500 伺服器錯誤無法正常存取,所以倒不用擔心 wp-config.php 等含有機密的設定檔被整碗端走。但Wordpress 插件的檔案就不好說了,如果插件中含有機密資訊(例如 某些服務的API KEY)並且是以靜態資源儲存,或是執行後的 log 中會留下機密資訊的話,只要攻擊者知道該檔案的路徑就能把資訊劫走。

所以還會建議要設定 .htaccess 來關閉 web 資料夾的訪問權限,這樣只要不是透過正確的網頁入口進來的,一律都回應 403 存取拒絕。設定的步驟如下:
- 打開 Web Station 後進入網頁服務的分頁,選取預設服務後點編輯,將 HTTP 後端伺服器更改為 Apache HTTP Server 2.4

- 打開任意文字編輯程式 (例:筆記本、VS Code、WordPad++等),複製貼上以下代碼後,儲存時將檔名命名為 .htaccess
# 拒絕所有連線
Require all denied
- 將檔案上傳到 web 共用資料夾就完成設定了,這樣預設伺服器在訪問時一律都會顯示 403 存取拒絕的頁面。
如果 web 資料夾中有特定的資料夾是要開放給外部存取的,那就在該資料夾中也上傳一個 .htaccess ,只不過內容要改成以下代碼
# 允許所有連線
Require all granted