wordpressをdocker, nginxでサーバー移行

Xserverでwordpressを動かしていたが,諸用でさくらVPSを別件でレンタルしたので,これを機会にXserverのwordpressも移行することにした.その備忘録的な位置づけ.

移行先の環境は,Cent OS7, Nginxでリクエストを処理している.
本記事では,wordpressをdockerで立ち上げる,nginxの記述,wordpressの移行,Let’s encryptを用いたSSL証明書の取得までを書く.
特徴としては,wordpressのdocker立ち上げ設定は,日本語の他の記事だと,dockerでnginxも立ち上げ,設定が煩雑になっていた.本記事では,docker外で動かしているnginxの適切な記述方法を述べている.
必要とする知識は,docker, docker-compose, nginxである.

Docker, docker-composeの設定

まず最初にDockerとdocker-composeを用いて,wordpressを走らせる環境を設定する.
以下はdocker-compose.ymlファイルの記述.あとは,docker-compose upの一コマンドで立ち上がる.ローカルで行う際は,localhost:8080でアクセス可能.
officialのwordpressのdockerの設定をほぼ踏襲している.トップレベルのvolumeでdatabaseとwordpressのデータの置き場所を指定している.こうすることで,docker-compose down -vを押したとしても,データが消えずにいてくれる.注意点としては,トップレベルのvolumesの記述には相対パスではなく絶対パスを使うことだ.

version: '3.1'

volumes:
  wordpress:
    driver_opts:
      type: none
      device: /home/user_name/wordpress/html
      o: bind
  db:
    driver_opts:
      type: none
      device: /home/user_name/wordpress/db_data
      o: bind

services:

  wordpress:
    image: wordpress
    restart: always
    ports:
      - 8080:80
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: exampleuser
      WORDPRESS_DB_PASSWORD: examplepass
      WORDPRESS_DB_NAME: exampledb
    volumes:
      - wordpress:/var/www/html
      - ./php.ini:/usr/local/etc/php/conf.d/php.ini

  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: exampledb
      MYSQL_USER: exampleuser
      MYSQL_PASSWORD: examplepass
      MYSQL_RANDOM_ROOT_PASSWORD: '1'
    volumes:
      - db:/var/lib/mysql

また上記ファイルで設定されているphp.iniは以下の設定に.設定しないとwordpress側のデフォルトのサイズ50MBしかアップロード出来なくなる.

upload_max_filesize = 500M
post_max_size = 500M

参考文献

– wordpress, docker official images
https://hub.docker.com/_/wordpress

Nginxの設定

dockerでwordpressを立ち上げた後は,host OS (僕の場合はcent OS7)上で動いているnginxの設定を行う.
設定ファイルは以下のように設定する.
特に,client_max_body_size 1G;は設定しないと,nginxの設定の問題で,後で行う移行用のファイルが上げられなくなる.
以下の設定はssl認証を取るまでのnginxの設定となる.

server {
    listen 80;
    server_name akitoshiblogsite.com;
    client_max_body_size 1G;
    proxy_buffers 64 16k;
    proxy_max_temp_file_size 1024m;
    proxy_temp_path nginx_proxy_temp;
    proxy_connect_timeout 5s;
    proxy_send_timeout 10s;
    proxy_read_timeout 10s;

    location / {
            root /home/user_name/wordpress;
            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-For proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $server_name;

    }
}

設定したら,nginx -tで問題がないか確認しservice nginx reloadで設定を更新する.
ここまででサーバーに上げたwordpressにアクセス出来るようになっているはずだ.(ドメインは,元のものを入れ替えるか設定が完了するまで別ドメインを用いるか,サブドメインを用いるかなどしてください.)

参考文献

– 引っ越しました(WordPress + Docker)
https://blog.nagatech.work/post/diary/690
– WordPressサイトはどうやって引っ越しする?移行方法を解説
https://ferret-plus.com/14639
– Point an NGINX Reverse Proxy to WordPress Running on Docker
https://www.youtube.com/watch?v=SLejN0yC8sM

All-in-One WP Migration

wordpressにアクセスすると,wordpressのインストールをするかどうか求められるので適当に入力する.
wordpressの移行には今回All-in-One WP Migrationを用いた.
プラグインをダウンロードして,移行前のwordpressからデータをexport,移行後のwordpressにもpluginを入れて,exportしたデータをimportすると良い.

