Word Pressサイトをローカル環境にコピー
前回DockerでWord Pressをインストールしました。
簡単だという触れ込みでしたが、Docker初心者の筆者にはコンテナの扱いが難しかったので、そちらでの運用はもう少しDockerについての知識をつけてからにすることにし、以前作成したKVMを使ってインストールしなおすことにしました。
インストールが終わったら、Webサービスで設置済みのサイトからデータをコピーしてきて、クローン環境を作成してみたいと思います。
環境の作成
筆者の環境はDebian11(bullseye)、Apache、MariaDBです。PHPのバージョンは7.4です。
それらをまとめてインストールします。
$ su - ... # apt update ... # apt install mariadb-server apache2 php7.4 php7.4-mysql php7.4-mbstring ...
/etc/mysql/mariadb.conf.d/50-server.cnf内の設定で、character_set_serverがutf8mb4、collation-serverがutf8mb4_general_ciとなっていることを確認します。
mariaDBにWord Press用のデータベースと、ユーザー名を作成し、ユーザーにはパスワードを設定します。ここではデータベース名:wpdb、ユーザー名:wordpress、パスワード:wppassとしました。
Debianの管理者権限からmysql -u rootと入力すると、管理者としてMariaDBのコンソールに入れます。
# mysql -u root ... /* データベースの作成 */ MariaDb[(none)]> create database wpdb; ... /* ユーザーの作成 */ MariaDb[(none)]> create user wordpress; ... /* ユーザーに権限の付与とパスワード設定 */ MariaDb[(none)]> grant all privileges on wpdb.* to 'wordpress'@'localhost' identifined by 'wppass'; ... /* MariaDBのコンソール終了 */ MariaDb[(none)]> exit
環境のインストール
WORD PRESS.ORGのダウンロードページから、.tar.gzをダウンロードします。
ダウンロードが終わったら、展開します。
# wget https://ja.wordpress.org/latest-ja.tar.gz ... # tar vzxf latest-ja.tar.gz
wordpressディレクトリ内にあるwp-config-sample.phpを、wp-config.phpにコピーして、先ほど設定した値に編集します。サンプル中のコメントはWord Pressオリジナルのものです。また、下線部以外はデフォルト値です。
/** WordPress のためのデータベース名 */ define( 'DB_NAME', 'wpdb' ); /** MySQL データベースのユーザー名 */ define( 'DB_USER', 'wordpress' ); /** MySQL データベースのパスワード */ define( 'DB_PASSWORD', 'wppass' ); /** MySQL のホスト名 */ define( 'DB_HOST', 'localhost' ); /** データベースのテーブルを作成する際のデータベースの文字セット */ define( 'DB_CHARSET', 'utf8mb4' ); /** データベースの照合順序 (ほとんどの場合変更する必要はありません) */ define( 'DB_COLLATE', '' ); ...
wordpress以下のファイルすべてをWebルートに移動させます。
# mv wordpress/* /var/www/html
ブラウザからインストール用のページにアクセスします。ここでは「http://192.168.1.1/wp-admin/install.php」としてありますが、ルートディレクトリ以外に設置した場合はドメインとwp-adminの間に適切なパスを入力してください。
必要事項を入力すれば設定完了です。
クローン環境の作成
今度は稼働中のサイトからクローンを作ります。
コピー元とコピー先のPHPのバージョンの違いによって動かない可能性もあるので確認しておきます。
元となるサイトからWord Press用のファイルをすべてコピーしドメイン以下のディレクトリ構造が一致するように配置します。
ファイルの所有権と権限を修正します。おそらくapache環境ならなら所有権とグループをapacheユーザー(www-data)にするだけでいいと思います。権限がわからなかったらコピー元のサイトを参考にするといいと思います。
.htaccessを使用しているようなら、/etc/apache2/apache2.confのDirectoryのエントリーでAllowOverride Allを設定します。
apache2.conf
... <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory>
mod_rewrite等、デフォルトでは使用されていないモジュールがあるならコピー元に合わせて有効にします。
コピー元でシェルが利用できるなら、利用しているmodの一覧は、「apachectl -M」で表示されます。使えない場合は、.htaccessファイル等のmod_xxxエントリーをたよりに確認します。
# a2enmod rewrite ... # a2enmod ssl ... # a2ensite default-ssl ... # systemctl restart apache2 ...
次に、サイトのデータベース(MySQLかMariaDB)からデータベースのダンプ(エクスポート)をとります。
phpMyAdminが使えるならエクスポートを選択し、フォーマットを「SQL」を選択します。今回はどちらもutf8mb4で運用している前提なのでエンコーディングの変更はしません。
コピーしてきた、wp-config.phpを開いて利用しているユーザー名やパスワード、データベース名を確認します。
ユーザーやパスワードが違っていたら、コピー先のwp-config.phpを書き換えるか、設定に合うようにデータベースにユーザーを追加します。
ホスト名(DB_HOST)はlocalhostに変更します。
データベース名の部分は、もしすでに同じ名前のデータベースがコピー先にあったら、混在防止のために別の名前のデータベースを作ってデータをインポートし、wp-config.phpのデータベース名を新たなデータベース名にします。エクスポートしたデータはデータベース名を保持していませんのでどのデータベースにもインポートできます。
同名のデータベースが不要ならdrop databeseコマンドで一度削除して作り直す方法もあります。
# mysql -u root ... /* データベースの一覧出力 */ MariaDb[(none)]> create database wpdb; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | wpdb | +--------------------+ /* クローン用のDB作成 */ MariaDb[(none)]> create database wpdb2; /* MariaDBコンソールから抜ける */ MariaDb[(none)]> exit; OSのコンソールでインポートを実行します。ダンプしたファイルをdump.sqlとしています。 # mysql -u root wpdb2(インポート先のDB名) <dump.sql
最後に、Kinsta:「WordPressのURLを変更する方法(4つの簡単な手段)」を参考にして、データベース内のoptionsテーブル(xxxxxx_optionsとなっている場合もあります)にある、ホームページのドメインを変更します。
MariaDb[(none)]> update options set option_value='https://192.168.1.1/home/' where option_id=1; MariaDb[(none)]> update options set option_value='https://192.168.1.1/' where option_id=2;
筆者の環境ではmod_rewriteでのhttpからhttpsのリダイレクトがうまくいかず、「このページは動作していませんkrep.komart.jp でリダイレクトが繰り返し行われました。 Cookie を消去してみてください.ERR_TOO_MANY_REDIRECTS」というエラーが出ました。下記リダイレクトの設定中で、ENV:HTTPS環境変数にonの値がSSL通信でも入らないことが原因のようでした。
これをMRS:「SSL化によるリダイレクト処理の方法」を参考に、「RewriteCond %{HTTPS} off」という書き方に変えたところうまく機能するようになりました。
<IfModule mod_rewrite.c> RewriteEngine on RewriteCond %{REQUEST_URI} !^/info/wp-cron.php$ # RewriteCond %{ENV:HTTPS} !on # うまく動かない RewriteCond %{HTTPS} off RewriteRule .* https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L] </IfModule>
参考にさせていただいたサイトの皆様、ありがとうございました。