ラック
Home > CMS > 記事 > 2018年11月 > WPサイト引っ越し(2018/11/20)

WPサイト引っ越し(2018/11/20)

カテゴリ: WordPress

概要

WordPressで1500超の記事

記事数1,500超とそこそこデータのあるWordPressのサイトを引っ越ししました。内容としては

  • 個人的な備忘録やノウハウの集積所として使用
  • 動いている機能は少ないものの、テストで色々なプラグインをインストールして実験→用がなくなったら停止を繰り返しているため、プラグインのインストール数とファイル数はそこそこ

という感じです。また、今回の引っ越しの条件としては以下。

  • WordPressのバージョンは4.9.8(新旧で変更なし)
  • PHPバージョン大幅アップ(5.x→7.2)
  • MySQLバージョン大幅アップ(5.x→8.0.1)
  • ドメイン変更(サブドメ変更)
    • ディレクトリ構造はそのまま
  • SSL対応(Let’s Encrypt)
  • ドメイン変更とSSL対応により、ドメインは下記のように変化
    • http://old.example.com/hoge/piyo/https://new.example.com/hoge/piyo/

PHP、MySQLのバージョンがグンと上がったのと、ドメインの細かいところが変更になっているのでそこそこ面倒な部類に入るのではないかと思うので、後に同じようなことをする際に役に立つかもしれないと思い、メモしておきます。

経緯

  • プラットフォームを新しくしたい
    • PHPのバージョンの都合で動かないプラグインが少々
      • 白くなってDB書き換えで戻す、ということを数度やっている
  • 記事数がそこそこ溜まったので、動作がもっさりしてきた
    • PHP7にすれば多少は改善するのではないかと期待
  • 記事を編集する際にVivaldiのアドレスバーが赤くなる(HTTPなので警告を出す)のがすごく気になる

以上のことを満たすため、サーバごと引っ越そうと考えました。

作業内容

以下、作業内容を書いていきます。ちなみにサーバはCentOS7.5を建てます。

初期設定

nmtuiでIPとホスト名を設定し、passwdでパスワード設定。

Update

# sudo yum update

## 略

Upgrade

# sudo yum upgrade
読み込んだプラグイン:fastestmirror
Loading mirror speeds from cached hostfile
 * base: ftp.riken.jp
 * extras: ftp.riken.jp
 * updates: ftp.riken.jp
No packages marked for update

セキュリティ

SELINUX

# vi /etc/sysconfig/selinux

#SELINUX=enforcing
SELINUX=disabled

firewalld

列挙
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources:
  services: ssh dhcpv6-client
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
80, 443を許可
# firewall-cmd --add-port=80/tcp --permanent
success
# firewall-cmd --add-port=443/tcp --permanent
success
リロード
# firewall-cmd --reload
success
確認
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens32
  sources:
  services: ssh dhcpv6-client
  ports: 80/tcp 443/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

ファイアウォールは何かをインストールする度にポートを開けていきます。

chronyインストール

# yum install chrony

## 略

# systemctl enable chronyd

# firewall-cmd --add-port=123/tcp --permanent
success
# firewall-cmd --add-port=123/udp --permanent
success
# firewall-cmd --reload
success

自動起動するようにして、ポート123を開けておく。

リポジトリ追加

epel

# yum -y install epel-release
# yum -y update

## 略

remi

# rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm

## 略

# rpm --import http://rpms.famillecollet.com/RPM-GPG-KEY-remi

リポジトリ有効化

vi /etc/yum.repos.d/remi.repo

[remi]
enabled=1
# vi /etc/yum.repos.d/remi-php72.repo

[remi-php72]
enabled=1

Apache

Apache(2.4.6-80)

# yum -y install httpd-devel

## 略

完了しました!

mode_ssl(2.4.6-80)

# yum -y install mod_ssl

## 略

完了しました!

PHP(7.2.12-1)

# yum -y install php php-devel php-pdo php-mysqlnd php-mbstring php-gd php-pear php-pecl-apc-devel zlib-devel php-xml php-mcrypt