phpやmysqlのバージョンを揃えた方が安全.だが,僕は何も調整せずに上記で設定したdockerに対してローカルで試しに移行してみると,綺麗にサイトが全て移っていたので,何も調整せずに本番環境でも移行した.wordpressのバージョンが上がった影響で編集画面などは変わったがサイトの閲覧に関して問題が出てきている部分はいまのところない.

ただ,次項のssl証明書の設定を行わないと,以前のwordpressでurlにhttpsが付いている場合,アクセスが出来なくなるため,ssl証明書の取得を行わなければいけない.

Let’s encryptの設定

Let’s encryptは無料でssl証明書を発行してくれるサービス.さくらVPSはデフォルトでインストールしてくれるサービスを最近提供し始めた.が,僕はもう手遅れだったので自前でインストールして設定する.
インストールは公式サイトに準拠.cent OS7用のやり方を書く.

まずsnapdをインストールする.

 sudo yum install snapd
sudo systemctl enable --now snapd.socket
sudo ln -s /var/lib/snapd/snap /snap

次にcertbotのイントール

sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

これでcertbotが使えるようになった.

ここからは,なぜかcertbotがnginxを見つけてくれなかったので,手動でssl証明書の取得とnginxの設定を行う.

certbotの取得は,以下のコマンドで行う.今回は既に80番ポートでサイトにアクセス出来るようにしていること,また,dockerでhtmlへのvolumeを指定していることを考慮している.

sudo certbot certonly --webroot -w /home/user_name/wordpress/html -d akitoshiblogsite.com --email aaa@example.com

ssl証明書の作成に成功すると,Congulaturations!という表示とどこにファイルを作成したかについて設定が出てくるので,それを用いてnginxの設定を書き換える.

server {
    listen 443 ssl;
    ssl_certificate           /etc/letsencrypt/live/akitoshiblogsite.com/fullchain.pem;
    ssl_certificate_key       /etc/letsencrypt/live/akitoshiblogsite.com/privkey.pem;
    server_name akitoshiblogsite.com;
    client_max_body_size 1G;
    proxy_buffers 64 16k;
    proxy_max_temp_file_size 1024m;
    proxy_temp_path nginx_proxy_temp;
    proxy_connect_timeout 5s;
    proxy_send_timeout 10s;
    proxy_read_timeout 10s;

    location / {
            root /home/user_name/wordpress;
            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-For proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Host $server_name;
            proxy_set_header X-Forwarded-Proto https;
            proxy_set_header X-Forwarded-Port 443;
            proxy_set_header X-Secure on;

    }
}

server {
    listen 80;
    server_name akitoshiblogsite.com;
    return 301 https://akitoshiblogsite.com$request_uri;
}

書き換えた後に,nginxを再起動すれぱhttpsの接続が可能となる.

最後に,Let’s encryptのhttpsは3ヶ月で失効してしまうので,cronを設定する.sudo crontab -u root -eで設定ファイルを開いて,以下のコマンドを記入する.これは毎月第2火曜日の午前4時59分にLet’s encryptのファイルを更新するコマンドだ.

59 04 * * 2 certbot renew && service nginx reload

以上で設定終了! 移行が完了した.

参考文献

– Let’s Encrypt で Nginx にSSLを設定する
https://qiita.com/HeRo/items/f9eb8d8a08d4d5b63ee9
– CentOS7 の Nginx で Let’s Encrypt を使う
https://qiita.com/ekzemplaro/items/15bceed7c5612fe039d5
– certbot instructions
https://certbot.eff.org/lets-encrypt/centosrhel7-nginx
– Nginx Routing path to server
https://stackoverflow.com/questions/19108044/nginx-routing-path-to-server/19111103
– nginxのサブドメインでrailsの複数アプリを運用
https://mikamisan.hatenablog.com/entry/2016/07/10/113655
– 【入門】cron(クロン)設定・書き方の基本
https://www.kagoya.jp/howto/rentalserver/cron/


コメント

  1. けん より:

    コメント失礼します。
    Nginxのパーマリンク設定はどのようにされましたか。

    同様の環境で立ち上げており、デフォルトから切り替えた途端アクセスが難しくなってしまいました。
    アドバイスをいただけましたら幸いです。

タイトルとURLをコピーしました