EC2 Amazon Linux 2へWordPressサーバを引っ越し

2019年9月30日システムAWS,Let's Encript,Linux,Nginx,WordPress

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

EC2 Amazon Linux 2へWordPressサーバを引っ越し
EC2 Amazon Linux 2へWordPressサーバを引っ越し
サーバ引っ越しについて

基本的に引っ越し前の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でインストール※古い方法なので非推奨

2021.08追記

どうやら仕様が変更されたらしく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の違いなどでうまくいかないこともあると思います。

実は、今回作業している様子を動画にしようと思ったのですが、なかなか面倒だったりして先にブログだけ書きあげちゃいました。なので、動画作るか画面キャプチャを貼るかしようと思います。

プログラミングスクール受講メリット

・メンターにすぐ聞けるので分からないところでつまづかない
・受講生同士で学び合いモチベーション維持しやすい
・就学後に就職支援や進路サポートを受けることが出来る

ユート
ユート

Webプログラマ兼ブロガー | プログラミング基礎知識を発信|Webプログラマ歴は10年以上|JavaScript,PHP.HTML | 「人生の時間は有限。悪いことをしている時間はない」
プロフィール

2019年9月30日システムAWS,Let's Encript,Linux,Nginx,WordPress

Posted by ユート