本篇文章更新時間:2024/03/04
如有資訊過時或語誤之處,歡迎使用 Contact 功能通知。
一介資男的 LINE 社群開站囉!歡迎入群聊聊~
如果本站內容對你有幫助,歡迎使用 BFX Pay 加密貨幣新台幣 贊助支持。


自從經手過 WordPress.com、WordPress VIP、Pressable 這三家 Automattic 自家的 WordPress 專業代管服務後就一直對他們家的管理方式感到好奇,也是目前我覺得最漂亮的做法!

把 wp-content 與 Core 核心切開,使用者、開發者就算有 SSH 遠端連線或是安裝檔案操作外掛,都沒有機會動到核心系統的原始碼。

這會保證一件事:所有使用的開發方法都會是遵守所謂「WordPress 開發準則」(永遠不要動到核心程式碼)。

在這架構下必須要符合這樣的開發流程,才能使用功能,而又,因為有這樣的硬性條件限制,也只能去使用滿足這條件的其他延伸工具(外掛、主題),而又,當網站發生問題時,能夠限縮權責到使用者身上,與主機代管這邊的問題不大,而又,障礙排除問題算是簡單的!

所以我才會覺得,這真的是最漂亮的做法了~

以下,本篇內文就是在筆記如何做到把使用者端的 wp-contentCore 拆開的做法。

儘管 Automattic 的這幾個專業代管主機品牌經營策略各有不同,但底子核心技術都差不多,我就純粹以核心的「拆解」來紀錄,其餘就是看經營方向與能力認知到哪,自己斟酌參考了。

前置準備

  1. 使用 LNMP 的伺服器架構
  2. 會設定 Nginx 組態
  3. 理解 Linux 的檔案權限機制

目錄結構拆解

WordPress 真要說 內容(wp-content)整個核心(Core) 的主要區分其實就是 wp-config.phpwp-content 這一個檔案與資料夾 和 「其他」就是核心 Core。

也就是說,把 wp-config.phpwp-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.phpwp-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 拆開,也算是很有心意了!


Share:

作者: Chun

資訊愛好人士。主張「人人都該為了偷懶而進步」。期許自己成為斜槓到變進度條 100% 的年輕人。[///////////____36%_________]

發佈留言

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


文章
Filter
Apply Filters
Mastodon