本篇文章更新時間:2024/03/04
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣 或 新台幣 贊助支持。
自從經手過 WordPress.com、WordPress VIP、Pressable 這三家 Automattic 自家的 WordPress 專業代管服務後就一直對他們家的管理方式感到好奇,也是目前我覺得最漂亮的做法!
把 wp-content 與 Core 核心切開,使用者、開發者就算有 SSH 遠端連線或是安裝檔案操作外掛,都沒有機會動到核心系統的原始碼。
這會保證一件事:所有使用的開發方法都會是遵守所謂「WordPress 開發準則」(永遠不要動到核心程式碼)。
在這架構下必須要符合這樣的開發流程,才能使用功能,而又,因為有這樣的硬性條件限制,也只能去使用滿足這條件的其他延伸工具(外掛、主題),而又,當網站發生問題時,能夠限縮權責到使用者身上,與主機代管這邊的問題不大,而又,障礙排除問題算是簡單的!
所以我才會覺得,這真的是最漂亮的做法了~
以下,本篇內文就是在筆記如何做到把使用者端的 wp-content
和 Core
拆開的做法。
儘管 Automattic 的這幾個專業代管主機品牌經營策略各有不同,但底子核心技術都差不多,我就純粹以核心的「拆解」來紀錄,其餘就是看經營方向與能力認知到哪,自己斟酌參考了。
前置準備
- 使用 LNMP 的伺服器架構
- 會設定 Nginx 組態
- 理解 Linux 的檔案權限機制
目錄結構拆解
WordPress 真要說 內容(wp-content)
與 整個核心(Core)
的主要區分其實就是 wp-config.php
與 wp-content
這一個檔案與資料夾 和 「其他」就是核心 Core。
也就是說,把 wp-config.php
與 wp-content
檔案和目錄抽離在外,就是一種分離。
wp-config.php 設定組態檔案
根據 WordPress 載入的順序,到 wp-load.php
這檔案時就會判斷 wp-config.php
的檔案位置路徑來引用。
有兩個放置的方式會預設引用,一個是直接在 WordPres 安裝的資料夾內,另一個就是放在 WordPress 安裝資料夾的「同一層」。顯然我們要的就是這後者,
wp-content 網站內容目錄
這部分內容目錄也要抽離原本 WordPress 安裝目錄的方法就是要透過上面的 wp-config.php
設定組態檔案來定義過 WP_CONTENT_DIR
這個路徑常數。
define('WP_CONTENT_DIR', dirname(__FILE__) . '/wp-content');
將 wp-content
內容目錄也放在 WordPress 安裝目錄的同層。
上述兩點的結果如下圖樹狀結構:
.
├── test.php
├── wordpress -> ../../../tmp/wordpress #安裝目錄
├── wp-config.php #設定組態檔案
├── wp-content #網站內容目錄
│ ├── index.php
│ ├── languages
│ ├── plugins
│ ├── themes
│ ├── upgrade
│ └── uploads
└── wp-load.php -> wordpress/wp-load.php
Nginx 伺服器的組態設定
基本上名為 wordpress
的 WordPress 完整的解壓縮安裝目錄與 wp-config.php
是必須要放在同層,而 wp-content
內容目錄就沒有這限制,是可以發揮點想像空間的操作點。
但這時候如果要讓網站的網址不是 https://www.mxp.tw/wordpress/
而是要 https://www.mxp.tw/
這樣的話怎辦?
網站的根目錄,也就是 Nginx 中 Server 區塊的 root
設定必須要是 /path/to/www
而不能是 /path/to/www/wordpress
不然會操作不到同層目錄下的組態與內容目錄等資源。
以下是我完整的 Nginx 組態檔案:
server
{
listen 80;
#listen [::]:80;
server_name www.mxp.tw;
index index.html index.htm index.php default.html default.htm default.php;
root /path/to/www;
include enable-php.conf;
#ref: https://github.com/Automattic/vip-container-images/blob/master/nginx/default.conf
if ( $uri ~ /\.git ) { return 403; }
if ( $uri ~ /\.svn ) { return 403; }
if ( $uri ~ /\.ht ) { return 403; }
if ( $uri ~ /svn-commit\. ) {
return 403;
}
location = /db-config.php {
return 403;
}
location = /wp-blog-header.php {
return 403;
}
location = /wp-config.php {
return 403;
}
location = /wp-config-sample.php {
return 403;
}
location = /config/ {
return 403;
}
location = /readme.html {
return 403;
}
location = /license.txt {
return 403;
}
location = / {
try_files $uri wordpress$uri/ /index.php?$args;
}
location / {
rewrite ^/wp-json/(.*)$ /wordpress/wp-json/$1 last;
try_files $uri $uri/ /index.php?$args;
}
if (!-e $request_filename) {
rewrite /wp-admin$ $scheme://$host$request_uri/ permanent;
rewrite ^(/[^/]+)?(/wp-.*) /wordpress$2 last;
rewrite ^(/[^/]+)?(/.*.php) /wordpress$2 last;
rewrite ^/(.*)$ /wordpress/index.php?$args last;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}
location ~ .*\.(js|css)?$
{
expires 12h;
}
location ~ /.well-known {
allow all;
}
location ~ /\.
{
deny all;
}
access_log off;
}
主要是透過 rewrite
方法來改寫請求完成這樣的處理,其他像是 PHP 環境的設定、需要傳入哪些 fastcgi 參數或是 SSL 與反向代理等就也是可以發揮巧思去操作的空間。
檔案權限操作
到這邊,其實已經完成了這樣一個 WordPress 網站的目錄拆解步驟,接下來就是實務面上還要做的檔案權限操作。
首先針對 wordpress
的 WordPress 核心檔案資料夾,可以使用 root
權限來鎖定修改權限,然後 wp-config.php
與 wp-content
兩個檔案與目錄設定權限給使用者與伺服器的使用者群組,開放讓使用者與伺服器程式可以修改。
善用 ln -s
這樣的 Symbolic link 超連結方式來掛載 WordPress 安裝目錄也能對整台主機上的核心程式做到控管,完成一鍵更新核心版本的操作。當然也能以此做到 WordPress.com 的「商業版外掛」在授權期間內提供的玩法。
後記
先不談很多人因為資安想東藏西藏各種花式包裝,我就現實面上「好不好管理」以及「開發彈性高不高」兩點來切入,大部分網路上提供的拆解做法我真的沒一個能接受。
其中最知名的就是 Roots 這業者出品的開發框架。
因為破壞了主體結構組成,導致原本有依賴這結構,又或是外掛開發者以「預設」為前提來寫,都會導致各種相容性問題,這延伸的問題直接都是衝擊到未來的開發彈性與管理。
一來接手要重新學習這樣的框架,二來因為大幅修改架構導致的不相容問題,變成很多外掛輔助都失效,自己重新造輪的機會高,都不是一個好的商業考量。
如果自己弄自己的產品,有時間大概會想玩玩,一但考慮團隊能力以及時間成本,很快就放棄這些花招了XD
最近看到這個以盡可能最小化方式運作一個 WordPress 網站的 Docker 專案:TrafeX/docker-wordpress 看到其實作是依據 Codeable 這篇 WordPress Developer’s Intro To Docker, Part Two 來把 wp-content
拆開,也算是很有心意了!