主機環境更新實錄 (5) – WP 篇


一開始原本打算以 nginx + wp-fpm 的形式建立起 wordpress,但由於對於 nginx 各種設定還是一知半解,雖然可以成功建立起來,但是後續要架起多站點使用的時候,會因為導向問題而無法正確進入多站點的網站。並且因為結構上多了一層 proxy 讓狀況變得更複雜,然後我就失敗了 XD。細節就不寫太多了,免得有人搜尋到相關資訊卻得不到答案。

wordpress 蠻常會有一些設定問題,雖然也算是老生常談了,但還是留個紀錄以供之後參考。

1. mySQL 8 遇到密碼驗證問題

進到機器中增加驗證方式:

docker exec -it db bash
mysql -u root -p
use mysql;
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

2. 上傳檔案大小以及連線時間限制

在 wordpress 的 /var/www/html 目錄下增加 php.ini,記憶體限制建議不要開太大,不然可能傳檔案傳到死機:

file_uploads = On
memory_limit = 128M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600

因為還會先經過首頁才 proxy 過來,首頁的 nginx default.conf 也需要加上以下設定:

client_max_body_size       128M;
proxy_connect_timeout       300;
proxy_send_timeout          300;
proxy_read_timeout          300;
send_timeout                300;

3. 啟用多站點

編輯 wordpress 根目錄下的 wp-config.php,加入以下設定開啟多站點功能:

define('WP_ALLOW_MULTISITE', true);

進入 wordpress 的管理後台,就會看到選單設定中多了多站點可以選,系統會告訴你要如何增加設定。

(1) 在 wp-config.php 加入以下設定:

define('MULTISITE', true);
define('SUBDOMAIN_INSTALL', false);
define('DOMAIN_CURRENT_SITE', 'wp.winter-weng.cc');
define('PATH_CURRENT_SITE', '/');
define('SITE_ID_CURRENT_SITE', 1);
define('BLOG_ID_CURRENT_SITE', 1);

(2) 修改 /var/www/html/.htaccess

RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]

# add a trailing slash to /wp-admin
RewriteRule ^([_0-9a-zA-Z-]+/)?wp-admin$ $1wp-admin/ [R=301,L]

RewriteCond %{REQUEST_FILENAME} -f [OR]
RewriteCond %{REQUEST_FILENAME} -d
RewriteRule ^ - [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(wp-(content|admin|includes).*) $2 [L]
RewriteRule ^([_0-9a-zA-Z-]+/)?(.*\.php)$ $2 [L]
RewriteRule . index.php [L]

4. 將資源移動到 S3

當 wordpress 使用久了,wp-content 會變得相當肥大,因此我想將資源檔改為上傳至 AWS S3。

(1) 首先先至 AWS 的 IAM 依照以下步驟建立使用者:

新增使用者

完成之後,在這一步切記要將金鑰儲存起來,如果錯過就只能重新再生成了。

(2) 至 S3 開啟新的儲存貯體

照著步驟設定就可以了,儲存貯體的「封鎖公開存取」設定記得要設定為公開。

新增好之後,建立資料夾 wp-content 以及下層的 uploads

5. 修正資料

此次主機的更新,也讓原本備份資料出現 domain 對不上的問題,包含圖片資源要換成 S3 的網址都可以透過以下方式修正資料。

當然修正資料有很多種方式,如果不熟悉指令也可以直接編輯備份資料檔案,或是透過 Sequel Pro 等工具輔助。

進入資料庫:

docker exec -it db bash
mysql -u root -p

將舊網址更新為新網址:

UPDATE wp_options SET option_value = replace(option_value, 'http://www.oldurl', 'http://www.newurl') WHERE option_name = 'home' OR option_name = 'siteurl';

UPDATE wp_posts SET guid = replace(guid, 'http://www.oldurl','http://www.newurl');

UPDATE wp_posts SET post_content = replace(post_content, 'http://www.oldurl', 'http://www.newurl');

UPDATE wp_postmeta SET meta_value = replace(meta_value,'http://www.oldurl','http://www.newurl');

因為資源已經放置在 S3,本地不會有留檔,如果資料沒有清乾淨,進到媒體庫會看到破圖,可執行以下指令刪除媒體庫的資料:

DELETE FROM `wp_posts` WHERE `post_type` = "attachment";
DELETE FROM `wp_postmeta` WHERE `meta_key` = "_wp_attached_file";
DELETE FROM `wp_postmeta` WHERE `meta_key` = "_wp_attachment_metadata";

設定完成後終於可以開心寫作啦~


參考資料:


主機環境更新實錄:

  1. 主機環境更新實錄 (1) – 前情提要篇
  2. 主機環境更新實錄 (2) – Docker 篇
  3. 主機環境更新實錄 (3) – DNS 及轉導篇
  4. 主機環境更新實錄 (4) – SSL 篇
  5. 主機環境更新實錄 (5) – WP 篇
  6. 主機環境更新實錄 (6) – 完結篇

發佈留言

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