家のラズパイでWordPressを動かしている方がいらっしゃったので、自分もやってみようかと。
↑にも書いたとおり、これができれば一ヶ月5USD(=550円くらい)の節約になります。
実際はラズパイの電気代があるので400円くらいかと思いますが、ラズパイはWordPressがなくても常時稼働しているので、考えないことにします。
システム構成
今のLightSailにおけるシステム構成はこちら。
予め用意されているbitnami wordpress multisiteをそのまま使っています。
狙っているラズパイでの構成はこれです。
最前面にリバースプロキシを配置し、必要に応じてもう一台のラズパイへ転送可能にします。
多段にしたことでパフォーマンスへの影響が気になりますが、後ほど検証しましょう。
reverse-proxyのdocker-compose
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)、コンテナ起動を監視して転送する、といった自分たちのやりたいことがほぼ揃っています。
今後安定した頃を見計らってSTAGE: ‘production’にしようと思います。
今後、このreverse-proxyもしくはWordPress側のnginxにキャッシュ機構を入れたいな、と。
ちなみに、yasufumi-yokoyama.gqではnextcloudを動かしています。
wordpress-containerのdocker-compose
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です。
ベンチマークサイトで比較するとわかりますが、この2CPUの差はかなり大きいです。
そのため、サクサク感に差が出るのも仕方ないかな、と。
一応パフォーマンスを比較してみました。
Chromeのデベロッパーツールに付いているLightHouseで。
まずDesktop。
なぜかラズパイの方がスコアが高いです。
ラズパイは家で動かしていて、通信がLANで完結しているため、速度的に有利なのか?
こちらはMobile。
やはりラズパイの方がスコアが高い。
ベンチマークの結果がちょっと解せないですが、、、まあ
ラズパイは家で動かしていて、通信がLANで完結しているため、速度的に有利なのか?
これによるものだと思うことにします。
終わりに
いかがでしたか。
今後は、ここにキャッシュサーバーを入れて速度向上を図ります!
Comments