WordPressに必要そうなモジュールも込みでインストール。php-xmlはプラグインで要求されることが多いので。

MySQL(8.0.13-1)

# rpm -ivh https://dev.mysql.com/get/mysql80-community-release-el7-1.noarch.rpm

## 略

# yum -y install mysql-community-devel mysql-community-server

memcached(1.5.12-1)

yum -y install memcached-devel php-pecl-memcache

Apacheの設定

# mv -i /etc/httpd/conf.d/autoindex.conf /etc/httpd/conf.d/autoindex.conf.org
# mv -i /etc/httpd/conf.d/userdir.conf /etc/httpd/conf.d/userdir.conf.org
# mv -i /etc/httpd/conf.d/welcome.conf /etc/httpd/conf.d/welcome.conf.org

いらない設定を読み込まないように。

# systemctl start httpd
# systemctl enable httpd
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

起動&自動起動設定

PHP設定

エラーログディレクトリ作成

# mkdir /var/log/php
# chown apache /var/log/php
# chmod 755 /var/log/php

php.ini

# vi /etc/php.ini

;expose_php = On
expose_php = Off

;date.timezone =
date.timezone = 'Asia/Tokyo'

;error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
error_reporting = E_ALL & ~E_DEPRECATED

;error_log = syslog
error_log = "/var/log/php/php_errors.log"

40-memcache.ini

# vi /etc/php.d/40-memcache.ini

;session.save_handler=memcache
session.save_handler=memcache

;session.save_path="tcp://localhost:11211?persistent=1&weight=1&timeout=1&retry_interval=15"
session.save_path="tcp://localhost:11211"

php.conf

# vi /etc/httpd/conf.d/php.conf

    #php_value session.save_handler "files"
    #php_value session.save_path    "/var/lib/php/session"

Memcached設定

# systemctl start memcached
# systemctl reload httpd
# systemctl enable memcached
Created symlink from /etc/systemd/system/multi-user.target.wants/memcached.service to /usr/lib/systemd/system/memcached.service.

MySQL設定

# mkdir /var/log/mysql
# chown -R mysql:mysql /var/log/mysql

ログディレクトリ作成。

my.cnf

# vi /etc/my.cnf

[mysqld]

## 略

slow_query_log=ON
slow_query_log_file=/var/log/mysql/slow_query.log
long_query_time=1.0

## 略

log_timestamps=SYSTEM
skip-character-set-client-handshake

追記。

# systemctl start mysqld
# systemctl enable mysqld

起動&自動起動設定

rootのパスワード変更

# less /var/log/mysqld.log

A temporary password is generated for root@localhost: XXXXXXXXXXXX

初期パスワードを見付け出す。

# mysql_secure_installation --use-default

Securing the MySQL server deployment.

Enter password for user root: XXXXXXXXXXXX

The existing password for the user account root has expired. Please set a new password.

New password: ZZZZZZZZZZZZ

Re-enter new password: ZZZZZZZZZZZZ
The 'validate_password' component is installed on the server.
The subsequent steps will run with the existing configuration
of the component.
By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) :  y
Success.


Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) :  y
Success.

By default, MySQL comes with a database named 'test' that
anyone can access. This is also intended only for testing,
and should be removed before moving into a production
environment.


Remove test database and access to it? (Press y|Y for Yes, any other key for No) :  y
 - Dropping test database...
Success.

 - Removing privileges on test database...
Success.

Reloading the privilege tables will ensure that all changes
made so far will take effect immediately.

Reload privilege tables now? (Press y|Y for Yes, any other key for No) :  y
Success.

All done!

rootのパスワードを変更。

Webmin

perl-Net-SSLeay(1.55-6)

# yum -y install perl-Net-SSLeay

必要なライブラリをインストール。

Webmin(1.900-1)

# yum -y install http://download.webmin.com/download/yum/webmin-1.900-1.noarch.rpm

本体をダウンロード&インストール。1.900は11/16に出たばかりらしいです。

