幫朋友架設 Wordpress 透過 Caddy 經過穩定的運行一段時間
由於 Caddy 的設定非常精簡方便,又可以自動從 Let's Encrypt 申請憑證
可以使用 Caddy 進行反向代理和一些詳細設定,對我來說比較方便

規格

前置作業

首先安裝 yum-utils,用來管理 yum repo 及 package 的工具

1
yum install -y wget yum-utils

建立稍候會使用到的使用者 caddy,並設定不能登入的用戶 /sbin/nologin

並將擺放網頁的資料夾擁有者設定給建立好的 cadyy

1
2
useradd -r -d /var/www -M -s /sbin/nologin caddy
chown -R caddy:caddy /var/www

PHP7

CentOS 不會有太多新的套件可以供安裝,但是可以透過手動的方式安裝一些較新的套件

1
2
3
4
wget https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
wget http://rpms.remirepo.net/enterprise/remi-release-7.rpm
rpm -Uvh epel-release-latest-7.noarch.rpm
rpm -Uvh remi-release-7.rpm

Step 1. 指定安裝 PHP 版本

這裡提供 PHP 7、7.1、7.2 三個版本可供安裝

1
2
3
4
5
6
7
8
## php70
yum-config-manager --enable remi-php70

## php71
yum-config-manager --enable remi-php71

## php72
yum-config-manager --enable remi-php72

Step 2. 安裝 Wordpress 相關 PHP 套件

安裝 PHP 相關套件,稍候才能運行起 Wordpress

1
yum install -y php php-fpm php-mysqlnd php-pdo php-xml php-pear php-devel php-mbstring re2c gcc gcc-c++

Step 3. 確認 PHP 版本

若沒有安裝成功或是有相關錯誤,是沒有辦法顯示出 PHP 資訊

若安裝成功,則可以看到是否為自己想要安裝的版本

1
2
3
4
5
6
php -v


PHP 7.2.30 (cli) (built: Apr 15 2020 07:23:04) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies

Step 4. 設定 php-fpm

PHP-FPM 是用來管理 PHP FastCGI

這邊設定 PHP-FPM,將 listen 設定成 Unix Socket /var/run/php-fpm/php-fpm.sock

當然也可以使用 TCP Socket,這邊依個人偏好選擇,Caddy 都可以支援

這邊 listen 我設定成 unix,並且使用者更改成 caddy,並將權限更改成 0660

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
vim /etc/php-fpm.d/www.conf


; The address on which to accept FastCGI requests.
; Valid syntaxes are:
;   'ip.add.re.ss:port'    - to listen on a TCP socket to a specific IPv4 address on
;                            a specific port;
;   '[ip:6:addr:ess]:port' - to listen on a TCP socket to a specific IPv6 address on
;                            a specific port;
;   'port'                 - to listen on a TCP socket to all addresses
;                            (IPv6 and IPv4-mapped) on a specific port;
;   '/path/to/unix/socket' - to listen on a unix socket.
; Note: This value is mandatory.
listen = /var/run/php-fpm/php-fpm.sock

...

; Set permissions for unix socket, if one is used. In Linux, read/write
; permissions must be set in order to allow connections from a web server.
; Default Values: user and group are set as the running user
;                 mode is set to 0660
listen.owner = caddy
listen.group = caddy
listen.mode = 0660

然後重新啟動 PHP-FPM 以便載入設定

1
systemctl restart php-fpm

MYSQL8

CentOS 原本可以安裝套件都是穩定的版本,所以不太會有很新的套件可供安裝

一樣需要新增 MYSQL8 的安裝來源

1
rpm -Uvh https://repo.mysql.com/mysql80-community-release-el7-3.noarch.rpm

然後要關閉其他版本的 mysql 的安裝來源

只啟動 mysql8 版本的安裝來源,並進行安裝

1
2
3
sed -i 's/enabled=1/enabled=0/' /etc/yum.repos.d/mysql-community.repo

yum --enablerepo=mysql80-community install mysql-community-server

取得預設 MYSQL 密碼

安裝好 MYSQL 後,內建已經產生高複雜的密碼

1
2
3
4
grep "A temporary password" /var/log/mysqld.log


2020-04-23T14:05:54.162979Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: Uad4ej2dIh)t

初始設定 MYSQL

安裝好 MYSQL ,需要行一些基本的安全相關設定

可以透過 mysql_secure_installation 進行設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
mysql_secure_installation


# 刪除匿名使用者
Remove anonymous users? [Y/n] y

# 關閉 root 帳戶遠端登入
Disallow root login remotely? [Y/n] y

# 刪除 test 資料庫
Remove test database and access to it? [Y/n] y

# 重新載入
Reload privilege tables now? [Y/n] y

建立資料庫

登入資料庫,並輸入預設高複雜度密碼或者剛剛有更改成自己熟悉的密碼

並建立資料庫,稍候 Wordpress 需要使用此資料庫

