EC2 Amazon Linux 2へWordPressサーバを引っ越し
WordPressをAWSへサーバ引っ越しました。その時のサーバ引っ越し作業手順を備忘録としてまとめました。

基本的に引っ越し前のWebサーバでWordPressが動いていた前提の内容となっています。動作環境としては"Nginx" “PHP-fpm" “MySQL"の構成です。
- AWS
- AWSでアカウントを作成
- EC2(Amazon Linux 2)を作成
- RDS(MySQL)を作成
- 旧サーバ
- Nginx,PHP-fpmの設定ファイルをバックアップ
- WordPressのファイルをバックアップ
- MySQLに保存しているデータをバックアップ
- 新サーバ
- サーバ設定
- Nginx,PHP-fpmをインストール
- 旧サーバのNginx,PHP-fpmの設定を反映
- WordPressを設置
- MySQLへデータをリストア
- SSLなど
AWSで作業
AWSにアカウントを作成する。
EC2を作成
Amazon Linux 2でEC2を作成する。
RDSを作成
MySQLでRDSを作成する。
新サーバで作業
サーバ初期設定
yumパッケージ更新
$ sudo yum update
タイムゾーン設定・確認
$ timedatectl status
Local time: Fri 2018-11-23 05:56:04 UTC
Universal time: Fri 2018-11-23 05:56:04 UTC
RTC time: Fri 2018-11-23 05:56:04
Time zone: n/a (UTC, +0000)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
$ sudo timedatectl set-timezone Asia/Tokyo
$ timedatectl status
Local time: Fri 2018-11-23 14:56:43 JST
Universal time: Fri 2018-11-23 05:56:43 UTC
RTC time: Fri 2018-11-23 05:56:43
Time zone: Asia/Tokyo (JST, +0900)
NTP enabled: yes
NTP synchronized: no
RTC in local TZ: no
DST active: n/a
ロケール、キーボードレイアウト設定・確認
$ localectl status
System Locale: LANG=en_US.UTF-8
VC Keymap: n/a
X11 Layout: n/a
$ sudo localectl set-locale LANG=ja_JP.UTF-8
$ sudo localectl set-keymap jp106
$ localectl status
System Locale: LANG=ja_JP.UTF-8
VC Keymap: jp106
X11 Layout: jp
X11 Model: jp106
X11 Options: terminate:ctrl_alt_bksp
viを設定
$ vi ~/.vimrc
set encoding=utf-8
set fenc=utf-8
set title
set tabstop=4
set shiftwidth=4
set ignorecase
set smartcase
Gitをインストール
$ sudo yum install git
Nginxをインストール
Nginxのパッケージを確認
$ amazon-linux-extras list | grep nginx
Nginxをインストール
$ sudo amazon-linux-extras install nginx1
Nginxのバージョンを確認
$ nginx -v
nginx version: nginx/1.20.0
PHP-fpmをインストール
PHPをインストール
$ sudo amazon-linux-extras install php8.0
PHPのバージョンを確認
$ php -v
PHP 8.0.8 (cli) (built: Jul 7 2021 17:35:32) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.8, Copyright (c) Zend Technologies
with Zend OPcache v8.0.8, Copyright (c), by Zend Technologies
PHP-fpmのバージョンを確認
$ php-fpm -v
PHP 8.0.8 (fpm-fcgi) (built: Jul 7 2021 17:37:26)
Copyright (c) The PHP Group
Zend Engine v4.0.8, Copyright (c) Zend Technologies
with Zend OPcache v8.0.8, Copyright (c), by Zend Technologies
もし「with Zend OPcache v7.2.11, Copyright (c) 1999-2018, by Zend Technologies」が出力されていない場合は、Opcacheをインストールする。
$ sudo yum install php-opcache
mbstringをインストール
$ sudo yum install php php-mbstring
PHP関係の環境がインストール出来たか確認
]$ yum list installed | grep php
php-cli.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4
php-common.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4
php-fpm.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4
php-json.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4
php-mbstring.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4
php-mysqlnd.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4
php-pdo.x86_64 7.4.7-1.amzn2 @amzn2extra-php7.4
MySQL(MariaDB)をインストール
MariaDBをインストール
$ sudo yum install mariadb
旧サーバで作業
各種設定ファイルを圧縮ファイル
NginxとPHPの各種設定ファイルを圧縮ファイルへ
$ sudo tar zcf /tmp/etc.files.tar.gz /etc/nginx /etc/php-fpm.d /etc/php.ini /etc/php-fpm.conf
WordPressを圧縮ファイルへ
$ sudo tar zcf /tmp/wordpress.files.tar.gz /var/www/blog
DBをダンプ
WordPressのデータベースのデータと定義をダンプ
$ mysqldump -h RDSのエンドポイント -u ユーザ名 -p データベース名 > /tmp/wordpress.dump.sql
ローカルPCで作業
旧サーバの各種設定ファイルとDBダンプファイルをSCPでダウンロード
ローカルPCへ旧サーバのファイルをSCPでダウンロード
$ scp -i SSHの鍵 ユーザ名@IPアドレスorドメイン:/tmp/etc.files.tar.gz /tmp/
$ scp -i SSHの鍵 ユーザ名@IPアドレスorドメイン:/tmp/wordpress.files.tar.gz /tmp/
$ scp -i SSHの鍵 ユーザ名@IPアドレスorドメイン:/tmp/wordpress.dump.sql /tmp/
新サーバへ転送
ローカルPCから新サーバへファイルをSCPで転送
$ scp /tmp/etc.files.tar.gz -i SSHの鍵 ユーザ名@IPアドレスorドメイン:/tmp/
$ scp /tmp/wordpress.files.tar.gz -i SSHの鍵 ユーザ名@IPアドレスorドメイン:/tmp/
$ scp /tmp/wordpress.dump.sql -i SSHの鍵 ユーザ名@IPアドレスorドメイン:/tmp/
新サーバで作業
旧サーバの各種設定ファイルを配置する
Nginx設定ファイルを配置
ファイルを解凍
$ tar zxvf /tmp/etc.files.tar.gz
元ファイルを退避
$ sudo mv /etc/nginx/ /etc/nginx~
ファイルを配置
$ sudo mv /tmp/nginx /etc/nginx
PHP設定ファイルを設定
元ファイルを退避
$ sudo mv /etc/php-fpm.d /etc/php-fpm.d~
$ sudo mv /etc/php.ini /etc/php.ini~
$ sudo mv /etc/php-fpm.conf /etc/php-fpm.conf~
ファイルを配置
$ sudo mv /tmp/php-fpm.d /etc/php-fpm.d
$ sudo mv /tmp/php.ini /etc/php.ini
$ sudo mv /tmp/php-fpm.conf /etc/php-fpm.conf
WordPressをドキュメントルートへ配置
ファイルを解凍
$ tar zxvf /tmp/wordpress.files.tar.gz
ドキュメントルートを準備
$ sudo mkdir /var/www
ファイルを配置
$ sudo mv /tmp/blog /var/www
ファイルのパーミッションを設定
$ sudo chown -R nginx:ec2-user /var/www
$ sudo chmod -R 775 /var/www
WordPressの設定ファイルを編集
$ vi /var/www/blog/wp-config.php
DBをリストア
データベースを作成(作っていない場合)
CREATE DATABASE wordpress;
DBへダンプしたファイルを流し込んでリストア
$ mysql -h RDSのエンドポイント -u ユーザ名 -p データベース名 < /tmp/wordpress.dump.sql
ドメイン切り替え
ドメインを新サーバへ切り替えを行う。
# MACの場合
$ sudo vi /private/etc/hosts
Let’s Encrypt でSSL設定
Let’s EncryptでhttpsとなるようにSSL設定を行います。
legoでcertbot
legoはGo製のツールです。
wgetで lego のバイナリをGitHub からダウンロード
$ cd ~/
$ wget https://github.com/go-acme/lego/releases/download/v4.4.0/lego_v4.4.0_linux_amd64.tar.gz
--2022-12-23 10:18:47-- https://github.com/go-acme/lego/releases/download/v4.4.0/lego_v4.4.0_linux_amd64.tar.gz
github.com (github.com) をDNSに問いあわせています... 20.27.177.113
github.com (github.com)|20.27.177.113|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 302 Found
場所: https://objects.githubusercontent.com/github-production-release-asset-2e65be/37038121/dd618880-c88e-11eb-9026-76013d5c6d47?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221223%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221223T011726Z&X-Amz-Expires=300&X-Amz-Signature=6db8ee5fac1bb6cc581f2147c3428db62de8b1ef7dcccc00f4e3e907a8d9142f&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=37038121&response-content-disposition=attachment%3B%20filename%3Dlego_v4.4.0_linux_amd64.tar.gz&response-content-type=application%2Foctet-stream [続く]
--2022-12-23 10:18:47-- https://objects.githubusercontent.com/github-production-release-asset-2e65be/37038121/dd618880-c88e-11eb-9026-76013d5c6d47?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIAIWNJYAX4CSVEH53A%2F20221223%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20221223T011726Z&X-Amz-Expires=300&X-Amz-Signature=6db8ee5fac1bb6cc581f2147c3428db62de8b1ef7dcccc00f4e3e907a8d9142f&X-Amz-SignedHeaders=host&actor_id=0&key_id=0&repo_id=37038121&response-content-disposition=attachment%3B%20filename%3Dlego_v4.4.0_linux_amd64.tar.gz&response-content-type=application%2Foctet-stream
objects.githubusercontent.com (objects.githubusercontent.com) をDNSに問いあわせています... 185.199.111.133, 185.199.108.133, 185.199.109.133, ...
objects.githubusercontent.com (objects.githubusercontent.com)|185.199.111.133|:443 に接続しています... 接続しました。
HTTP による接続要求を送信しました、応答を待っています... 200 OK
長さ: 9861787 (9.4M) [application/octet-stream]
`lego_v4.4.0_linux_amd64.tar.gz' に保存中
100%[=========================================================================================================================================================================>] 9,861,787 3.40MB/s 時間 2.8s
2022-12-23 10:18:51 (3.40 MB/s) - `lego_v4.4.0_linux_amd64.tar.gz' へ保存完了 [9861787/9861787]
tar.gzを解凍して /opt/lego へ配置
$ sudo mkdir /opt/lego
$ sudo tar zxf ~/lego_v4.4.0_linux_amd64.tar.gz -C /opt/lego
インストールされたlegoのバージョンを確認
$ /opt/lego/lego -v
lego version 4.4.0 linux/amd64
SSL/TLS証明書を発行
$ sudo /opt/lego/lego --accept-tos --path "/etc/lego" --http --http.webroot "/var/www/hoge" --domains "hoge.com" --email "hoge@example.com" run
2022/12/23 10:27:05 [INFO] acme: Registering account for hoge@example.com
!!!! HEADS UP !!!!
Your account credentials have been saved in your Let's Encrypt
configuration directory at "/etc/lego/accounts".
You should make a secure backup of this folder now. This
configuration directory will also contain certificates and
private keys obtained from Let's Encrypt so making regular
backups of this folder is ideal.
2022/12/23 10:27:05 [INFO] [hoge.com] acme: Obtaining bundled SAN certificate
2022/12/23 10:27:05 [INFO] [hoge.com] AuthURL: https://acme-v02.api.letsencrypt.org/acme/authz-v3/189206876727
2022/12/23 10:27:05 [INFO] [hoge.com] acme: Could not find solver for: tls-alpn-01
2022/12/23 10:27:05 [INFO] [hoge.com] acme: use http-01 solver
2022/12/23 10:27:05 [INFO] [hoge.com] acme: Trying to solve HTTP-01
2022/12/23 10:27:11 [INFO] [hoge.com] The server validated our request
2022/12/23 10:27:11 [INFO] [hoge.com] acme: Validations succeeded; requesting certificates
2022/12/23 10:27:12 [INFO] [hoge.com] Server responded with a certificate.
発行された証明書を確認
$ sudo ls -la /etc/lego/certificates
合計 20
drwx------ 2 root root 98 12月 23 10:27 .
drwx------ 4 root root 42 12月 23 10:27 ..
-rw------- 1 root root 5305 12月 23 10:27 hoge.com.crt
-rw------- 1 root root 3751 12月 23 10:27 hoge.com.issuer.crt
-rw------- 1 root root 230 12月 23 10:27 hoge.com.json
-rw------- 1 root root 227 12月 23 10:27 hoge.com.key
Nginxの設定ファイルで発行された証明書を定義
ssl_certificate /etc/lego/certificates/hoge.com.crt;
ssl_certificate_key /etc/lego/certificates/hoge.com.key;
snapdでcertbot
snapdをインストール
$ cd /etc/yum.repos.d/
$ sudo wget https://people.canonical.com/~mvo/snapd/amazon-linux2/snapd-amzn2.repo
$ sudo vi /etc/yum.conf
exclude=snapd-*.el7 snap-*.el7
これで snapd のインストールができます。
$ sudo yum install snapd
$ sudo systemctl enable --now snapd.socket
snapd が最新バージョンか確認します。
$ sudo snap install core
2021-08-29T22:53:56+09:00 INFO Waiting for automatic snapd restart...
core 16-2.51.4 from Canonical✓ installed
$ sudo snap refresh core
$ sudo snap install --classic certbot
certbot 1.18.0 from Certbot Project (certbot-eff✓) installed
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
証明書を発行
# --webroot Webサーバを利用して証明書を取得する
# -w ドキュメントルートの値
# -d ドメインの値
# --debug Amazon Linux 2は試験的な運用のためこのオプションを指定
# -v 証明書発行の過程を詳細に表示する
$ sudo certbot certonly --webroot -w <YOUR_DOCUMENT_ROOT> -d <PUBLIC_DNS> --debug -v
作成された証明書を確認
$ sudo ls /etc/letsencrypt/live/<PUBLIC_DNS>/
certbot-autoをcURLでインストール※古い方法なので非推奨
どうやら仕様が変更されたらしくsnapdでcertbotをインストールするようになったみたいです
ただ、AmazonLinux2 で snapd をインストールする方法は書かれていないので、snapd のパッケージを管理しているリポジトリを設定します。
参考記事:AmazonLinux2でLet’s Encryptを使う(snapd編)、AmazonLinux2 に snapd を入れて certbot による証明書自動更新生活を満喫する
$ sudo curl https://dl.eff.org/certbot-auto -o /usr/bin/certbot-auto
Amazon Linux 2 に対する考慮を行う
$ sudo vi /usr/bin/certbot-auto
elif [ -f /etc/issue ] && grep -iq "Amazon Linux" /etc/issue ; then
Bootstrap() {
ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
}
BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
↓ へ編集
elif grep -i "Amazon Linux" /etc/issue > /dev/null 2>&1 || \
grep 'cpe:.*:amazon_linux:2' /etc/os-release > /dev/null 2>&1; then
Bootstrap() {
ExperimentalBootstrap "Amazon Linux" BootstrapRpmCommon
}
BOOTSTRAP_VERSION="BootstrapRpmCommon $BOOTSTRAP_RPM_COMMON_VERSION"
証明書を発行
# --webroot Webサーバを利用して証明書を取得する
# -w ドキュメントルートの値
# -d ドメインの値
# --debug Amazon Linux 2は試験的な運用のためこのオプションを指定
# -v 証明書発行の過程を詳細に表示する
$ sudo certbot-auto certonly --webroot -w <YOUR_DOCUMENT_ROOT> -d <PUBLIC_DNS> --debug -v
作成された証明書を確認
$ sudo ls /etc/letsencrypt/live/<PUBLIC_DNS>/
さいごに
これでサーバの引っ越しはできるかと思います。ただNginxやPHPのバージョンだったりOSの違いなどでうまくいかないこともあると思います。
実は、今回作業している様子を動画にしようと思ったのですが、なかなか面倒だったりして先にブログだけ書きあげちゃいました。なので、動画作るか画面キャプチャを貼るかしようと思います。
ディスカッション
コメント一覧
まだ、コメントがありません