# vi /etc/webmin/miniserv.conf

## 末尾に追加

allow=127.0.0.1 XXX.XXX.XXX.XXX/24
# /etc/rc.d/init.d/webmin restart

再起動。

# firewall-cmd --add-port=10000/tcp --permanent
success
# firewall-cmd --reload
success

ポートを開ける。

Webminのログイン画面

アクセスできました。

設定

GUIで

  • Webmin
    • Webmin configurations
      • Language and Locale

Japanese(JA_JP.UTF-8)を選択。

postfix

# less /etc/postfix/main.cf

mydestination = $myhostname, localhost.$mydomain, localhost

$mydomainがないことを確認。

vsftpd

# yum -y install vsftpd

## 略

インストール。

vsftpd.conf

# vi /etc/vsftpd/vsftpd.conf

## 匿名ユーザ無効化

#anonymous_enable=YES
anonymous_enable=NO

## タイムアウト時間変更

#idle_session_timeout=600
idle_session_timeout=600

#data_connection_timeout=120
data_connection_timeout=60

## ASCIIモード有効

#ascii_upload_enable=YES
ascii_upload_enable=YES

#ascii_download_enable=YES
ascii_download_enable=YES

## ホームディレクトリより上へのアクセス制限

#chroot_local_user=YES
chroot_local_user=YES

#chroot_list_enable=YES
chroot_list_enable=YES

#chroot_list_file=/etc/vsftpd/chroot_list
chroot_list_file=/etc/vsftpd/chroot_list

## IPv4有効

#listen=NO
listen=YES

## IPv6無効化

#listen_ipv6=YES
listen_ipv6=NO

## アクセスユーザ制御

userlist_deny=NO

## ローカル時間有効

use_localtime=YES

## パッシブモード有効

pasv_promiscuous=YES
pasv_min_port=50000
pasv_max_port=50030
# firewall-cmd --add-service=ftp --permanent
success
# firewall-cmd --reload
success

ポートを開ける。

chroot_list

# vi /etc/vsftpd/chroot_list

## 空ファイル作成

## root以外参照できないように権限変更

# ls -al /etc/vsftpd/chroot_list
-rw-r--r-- 1 root root 0 11月 17 11:57 /etc/vsftpd/chroot_list
# chmod 600 /etc/vsftpd/chroot_list
# ls -al /etc/vsftpd/chroot_list
-rw------- 1 root root 0 11月 17 11:57 /etc/vsftpd/chroot_list
# useradd ftpuser

ユーザ追加。

# vi /etc/vsftpd/user_list

ftpuser

サービス再起動。

# systemctl restart vsftpd.service

/etc/vsftpd/user_listに追加し、再起動。/etc/vsftpd/chroot_listは上に遡らせないようにするため、記載しない。

# passwd ftpuser

パスワードも設定。

# systemctl start vsftpd.service
# systemctl enable vsftpd.service
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.

起動&自動起動設定

Apache仮想サイト

new.example.comのディレクトリを仮想サイトvirsite1で作ります。

# mkdir /var/www/virsite1
# mkdir /var/www/virsite1/web

以降、Webminから設定。

  • 仮想ホストの作成
    • アドレス: 特定のアドレス(IP)
    • ポート: デフォルト
    • ドキュメントのルート: /var/www/virsite1/web
    • サーバ名: new.example.com
    • 仮想サーバの追加: 選択したファイル/etc/httpd/conf.d/virsite1.conf
    • ディレクティブのコピー元: どこにもない

作成後、ディレクティブの編集

#Options None ##コメントアウト

## 以下を追加

AllowOverride All
Options FollowSymLinks

.htaccess有効化のため。

権限設定

# chmod -R 2775 /var/www/virsite1/web
# chown -R apache:ftpuser /var/www/virsite1/web
# ls -al /var/www/

drwxrwsr-x 4 apache ftpuser 45 11月 17 17:09 web

WordPressのために権限と所有者を設定。自動更新がかかるように。

権限設定(11/29改修)

# usermod -aG wheel,apache ftpuser