1
2
3
4
5
mysql -u root -p

mysql> CREATE DATABASE wordpress;

mysql> exit;

Caddy 1 (Options)

安裝

可以從 Caddy 官方確認,不過快出 Caddy 2 了,所以等之後 Caddy 2 出來之後會補上 Caddy 2 的設定

1
curl https://getcaddy.com | bash -s personal

Caddy 1 Systemd 設定

caddy1.service 設定至 /etc/systemd/system/caddy.service

才能透過 systemctl 使用以下指令操控 Caddy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 重新載入設定
systemctl daemon-reload

# 開機自動執行 Caddy
systemctl enable caddy

# 啟動 Caddy
systemctl start caddy

# 重啟 Caddy
systemctl restart caddy

# 關閉 Caddy
systemctl stop caddy

設定檔

創建 Caddy 的設定檔資料夾及設定檔

1
2
3
mkdir /etc/caddy

touch /etc/caddy/Caddyfile

設定 Caddy 給 Wordpress 使用的設定

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
:80 {
  root /var/www/html/wordpress
  gzip
  fastcgi / /var/run/php-fpm/php-fpm.sock php

  # 防止 php 檔案上傳,以免被植入後門
  rewrite {
        r /uploads\/(.*)\.php
        to /
  }

  rewrite {
        if {path} not_match ^\/wp-admin
        to {path} {path}/ /index.php?{query}
  }
}

進行重啟 Caddy 讓設定生效

1
systemctl restart caddy

Caddy 2 (Options)

安裝

可以從 Github Caddy Release 下載,選擇對應的系統版本

這裡我是 Linux 64Bit ,所以選擇 caddy_2.0.0_linux_amd64.tar.gz

1
wget https://github.com/caddyserver/caddy/releases/download/v2.0.0/caddy_2.0.0_linux_amd64.tar.gz

下載好之後進行解壓縮,並移入 /usr/bin/

1
2
tar zxvf caddy_2.0.0_linux_amd64.tar.gz
mv caddy /usr/bin/

Caddy 2 Systemd 設定

caddy2.service 設定至 /etc/systemd/system/caddy.service

才能透過 systemctl 使用以下指令操控 Caddy

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 重新載入設定
systemctl daemon-reload

# 開機自動執行 Caddy
systemctl enable caddy

# 啟動 Caddy
systemctl start caddy

# 重啟 Caddy
systemctl restart caddy

# 關閉 Caddy
systemctl stop caddy

設定檔

與 Caddy 1 有所不同,雖然很像,但是還是有些差異

rewrite 的部分,會在近期驗證補上

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
:80 {
  # root /var/www/html/wordpress
  root * /var/www/html/wordpress

  # gzip
  encode gzip

  #fastcgi / /var/run/php-fpm/php-fpm.sock php
  php_fastcgi unix//var/run/php-fpm/php-fpm.sock

  # 防止 php 檔案上傳,以免被植入後門
  respond /uploads/*.php 404

  @wp-admin {
    path  not ^\/wp-admin/*
  }
  rewrite @wp-admin {path}/index.php?{query}

  # 靜態文件伺服器
  file_server
}

設定好之後,以指令的方式啟動 Caddy2

1
caddy run --config=/etc/caddy/Caddyfile

Wordpress

下載

這裡最重要的就是安裝 Wordpress

從官方下載最新的版本 Wordpress 5.4

1
2
3
4
5
cd /var/www/html/

wget https://tw.wordpress.org/latest-zh_TW.tar.gz

tar zxvf wordpress-5.4-zh_TW.tar.gz

安裝

每個人的機器 IP 位址不一定相同,請確認好自己的 IP

接下來透過瀏覽器安裝 Wordpress 系統,登入至 http://{Wordpress IP}

Step 1

沒有權限或資料錯誤等等異常,便會順利看到 Wordpress 的安裝畫面

Step 2

設定好剛剛在 MYSQL 建立的資料庫名稱和資料庫的帳號密碼

Step 3

沒有遇到資料庫打錯會無法連線的問題,就能開始執行安裝程式

Step 4

安裝程式執行完畢之後,就可以開始設定 Wordpress 的網站名稱、管理者帳號密

Step 5

設定完畢之後就能登入 Wordpress 後台

輸入設定好的帳號密碼,登入至 Wordpress 後台

Step 6

成功進入 Wordpress 後台,沒有任何問題

前台也是沒有任何問題

結論

自己在寫網站都是透過 Golang 之後,有一小段時間沒有碰 PHP

不過 Wordpress 真的是一個很成熟的 CMS 平台,將來希望可以自己試著開發一套自己的 CMS

看看自己能開發到什麼程度,也可以對架構和功能的設計有一個練習

Ref

  1. yum-utils(1) - Linux man page
  2. Caddy 1
  3. Caddy 2
  4. Wordpress
  5. Caddy 2 - Download