はじめに
CentOS 6のサポート終了に伴い、CentOS 8へwordpressで構成されたホームページを移行した際の手順です。
対象者
・ドメインの変更なしでホームページを移行したい方
・移行元がAll-in-one WP migrationが使えるPHP、Wordpressバージョンになっている方
・nginxを他サービスで利用しており、Apacheと共存させたい方
・DNS変更後にSSL設定を行うため、そのときにダウンタイムがあっても良いという方
webサーバのインスト―ル
以下の記事においてnginxをインストールし、80番ポートを開放している。今回はこれをリバースプロキシとして利用し、ファイル構成はApacheの方で行う。
[root ~]# dnf install nginx [root ~]# systemctl start nginx && systemctl enable $_
Apacheをインストールする。
[root ~]# dnf install httpd [root ~]# httpd -v Server version: Apache/2.4.37 (centos)
nginxとapacheの設定ファイルを変更する。
[root ~]# vi /etc/nginx/conf.d/reverse_proxy.conf
server { listen 80; server_name <独自ドメイン>; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ^~ /.well-known/acme-challenge { default_type "text/plain"; root /var/www/html; } }
server_nameの部分は、そのリンクを入れるとwebサーバにより構築されたページにアクセスできることを示す。
しかし、ドメイン変更なしで移行する場合は、当然ながら移行後のサーバーに対して名前解決されていないため、ページの動作を確認するためにはHostsファイルの書き換えが必要となる。
Apacheの設定ファイルは、以下の二か所を書き換える。
[root ~]# vi /etc/httpd/conf/httpd.conf #Listen 80 Listen 8080 <Directory "/var/www/html"> #AllowOverride None AllowOverride All </Directory>
nginxの設定ファイルで、「80番ポートでアクセスされたら8080番ポートに転送する」としたので、Apacheは8080番ポートで待機する。
最後に80番ポートを開放する。
[root ~]# firewall-cmd --permanent --add-service={http,https} && firewall-cmd --reload
Hostsファイル
先述の通り、移行先のサーバに対して名前解決されていない独自ドメインでの動作確認のために必要となる。
Windows10では以下の手順で行う。
1.左下のスタートを開く
2.アプリ一覧の中から「Windows アクセサリ」を選択
3.「メモ帳」を右クリックし、「その他」→「管理者として実行」
4.メモ帳のファイルタブから「開く」を選択し、「C:\Windows\System32\drivers\etc」と入力
5.ファイルの種類を、「テキスト文書」から「すべてのファイル」に変更すると「hosts」が表示される
6.「hosts」を選択し、最終行に以下を追記
<サーバのIPアドレス> <独自ドメイン>
例: xxx.xxx.xx.xxx kyohju.com
7.上書き保存
以上の手順により、独自ドメインからApacheのテストページが表示されればよい。
PHPのインストール
[root ~]# dnf install php php-mbstring php-xml php-xmlrpc php-gd php-pdo php-mysqlnd php-json [root ~]# php -v PHP 7.2.24
このタイミングでapacheを起動する。もしすでに起動している場合は、下のコマンドで再起動する必要がある。
[root ~]# systemctl start httpd ##すでに起動している場合 [root ~]# systemctl restart httpd
Mysqlのインストール
MysqlとPostgresqlでは使用するポートが異なるので、併用できる。
[root ~]# dnf install @mysql:8.0 [root ~]# mysql --version mysql Ver 8.0.17 for Linux on x86_64 (Source distribution) [root ~]# systemctl start mysqld && systemctl enable $_
[root ~]# mysql_secure_installation
このコマンドによりmysqlの初期設定を行うことができる。yes/noの質問には基本的に「y」で答えればよい。パスワードの設定は、強度を0から2までで指定でき、それぞれの強度に応じて設定できるパスワードが異なる。
データベースの作成
以下の操作によりDBユーザ「wordpress」を作成できる。
[root ~]# mysql -u root -p Enter password:<先ほど設定したパスワード> mysql> CREATE USER 'wordpress'@'localhost' IDENTIFIED BY '<DBユーザ用のパスワード>'; mysql> GRANT ALL ON *.* TO 'wordpress'@'localhost' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES;
ここからはDBユーザに切り替える。
mysql> exit Bye [root ~]# mysql -u wordpress -p mysql> CREATE DATABASE wordpress;
これによりデータベース「wordpress」が作成された。
WordPressのインストール
ここからは、ApacheのドキュメントルートにWordpressをインストールしていく。
[root ~]# cd /var/www/html [root html]# curl -O https://ja.wordpress.org/latest-ja.tar.gz [root html]# tar xvf latest-ja.tar.gz [root html]# mv wordpress wp [root html]# chown -R apache:apache wp [root html]# rm -f latest-ja.tar.gz
以上の操作により、wordpressがドキュメントルート内のwpフォルダに構成された。
ここでhttp://<IPアドレス>/wp/にアクセスすると、Wordpressのインストール画面が現れる。
「データベース名」「ユーザー名」「パスワード」には、先ほどMysqlの設定の際に作成したものを入れる。それ以外は適当でいい(All-in-one WP migrationを使用すると移行元の設定が基本的には引き継がれるため)。
つまり、移行後は管理画面に、移行前の管理ユーザーおよびパスワードでログインすることになる。
WordPressページをドメイン直下に移動
先ほどWordpressをwpディレクトリにインストールしたので、このままでは「http://<独自ドメイン>/wp/<記事のURL>」といった形になるので、これを「http://<独自ドメイン>/<記事のURL>となるように直していく。
ちなみに、最初からルートディレクトリ直下にWordpressをインストールするとその手間を省けるが、SEO的にルートディレクトリ直下に配置するファイルは少ない方がいいらしく、多くのサイトでサブディレクトリ以下にWordpressをインストールする方法を採用している。
[root html]# cp wp/index.php index.php [root html]# cp wp/.htaccess .htaccess [root html]# vi index.php #require(‘./wp-blog-header.php’); require(‘./wp/wp-blog-header.php’);
[root html]# vi .htaccess # BEGIN WordPress # "BEGIN WordPress" から "END WordPress" までのディレクティブ (行) は # 動的に生成され、WordPress フィルターによってのみ修正が可能です。 # これらのマーカー間にあるディレクティブへのいかなる変更も上書きされてしまいます 。 <IfModule mod_rewrite.c> RewriteEngine On #RewriteBase /wp/ RewriteBase / RewriteRule ^index\.php$ - [L] RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d #RewriteRule . /wp/index.php [L] RewriteRule . /index.php [L] </IfModule> # END WordPress
.htaccess、index.phpともに、コピー後に一部を書き換える。
最後にWordpressでの設定を行う。「設定」タブから「一般」を表示すると、以下のようになっている。
WordPressアドレス(URL) http://独自ドメイン/wp
サイトアドレス(URL)http://独自ドメイン/wp
このうち、「サイトアドレス」の方を、以下のように変更する。
WordPressアドレス(URL) http://独自ドメイン/wp
サイトアドレス(URL)http://独自ドメイン/
「変更を保存」を押して設定を反映する。
パーマリンクの設定
以上の操作により、パーマリンクが初期化されてしまうため、このままでは記事を開くと404エラーになってしまう。
「設定」タブから「パーマリンク設定」を開き、元のサイトのリンクの形に合うパーマリンクを設定する。
このサイトであれば以下のような設定となっている。
「カスタム構造」http://<独自ドメイン>/article/%postname%.html
プラグインの導入
All-in-one WP migrationを「プラグイン」タブの「新規追加」から検索して、移行元のサイト、移行先のサイトに入れる。両方での操作をここから簡単に説明していくが、説明の都合上、Hostsファイルの書き換えなどは省略する。
①移転元
「All-in-One WP Migration」タブから「エクスポート」を選択する。別のプラグインを導入することでインポート可能サイズを512MBまで増やすことができるため、その制限を超えていない場合は「高度な設定」で設定する必要はない。
超えている場合、画像をエクスポートせず、後でFTPソフトを利用して移動する方法を紹介するため、「高度な設定」で「メディアライブラリをエクスポートしない」にチェックを入れる。それでも超える場合は有料版を使用するか、プラグイン不使用の手順となる。
②移転先
「All-in-One WP Migration」タブから「インポート」を選択する。
先ほどエクスポートしてダウンロードしたサイズが、最大容量に足りない場合は、以下の手順でプラグインを導入する。
1.https://import.wp-migration.com/ から「Basic」をダウンロードする。
2.「プラグイン」タブから「新規追加」を選択し、「プラグインのアップロード」から、1.でダウンロードしたファイルを参照する。
3.再び「All-in-One WP Migration」の「インポート」を確認すると、最大容量が512MBになっている。
インポート方法は、エクスポートしたデータを「ドラッグ&ドロップ」するだけである。ファイルを参照することもできる。
画像データの移行
画像はwordpressディレクトリ内のwp-content/uploadsに入っている。これを、移転後サーバの対応するフォルダに入れればよい。今回の設定では、/var/www/html/wp/wp-content/uploads/である。
uploadsフォルダごとダウンロードし、/var/www/html/wp/wp-content/にアップロードすると分かりやすい。
なお、権限の関係でアップロード(上書き)できない場合は、以下のコマンドで対応する。
[root ~]# chmod -R 777 /var/www/html/wp/wp-content/uploads
アップロード後は必ず権限を修正すること。
[root ~]# chmod -R 775 /var/www/html/wp/wp-content/uploads
DNSの変更
契約しているVPSに変更がない場合は、VPS上で、ドメインのゾーン編集においてIPアドレスを移転元のものから移転先のものに変更すればよい。
変更前には最小TTLが3600などの数字(秒数を表す)になっているが、それを60に変更することで、DNSの変更が反映されやすくなる。DNS変更が完了したら、元の数字に戻しておく。
VPSに変更がある場合は、ネームサーバの変更も行う必要がある。
DNS変更後、Windowsのコマンドプロンプトなどでnslookup <ドメイン名> を実行し、移転後のサーバのIPアドレスが表示されることを確認する。
SSL証明書の導入
DNSの変更が完了したら、速やかにSSL証明書を導入する。すでにドメインは移転先のサーバに対して名前解決されているため、以下のコマンドでSSL証明書が導入できる。
[root ~]# certbot-auto certonly --webroot -d kyohju.com
kyohju.comの部分にドメイン名を入れることで、その名前に対応したフォルダが作られる。
最後にhttps転送の設定をnginxで行う。
先ほど設定したreverse_proxy.confの中身を以下のように書き換える。
[root ~]# vi /etc/nginx/conf.d/reverse_proxy.conf
server { listen 80; server_name <独自ドメイン>; location / { proxy_pass http://127.0.0.1:8080; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-Server $host; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ^~ /.well-known/acme-challenge { default_type "text/plain"; root /var/www/html; } return 301 https://<独自ドメイン>$request_uri; }
server { listen 443 ssl; server_name kyohju.com; ssl on; ssl_certificate /etc/letsencrypt/live/kyohju.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/kyohju.com/privkey.pem; ssl_protocols TLSv1 TLSv1.1 TLSV1.2; ssl_ciphers HIGH:!aNULL:!MD5; ssl_prefer_server_ciphers on; ssl_session_cache shared:SSL:10m; ssl_session_timeout 10m; client_max_body_size 20M; location / { proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-Proto https; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_pass http://127.0.0.1:8080; proxy_redirect off; } }
以上の設定が完了したら、nginxを再起動させて設定を反映させる。
[root ~]# systemctl restart nginx
まとめ
WordPressのインストールだけでなく、各記事のリンクが移転前のものと一致しているかの確認をした上で、満を持してDNS変更に移ろう。