Apacheグループに追加。

# chown -R apache:apache /var/www/virsite1/web

これでOK。ちなみに/var/www/virsite1/root:rootとする。

MySQL設定

  • DB作成: virsite1_db
    • 文字コード: utf8mb4_0900_ai_ci
    • 照合順序: utf8mb4_ja_0900_as_cs
  • ユーザ作成: virsite1_db_user
    • 許可なし。virsite1_dbに対しての許可だけ与える

これで旧サイトのデータをDBへインポート。

Let’s Encrypt

# sudo yum install epel-release

## 略

パッケージ epel-release-7-11.noarch はインストール済みか最新バージョンです
何もしません
# sudo yum install certbot python-certbot-apache

## 略

完了しました!
# certbot
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator apache, Installer apache
Enter email address (used for urgent renewal and security notices) (Enter 'c' to
cancel): testuser@new.example.com
Starting new HTTPS connection (1): acme-v02.api.letsencrypt.org

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.2-November-15-2017.pdf. You must
agree in order to register with the ACME server at
https://acme-v02.api.letsencrypt.org/directory
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(A)gree/(C)ancel: A

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing to share your email address with the Electronic Frontier
Foundation, a founding partner of the Let's Encrypt project and the non-profit
organization that develops Certbot? We'd like to send you email about our work
encrypting the web, EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: Y
Starting new HTTPS connection (1): supporters.eff.org

Which names would you like to activate HTTPS for?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: new.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate numbers separated by commas and/or spaces, or leave input
blank to select all options shown (Enter 'c' to cancel): 1
Obtaining a new certificate
Performing the following challenges:
http-01 challenge for new.example.com
Waiting for verification...
Cleaning up challenges
Created an SSL vhost at /etc/httpd/conf.d/virsite1-le-ssl.conf
Deploying Certificate to VirtualHost /etc/httpd/conf.d/virsite1-le-ssl.conf

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2
Redirecting vhost in /etc/httpd/conf.d/virsite1.conf to ssl vhost in /etc/httpd/conf.d/virsite1-le-ssl.conf

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations! You have successfully enabled https://new.example.com

You should test your configuration at:
https://www.ssllabs.com/ssltest/analyze.html?d=new.example.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/new.example.com/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/new.example.com/privkey.pem
   Your cert will expire on 2019-02-18. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - Your account credentials have been saved in your Certbot
   configuration directory at /etc/letsencrypt. You should make a
   secure backup of this folder now. This configuration directory will
   also contain certificates and private keys obtained by Certbot so
   making regular backups of this folder is ideal.
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

完了。

自動更新設定

# vi /etc/crontab

23 1 * * * root sudo /usr/bin/certbot renew --post-hook "sudo systemctl reload httpd"

cronで自動実行するように設定。

WP-CLI

# cd ~
# curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 5241k  100 5241k    0     0   768k      0  0:00:06  0:00:06 --:--:--  806k
# chmod +x wp-cli.phar
# mv wp-cli.phar /usr/local/bin/wp
# mkdir /var/www/virsite1/web/hoge/
# mkdir /var/www/virsite1/web/hoge/piyo/

FTPアップロードしてwp-config.phpを変更。

/** WordPress のためのデータベース名 */
define('DB_NAME', 'old_db');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'old_user');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'old_password');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースのキャラクターセット */
define('DB_CHARSET', 'utf8');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', '');

から

/** WordPress のためのデータベース名 */
define('DB_NAME', 'virsite1_db');

/** MySQL データベースのユーザー名 */
define('DB_USER', 'virsite1_db_user');

/** MySQL データベースのパスワード */
define('DB_PASSWORD', 'new_password');

/** MySQL のホスト名 */
define('DB_HOST', 'localhost');

/** データベースのテーブルを作成する際のデータベースのキャラクターセット */
define('DB_CHARSET', 'utf8mb4_0900_ai_ci');

/** データベースの照合順序 (ほとんどの場合変更する必要はありません) */
define('DB_COLLATE', 'utf8mb4_ja_0900_as_cs');

