【意外と】LightSailのWordPressをRaspberry Pi 4に移行【使える?】

AWS



家のラズパイでWordPressを動かしている方がいらっしゃったので、自分もやってみようかと。



↑にも書いたとおり、これができれば一ヶ月5USD(=550円くらい)の節約になります。

実際はラズパイの電気代があるので400円くらいかと思いますが、ラズパイはWordPressがなくても常時稼働しているので、考えないことにします。

システム構成

今のLightSailにおけるシステム構成はこちら。
予め用意されているbitnami wordpress multisiteをそのまま使っています。


狙っているラズパイでの構成はこれです。
最前面にリバースプロキシを配置し、必要に応じてもう一台のラズパイへ転送可能にします。
多段にしたことでパフォーマンスへの影響が気になりますが、後ほど検証しましょう。


reverse-proxyのdocker-compose

githubにアップしてあります。

GitHub - kurofuku/reverse-proxy
Contribute to kurofuku/reverse-proxy development by creating an account on GitHub.



中身はこれ。
シンプルな構成で。
ポート番号は8080と9080を使っていますが、使っていないポートならどれでもいいと思います。

version: '3.1'

services:

  https-portal:
    image: steveltn/https-portal:latest
    ports:
      - '80:80'
      - '443:443'
    environment:
      #STAGE: 'production'
      #FORCE_RENEW: 'true'
      DOMAINS: >-
       yasufumi-yokoyama.gq -> http://192.168.1.20:8080
       ,www.yasufumi-yokoyama.gq -> http://192.168.1.20:8080
       ,linuxfun.org -> http://192.168.1.20:9080
       ,www.linuxfun.org -> http://192.168.1.20:9080
      SERVER_NAMES_HASH_BUCKET_SIZE: 64
    volumes:
      - https-portal-data:/var/lib/https-portal

volumes:
  https-portal-data:



リバースプロキシはhttps-portalという便利なイメージを使いました。
HTTPS対応(Let’s Encrypt)、コンテナ起動を監視して転送する、といった自分たちのやりたいことがほぼ揃っています。

GitHub - SteveLTN/https-portal: A fully automated HTTPS server powered by Nginx, Let's Encrypt and Docker.
A fully automated HTTPS server powered by Nginx, Let's Encrypt and Docker. - GitHub - SteveLTN/https-portal: A fully aut...

今後安定した頃を見計らってSTAGE: ‘production’にしようと思います。



今後、このreverse-proxyもしくはWordPress側のnginxにキャッシュ機構を入れたいな、と。



ちなみに、yasufumi-yokoyama.gqではnextcloudを動かしています。



wordpress-containerのdocker-compose

githubにアップしてあります。

GitHub - kurofuku/wordpress-container
Contribute to kurofuku/wordpress-container development by creating an account on GitHub.



こちらはこんな感じ。
リバースプロキシがTCP9080で転送してくるので、それを待ち受けます。
HTTPS対応はリバースプロキシがやってくれているので、ここでは不要です。
 やってもいいけど、速度低下が予想されるので、やらない。

version: '3.1'

services:
  nginx:
   image: nginx:latest
   restart: always
   links:
    - wordpress
   ports: 
    - 9080:80
   volumes:
    - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    - ./nginx/conf.d:/etc/nginx/conf.d
    - ./html:/var/www/html
    
  wordpress:
   build:
    context: wordpress
   links:
    - db
   restart: always
   volumes:
    - ./html:/var/www/html

  db:
   image: jsurf/rpi-mariadb:latest
   restart: always
   environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_USER: wordpress
    MYSQL_PASSWORD: wordpress
    MYSQL_DATABASE: bitnami_wordpress
   volumes:
    - ./mysql:/var/lib/mysql



wordpressのDockerfileはこれ。
WordPressを動かすために必要な拡張を入れるのみです。

FROM            php:fpm-buster

RUN             \
                apt -y update && \
                apt -y install default-mysql-client && \
                docker-php-ext-install mysqli && docker-php-ext-enable mysqli && \
                echo "Build complete." 



LightSailからデータをバックアップする

バックアップすべきデータは、

・WordPressのWebコンテンツ(htmlやphp、画像とか)
・mysqlデータベース

です。

Web コンテンツのバックアップ

LightSailにログインして以下を実行します。
 ファイル名は適当に変えてください。

cd /opt/bitnami/apps/wordpress/htdocs/
sudo tar jcf wordpress.tar.bz2 .



インターネットで調べると

wp-contentのみバックアップすればいい

と書いてあるサイトが多く、自分もそれでやってみたのですが、
マルチサイトの設定などがうまく引き継がれませんでした。
そこで丸ごとバックアップすることにしました。

mysqlデータベースのバックアップ

こちらはLightSailにログインし、

mysqldump -u root --single-transaction -p bitnami_wordpress > bitnami_wordpress.linuxfun.org.sql

