Raspberry Pi 4をサーバ仕様にセットアップするの続きです。
Apache 2 + Wordpress + Let's Encrypt環境をRaspberry Pi 4にインストールします。
元々移行記事にしようと思ってましたが、私以外参考にならないので新規インストール記事として再度まとめます。
なお、Raspberry Pi 3の記事(Raspberry Pi 3でWordpress環境を構築してみる)も合わせてご参照ください。
下準備
Apache2のインストール
Apache2をインストールします。
$ sudo apt install apache2 apache2-dev
確かdevを入れておかないとmpm_preforkなどのMPMが入ってなかった気がするので入れておきます。
MySQLのインストール
お次はMySQLのサーバをインストールします。
$ sudo apt install mysql-sever
以前はインストール時にセットアップ画面出た気がしたけど今回は出ませんでした。
PHPのインストール
PHPに関してはビルドするのめんどくさかったのでPPAで入れました。
$ sudo apt -y install software-properties-common $ sudo add-apt-repository ppa:ondrej/php $ sudo apt update $ sudo apt install php7.4 php7.4-common php7.4-cli php7.4-fpm php7.4-mysql php7.4-dev php7.4-mbstring php7.4-zip php7.4-gd $ sudo apt install libapache2-mod-php7.4
(追記) 後から気がつきましたが、php7.4-gdを入れ忘れていて、これがないと画像のトリミングは行われません。
インストールした段階でApache 2側で有効化されたと思います。
されない場合は手動で有効化します。
$ sudo a2enmod php7.4 $ sudo apache2ctl restart
なお、PHPモジュール版はpreforkでのみ動作します。
workerやeventでApache 2が動作している場合はpreforkに変更しましょう。
# sudo a2dismod mpm_event # mpmの無効化 workerはmpm_worker
$ sudo a2enmod mpm_prefork
もしworkerやeventでPHPを使用したい場合はPHP-FPMを用います。
aonasuzutsuki.hatenablog.jp
また、どちらで動いているかの確認はコマンドでできます。
$ sudo apache2ctl -V Server version: Server built: 2019-08-14T14:36:32 Server's Module Magic Number: 20120211:88 Server loaded: APR 1.6.5, APR-UTIL 1.6.1 Compiled using: APR 1.6.5, APR-UTIL 1.6.1 Architecture: 64-bit Server MPM: prefork threaded: no forked: yes (variable process count) Server compiled with.... ...
なお、PPAは公式に承認されたものではないので気になる方は自分でビルドしましょう。
aonasuzutsuki.hatenablog.jp
Let's Encryptのインストール
Let's Encryptのインストールです。
$ sudo apt install certbot
認証局で証明書取ってる場合は不要です。
なお、Apache2の自動構成する場合はpython-certbot-apacheもインストールします。
$ sudo apt install python-certbot-apache
Apache2のセットアップ
Apache2モジュール有効化
必要となるであろうモジュールを有効化しておきます。
$ sudo a2enmod rewrite ssl
# $ sudo a2enmod proxy
当方の環境ではこれらを有効化しましたが、用途やWordpressプラグインなどによって異なるので臨機応変に。
ちなみに、rewriteはパーマリンク使う場合に、sslはHTTPS使う場合に必須です。
ProxyはWordpressだけなら多分いらないです。
.htaccessの有効化
次に.htaccessを有効化します。
また、同時にIndexes(ファイル一覧が表示されるやつ)を無効化します。
なお、WordpressではFollowSymLinksも切るとForbiddenエラーになります。
「/etc/apache2/apache2.conf」を開けて以下の項目を編集しましょう。
確か164行目くらいにあったと思います。
$ sudo nano /etc/apache2/apache2.conf <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> ↓↓↓↓↓↓ <Directory /var/www/> Options FollowSymLinks AllowOverride All Require all granted </Directory>
Apache2のSSL対応
Let's Encryptを用いてSSL対応を行います。
独自ドメインを取っていてかつそのドメインで80番ポートにアクセスできないと取得できないのでご注意ください。
Apache2の自動構成も同時にする場合は以下のコマンドで。
$ sudo certbot --apache
指示通りに進めると「/etc/apache2/sites-available/000-default-le-ssl.conf」が自動生成されます。
また、HTTPからリダイレクトするように設定した場合は000-default.confにリダイレクトの設定が加えられるはずです。
特に必要でなければ追加でコンフィグファイルをいじる必要はないはず。
今回は移行から入ったのでcertonly(証明書だけ取得)を用いて手動で設定してみます。
なお、ドメインはsample.comになっていますが、お持ちのドメインに直して実行しましょう。
バーチャルホストなどでwww.sample.comなどにしている場合はこっちを指定します。
両方使う場合は-dオプションで二つとも指定します。
$ sudo certbot certonly --webroot -w /var/www/html/ -d sample.com
2つバージョン
$ sudo certbot certonly --webroot -w /var/www/html/ -d sample.com -d www.sample.com
するとメールアドレスなど聞かれるので都度回答します。
問題なければ証明書が取得され、「/etc/letsencrypt/live/sample.com」に「cert.pem」「chain.pem」「fullchain.pem」「privkey.pem」の4つのシンボリックリンクが生成されます。
次にssl用のconfファイルを作成します。
今回は000-default.confをベースにちょくちょく書き換えつつ証明書情報を追加していきます。
$ sudo cd /etc/apache2/sites-available $ sudo cp 000-default.conf 000-default-ssl.conf $ nano 000-default-ssl.conf <IfModule mod_ssl.c> <VirtualHost *:443> ... SSLEngine on SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem </VirtualHost> </IfModule>
Apache 2.4.8以降はcert.pemやchain.pem別々ではなく、これらが統合されたfullchain.pemを指定します。
それ以前はそれぞれ指定する必要がありますが、ここでは述べません。
次に、必須ではありませんが000-default.confをいじってHTTPをHTTPSにリダイレクトします。
<VirtualHost *:80> ... RewriteEngine on RewriteCond %{SERVER_NAME} =example.com RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,QSA,R=permanent] </VirtualHost>
これでHTTPがHTTPSへ強制的にリダイレクトされるはずです。
ちなみにこれを使う場合はmod_rewriteが必要なのでモジュールの項目をご覧ください。
最近のブラウザはHTTPS以外警告出すようになってきましたし、HTTPS対応させたのであればリダイレクトなりでHTTPを完全に使わないようにしてもいいかなと。
なお、バーチャルホストで複数運用する場合は.htaccess使ったほうが楽かも。
最後にApache2を再起動してエラーが出なければOK
$ sudo apache2ctl restart
接続確認
最後にブラウザ側で接続確認をします。
なお、ローカルネットワークからアクセスする場合はドメインが使えないのでhostsにローカルIPとドメインの対応値を追加しましょう。
Windowsは「C:\Windows\drivers\etc\hosts」を管理者権限でメモ帳か何かで編集します。
スマホなどがある場合はWi-Fi切ってLTEなどでローカルネットワークから外せばOKです。
... 192.168.1.87 example.com
その後ブラウザにて「http://example.com」にアクセスします。
すると繋がれば自動でhttpsにリダイレクトされるはずです。
追加でみとくと良いのはphpinfo();とそこにあるMySQLの項目です。
これらが正しく動作し、MySQLの項目もあればWordpressは問題なく動くはずです。
MySQLのセットアップ
デフォルトの文字コードを変更
MySQLではデフォルト文字コードがLatin-1になっています。
対してWordpressではUTF-8を使用するため、日本語などのマルチバイト文字で文字化けを起こす恐れがあります。
そこでMySQLの文字コードをUTF-8に変更します。
「/etc/mysql/conf.d/mysql.cnf」を開き、以下の文字コードプロパティを追加します。
$ sudo nano /etc/mysql/conf.d/mysql.cnf [mysqld] character-set-server=utf8 [mysqldump] default-character-set=utf8 [mysql] default-character-set=utf8
なお、執筆当時のバージョンではコンフィグが細分化されているのでここに記述するのが最適なのかどうかは不明。
気がついたら「/etc/mysql/my.cnf」ができてたので一度起動したりして出てきたらここに記述してもいいかも。
あとはMySQLを再起動すると文字コードが変わっているはず。
$ sudo /etc/init.d/mysql restart
ちなみに、文字コードの確認はMySQL上にて「status;」で行います。
$ sudo mysql -u root -p mysql> status; -------------- ... Server characterset: utf8 Db characterset: utf8 Client characterset: utf8 Conn. characterset: utf8 ... --------------
データベースの作成
引き続いてMySQL上にてデータベースを作成します。
データベースの作成には「CREATE DATABASE構文」を用います。
mysql> create database db_wordpress;
データベースの一覧は「SHOW DATABASES構文」で確認できます。
mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | | db_wordpress | +--------------------+ 5 rows in set (0.02 sec)
アカウントの作成
続いてアカウントの作成を行います。
MySQL 8.0から権限付与とアカウント作成を同時にできなくなったので別々に処理します。
まずはアカウント作成から。
アカウント作成には「CREATE USER構文」を用います。
mysql> CREATE USER wordpress@localhost IDENTIFIED BY 'password';
今回はアカウント名はwordpressに、パスワードはpasswordです。
もちろんこの辺りは適当に変更してくださいね。
最後に念のためアカウント一覧を確認します。
アカウントの確認は「SELECT構文」を用います。
mysql> select host, user from mysql.user; +-----------+------------------+ | host | user | +-----------+------------------+ | localhost | debian-sys-maint | | localhost | mysql.session | | localhost | mysql.sys | | localhost | root | | localhost | wordpress | +-----------+------------------+ 5 rows in set (0.01 sec)
アカウントへ権限付与
続いて権限を付与します。
権限付与には「GRANT構文」を用います。
mysql> GRANT ALL PRIVILEGES ON db_wordpress.* TO wordpress@localhost;
今回はdb_wordpressに対して全権限を付与しました。
もし権限設定をミスった場合は「REVOKE構文」で取り除けます。
また、権限の確認は「SHOW GRANTS構文」を用います。
mysql> show grants for wordpress@localhost; +------------------------------------------------------------------+ | Grants for wordpress@localhost | +------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'wordpress'@'localhost' WITH GRANT OPTION | | GRANT ALL PRIVILEGES ON `db_wordpress`.* TO 'wordpress'@'localhost' | +------------------------------------------------------------------+
問題なければMySQLとの接続を終了します。
mysql> quit
Bye
Wordpressのセットアップ
Wordpressのダウンロードと展開
公式ページより.tar.gzのWordpress本体をダウンロードします。
$ cd ~/Downloads $ wget https://ja.wordpress.org/wordpress-5.3.2-ja.tar.gz # 最新版は https://ja.wordpress.org/latest-ja.tar.gz $ tar -zxvf wordpress-5.3.2.tar.gz -C /var/www/html
ダウンロードできたら中身を「/var/www/html」にぶちまければOK。
確かデフォルトでwordpressディレクトリが展開されるはずなので必要であれば名前の変更をしましょう。
wp-config.phpの設置
続いてwp-config.phpを設置します。
サンプルがあるのでそれをコピーし、中身を編集します。
$ cd /var/www/html/wordpress
$ cp wp-config-sample.php wp-config.php
まずはデータベースに関するところから。
$ nano wp-config.php ... // ** MySQL 設定 - この情報はホスティング先から入手してください。 ** // /** WordPress のためのデータベース名 */ define('DB_NAME', 'db_wordpress'); /** MySQL データベースのユーザー名 */ define('DB_USER', 'wordpress'); /** MySQL データベースのパスワード */ define('DB_PASSWORD', 'パスワード'); /** MySQL のホスト名 */ define('DB_HOST', 'localhost'); /** データベースのテーブルを作成する際のデータベースの文字セット */ define('DB_CHARSET', 'utf8'); /** データベースの照合順序 (ほとんどの場合変更する必要はありません) */ define('DB_COLLATE', ''); ...
MySQL上で作成した通りに編集します。
続いて同じファイル上にある認証用ユニークキーを書き換えます。
なお、ユニークキーは公式ページにて自動生成できるので自動生成したやつをコピペしちゃいましょう。
以下のやつは例なのでコピペするのは推奨しません。
... define('AUTH_KEY', '_v+Y! dN*&wTEhed$5~h^h$5RdPFlr.D~|__zRi`gESbtL>g1Ktc(H;07Rc>o=}r'); define('SECURE_AUTH_KEY', 'L2}`Ta*|R0G&]=5Mr?Iv6/R@K;mm9D2lnl[Z?0p<WdS+d^JI)y[a=94FyU;@@(so'); define('LOGGED_IN_KEY', 'hZOK=BP^ug[[?W]Iz+p>9FPpY:qQgR@ #PQcDb-lG*cC+vpi0ymJuYNfc>?8T7U,'); define('NONCE_KEY', 'o5dgd(B/!~vv(z:YDy{,%8Wp:(d0j]yw-2gG=zE8@_||T$Q&y~%EPZCsj|2qK.7E'); define('AUTH_SALT', 'il/G4fk6o*yi|Rb-)h<F[eZ!yFgieDb&fz9DoTO$c>$(o[UqE7/Nkg+5KDg ZbU('); define('SECURE_AUTH_SALT', 'd3}#r~}&o4nbYte3DR{XUux&q6-q A|F`X>qn&8S*s+]z/V~|%yi5] R+4}>{.O '); define('LOGGED_IN_SALT', 's|E.{4z{6D&xxW_[[TZXt+^${WLPS6]}-NE5AXE-*+3SP9Qzv7v4h6V9reu@?HQD'); define('NONCE_SALT', 'K6S*0m}BD)&twGdrYxpCe>F1AHqF&|t*2_Q<EA?sU*)zuuD~^%-z$ q>m>C1{m>$'); ...
あとはブラウザ上にて「https://example.com/wordpress」にアクセスしてユーザ作成画面の後エラーもなく管理画面が出たらOK。
アップデートを直接書き込む
Wordpressでは管理画面から更新などができますが、デフォルトではFTPの設定が求められます。
FTPは使わないのでWordpressのためだけに設定はしたくありません。
そこでWordpressが直接書き換えできるように設定を変更します。
まずはwp-config.phpにその旨を追記します。
$ nano wp-config.php ... define('FS_METHOD','direct');
つづいてWordpressの権限をApache2と合わせます。
$ sudo chown -R www-data:www-data /var/www/html/wordpress
すると管理画面の更新でFTPの設定画面はでなくなり、Wordpressだけで更新などが行えるようになります。
ただし、独自テーマを用いている場合絡みでSFTPなどでいじいじする際は権限周りがややこしくなるのでそこだけは要注意ですね。
Raspberry Pi 3とのパフォーマンス差について
パフォーマンスを詳細に計測したわけではありませんし、そもそも2.1Aと電力不足の状態で運用していたので正確なものではありませんが、体感のお話を少しだけ。
メモリ
まずはメモリです。
Raspberry Pi 3では前回の記事で述べたと思いますが、Ubuntu Mateを用いていましたが、デスクトップは真っ先に潰します。
その後不要なサービスを潰して1GBしかないメモリを少しでもサーバプロセスに割り振れるようにしていました。
Apache2のプロセスも減らし、過負荷の際もメモリが圧迫されないように慎重にメモリ管理していました。
Java版Minecraftのサーバなんてメモリ不足で動かなかったですよ。
ワールド生成も長かったし。
また、Wordpressを運用していましたが、キャッシュシステムがないと見てられないくらい遅くて更新作業は常にストレスマックスでした。
もちろん電力を2.5Aしっかりと供給していればもっとましだったかもしれないのは言うまでもないですが。
しかしながら、Raspberry Pi 4からは4GBもあるのでデスクトップはむしろ後からインストールしたほどですし、不要なサービスも放ったらかしです。
Minecraftのサーバも4GBもあれば余裕で動きます。
大人数はわからないですが、少数であればラグもなかったのでこれは運用できそう。
メモリの余裕は心の余裕ですね。
CPU
CPUに関しても数値上ではそこまで上がったように見えませんが、体感ではかなり高速化しました。
Wordpressではキャッシュシステムなしでもストレスを感じないほど高速に表示してくれるので更新作業でイライラすることはなくなりました。
Minecraftのサーバについてもワールド生成を結構な速さで終えてくれました。
CPUの性能もかなり向上しているのでなおのこと個人サーバ用途としては十分運用できますね。
ただ、デスクトップPCとして使うには所々プチフリはするし、メモリは4GBだとすぐ底を突くので全体的にも難があります。
あくまでPC寄りのマイコンだしそこまで求めるものではないのでしょうけどね。