と変更。

# find /var/www/virsite1/web/ -type f -exec chmod 664 {} \;
# find /var/www/virsite1/web/ -type d -exec chmod 775 {} \;

して、

# wp search-replace --recurse-objects 'http://old.example.com' 'https://new.example.com'
+------------------+-----------------------+--------------+------+
| Table            | Column                | Replacements | Type |
+------------------+-----------------------+--------------+------+
| wp_commentmeta   | meta_key              | 0            | SQL  |
| wp_commentmeta   | meta_value            | 0            | SQL  |
| wp_comments      | comment_author        | 0            | SQL  |
| wp_comments      | comment_author_email  | 0            | SQL  |
| wp_comments      | comment_author_url    | 0            | SQL  |
| wp_comments      | comment_author_IP     | 0            | SQL  |
| wp_comments      | comment_content       | 0            | SQL  |
| wp_comments      | comment_approved      | 0            | SQL  |
| wp_comments      | comment_agent         | 0            | SQL  |
| wp_comments      | comment_type          | 0            | SQL  |
| wp_links         | link_url              | 0            | SQL  |
| wp_links         | link_name             | 0            | SQL  |
| wp_links         | link_image            | 0            | SQL  |
| wp_links         | link_target           | 0            | SQL  |
| wp_links         | link_description      | 0            | SQL  |
| wp_links         | link_visible          | 0            | SQL  |
| wp_links         | link_rel              | 0            | SQL  |
| wp_links         | link_notes            | 0            | SQL  |
| wp_links         | link_rss              | 0            | SQL  |
| wp_options       | option_name           | 0            | SQL  |
| wp_options       | option_value          | 16           | PHP  |
| wp_options       | autoload              | 0            | SQL  |
| wp_postmeta      | meta_key              | 0            | SQL  |
| wp_postmeta      | meta_value            | 17           | PHP  |
| wp_posts         | post_content          | 165          | SQL  |
| wp_posts         | post_title            | 0            | SQL  |
| wp_posts         | post_excerpt          | 0            | SQL  |
| wp_posts         | post_status           | 0            | SQL  |
| wp_posts         | comment_status        | 0            | SQL  |
| wp_posts         | ping_status           | 0            | SQL  |
| wp_posts         | post_password         | 0            | SQL  |
| wp_posts         | post_name             | 0            | SQL  |
| wp_posts         | to_ping               | 0            | SQL  |
| wp_posts         | pinged                | 0            | SQL  |
| wp_posts         | post_content_filtered | 15           | PHP  |
| wp_posts         | guid                  | 1986         | SQL  |
| wp_posts         | post_type             | 0            | SQL  |
| wp_posts         | post_mime_type        | 0            | SQL  |
| wp_term_taxonomy | taxonomy              | 0            | SQL  |
| wp_term_taxonomy | description           | 0            | SQL  |
| wp_termmeta      | meta_key              | 0            | SQL  |
| wp_termmeta      | meta_value            | 0            | SQL  |
| wp_terms         | name                  | 0            | SQL  |
| wp_terms         | slug                  | 0            | SQL  |
| wp_usermeta      | meta_key              | 0            | SQL  |
| wp_usermeta      | meta_value            | 0            | PHP  |
| wp_users         | user_login            | 0            | SQL  |
| wp_users         | user_nicename         | 0            | SQL  |
| wp_users         | user_email            | 0            | SQL  |
| wp_users         | user_url              | 0            | SQL  |
| wp_users         | user_activation_key   | 0            | SQL  |
| wp_users         | display_name          | 0            | SQL  |
+------------------+-----------------------+--------------+------+
Success: Made 2199 replacements.

でOK。

  • トップ、2ページ目、固定ページが表示されることを確認
  • ログイン正常
  • アップデート適用
  • 記事をアップ
  • メディアの追加・削除

以上のことができる
ことを確認。問題なさそうです。

参考

タグ: その他,システム設定周り

 



関連する記事一覧