とします。
 ファイル名は適当に変えてください。

LightSailのWordPressではデータベース名がbitnami_wordpressなので、それを指定しています。

データベース名を指定しないとmysql(という名前のデータベース)など不要なものもバックアップしてしまい、復元がうまく行きませんでした。

ラズパイにデータを復元

先の手順で取得したWebコンテンツとデータベースのバックアップファイルをSCPなりSFTPなりでラズパイにコピーしておきます。

Webコンテンツの復元

まず解凍します。

cd html
sudo tar jxf wordpress.tar.bz2 .
sudo chown -R www-data:www-data .



wp-config.phpについて、LightSail固有の部分を修正します。

まずデータベース設定。
かいつまんでdiffっぽく書いています。

- define( 'DB_NAME', 'bitnami_wordpress' );
- define( 'DB_USER', 'bn_wordpress' );
- define( 'DB_PASSWORD', 'yourpassword' );
- define( 'DB_HOST', 'localhost:3306' );
+ define( 'DB_NAME', 'bitnami_wordpress' );
+ define( 'DB_USER', 'wordpress' );
+ define( 'DB_PASSWORD', 'wordpress' );
+ define( 'DB_HOST', 'db:3306' );



お次は混合コンテンツを避けるために以下を追記。

+ if (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
+         $_SERVER['HTTPS'] = 'on';
+ }

  /** Sets up WordPress vars and included files. */
  require_once ABSPATH . 'wp-settings.php';



bitnami固有のパスがあったので、修正。

- define('WP_TEMP_DIR', '/opt/bitnami/apps/wordpress/tmp');
+ define('WP_TEMP_DIR', '/tmp/wordpress');
// ↓はWP Super Cacheというプラグインの設定なので、プラグイン自体入れていなければ存在しない。
- define( 'WPCACHEHOME', '/opt/bitnami/apps/wordpress/htdocs/wp-content/plugins/wp-super-cache/' );
+ define( 'WPCACHEHOME', '/var/www/html/wp-content/plugins/wp-super-cache/' );



Webコンテンツの復元は以上です。

データベースの復元

こちらはコンテナに入ってmysqlコマンドを実行する必要があります。

sudo cp bitnami_wordpress.linuxfun.org.sql mysql
sudo docker-compose exec db /bin/bash

# 以降コンテナ内での作業
sed -i 's/utf8mb4_unicode_ci/utf8mb4_unicode_ci/g' /var/lib/mysql/bitnami_wordpress.linuxfun.org.sql
mysql -u root -p bitnami_wordpress < /var/lib/mysql/bitnami_wordpress.linuxfun.org.sql



mysqlからmariadbに移行した影響か、sedでcollationを直す必要がありました。

LightSailのmysqlはこう。

mysql --version
/opt/bitnami/mysql/bin/mysql.bin  Ver 8.0.20 for Linux on x86_64 (MySQL Community Server - GPL)

ラズパイのmariadbはこう。

mysql --version
mysql  Ver 15.1 Distrib 10.3.27-MariaDB, for debian-linux-gnueabihf (armv8l) using readline 5.2



データベースのレストアは以上です。

うまくいけば、これでトップ画面が見られるようになっていると思います。

比較

まず見た目。
当然ですが、全く同じです。
←LightSail ラズパイ→
ラズパイで「保護されていない通信」と警告が出ているのは、https-portalでproductionにしていないためです。



Chromebook上でポチポチ画面を操作した感じ、

LightSailはクリックしてから1秒から2秒で記事が表示される
ラズパイは記事が表示されるまでに3秒以上かかることもある

という結果に。

それも当然で、LightSailのCPUはXeon 2.40GHz。

cat /proc/cpuinfo 
(略)
model name      : Intel(R) Xeon(R) CPU E5-2676 v3 @ 2.40GHz



一方でラズパイのCPUはCortex-A72 1.5GHzです。

Raspberry Pi 4 Model B specifications – Raspberry Pi
Your tiny, dual-display, desktop computer …and robot brains, smart home hub, media centre, networked AI core, factory co...



ベンチマークサイトで比較するとわかりますが、この2CPUの差はかなり大きいです。
そのため、サクサク感に差が出るのも仕方ないかな、と。



一応パフォーマンスを比較してみました。
Chromeのデベロッパーツールに付いているLightHouseで。

まずDesktop。
なぜかラズパイの方がスコアが高いです。
ラズパイは家で動かしていて、通信がLANで完結しているため、速度的に有利なのか?



こちらはMobile。
やはりラズパイの方がスコアが高い。



ベンチマークの結果がちょっと解せないですが、、、まあ

ラズパイは家で動かしていて、通信がLANで完結しているため、速度的に有利なのか?

これによるものだと思うことにします。

終わりに

いかがでしたか。

今後は、ここにキャッシュサーバーを入れて速度向上を図ります!

Comments

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