Raspberry Pi 4(以下「raspi」)に LAMP 環境を整え、WordPress でブログサイトを立ち上げた。情報共有と復旧時の備えとして投稿する。誤記・誤認があったらご指摘ください。
OS のインストール
基本的にはこの記事に従って作業した。ただし、今回は raspi を web サーバーとしてのみ稼働させるのと、環境設定は全て Windows マシンから ssh を用いて行うので OS は Raspberry Pi OS (64-bit) Lite を選択した。また、モニターとの接続は無用なので「... OS customization setting ?」は「YES」を選択して必要事項を入力した。
ONU の設定
raspi に microSD をアタッチして初回の起動した後 DHCP が割り振る IP アドレス(ここでは「192.168.1.5」とする)に対して次の設定を行った。
- IP アドレスの固定
- 80/tcp と 443/tcp の解放
SSH の設定
著者の備忘録に従って鍵交換認証の設定を行った。
% cd C:\Users\usr-win\.ssh
% ssh-keygen -R 192.168.1.5
% scp ir_rsa.pub usr-rp@192.168.1.5:/home/usr-rp
% ssh usr-rp@192.168.1.5
$ mkdir .ssh
$ touch .ssh/authorized_keys
$ chmod 700 .ssh
$ chmod 600 .ssh/authorized_keys
$ cat id_rsa.pub >> .ssh/authorized_keys
$ rm id_rsa.pub
同時に、これ以降は大半の作業を root 権限で行うことになるので以下を実行した。root のパスワードは後に MariaDB の初期設定時に必要になる。インストール作業が全て終了したら root によるログインは禁止しておく。
sudo su
passwd
cp -r /home/usr-x/.ssh/ /root/.ssh/
vi /etc/ssh/sshd_config # 「PermitRootLogin yes」に変更
systemctl restart sshd
vi /root/.bashrc # 末尾に「alias h='history'」を追加
apt update
apt -y upgrade
reboot
Windows マシンの ~\.ssh\config
に以下を追加する。
Host raspi
Hostname 192.168.1.5
User root
ForwardAgent yes
LAMP の設定
今回インストールした Raspberry Pi OS は Debian GNU/Linux (bookworm) なのでこの記事が非常に参考になった。
ここでは FQDN が www.example.com
、サーバー管理者のメールアドレスが admin@example.com
であるものとして記す。
なお、作業は VSCode Development を使うとコマンドの投入が本文のコピー・ペーストで済み、ファイルの編集にサーチボックスが使えるのでお勧めである。
Cerbot のインストール
「SSL 証明書を取得する (Let's Encrypt)」に従った。
apt -y install certbot
certbot certonly --webroot -w /var/www/html -d www.example.com
# 以下 3 行は certbot に対する応答
Enter email address -> admin@example.com
agree in order to register -> Y
share your email address with the Electronic Frontier Foundation -> Y
certbot certonly --standalone -d www.example.com
PHP のインストール
「PHP 8.2 : インストール」に従うとともに、wordpress.org が推奨しているモジュールをインストールする。
apt -y install php php-cgi libapache2-mod-php php-common php-pear php-mbstring
apt -y install php-fpm php-curl php-zip imagemagick php-imagick php-intl
MariaDB のインストール
「MariaDB 10.11 : インストール」に従った。
apt -y install mariadb-server
vi /etc/mysql/mariadb.conf.d/50-server.cnf
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
systemctl restart mariadb
mysql_secure_installation
# 以下 7 行は mysql_secure_installation に対する応答
Enter current password for root -> 最初にログインした時に設定したパスワード
Switch to unix_socket authentication [Y/n] -> n
Change the root password? [Y/n] -> n
Remove anonymous users? [Y/n] -> y
Disallow root login remotely? [Y/n] -> y
Remove test database and access to it? [Y/n] -> y
Reload privilege tables now? [Y/n] -> y
Apsche2 のインストール
インストール
apt -y install apache2 libapache2-mod-php libapache2-mod-security2
vi /etc/apache2/conf-enabled/security.conf
ServerTokens Prod
vi /etc/apache2/mods-enabled/dir.conf
DirectoryIndex index.html index.htm index.php
vi /etc/apache2/apache2.conf
70 行目に追加
ServerName www.example.com
vi /etc/apache2/sites-enabled/000-default.conf
ServerAdmin admin@example.com
systemctl reload apache2
web ブラウザで http://www.example.com
にアクセスして Apache2 Debian Default Page が表示されることを確認する。
SSL/TLS の設定
vi /etc/apache2/sites-available/default-ssl.conf
ServerAdmin admin@example.com
SSLCertificateFile /etc/letsencrypt/live/www.example.com/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/www.example.com/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/www.example/chain.pem
a2enmod ssl
systemctl restart apache2
web ブラウザで https://www.example.com
にアクセスして Apache2 Debian Default Page が表示されることを確認する。
PHP スクリプトを利用する
vi /etc/php/8.2/apache2/php.ini
date.timezone = "Asia/Tokyo"
systemctl reload apache2
echo '<?php phpinfo(); ?>' > /var/www/html/info.php
web ブラウザで https://www.example.com/info.php
にアクセスして PHP Version 8.2.7 が表示されることを確認する。
PHP + PHP-FPM の設定
vi /etc/apache2/sites-available/default-ssl.conf
<VirtualHost> - </VirtualHost> 内に追記
<FilesMatch \.php$>
SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
</VirtualHost>
vi /etc/php/8.2/fpm/pool.d/www.conf
最終行に追記
php_value[max_execution_time] = 600
php_value[memory_limit] = 2G
php_value[post_max_size] = 2G
php_value[upload_max_filesize] = 2G
php_value[max_input_time] = 600
php_value[max_input_vars] = 2000
php_value[date.timezone] = Asia/Tokyo
vi /etc/apache2/apache2.conf
<Directory /var/www/>
Options Indexes FollowSymLinks
# AllowOverride None
AllowOverride All
Require all granted
</Directory>
a2enmod proxy_fcgi setenvif rewrite
a2enconf php8.2-fpm
systemctl restart php8.2-fpm apache2
web ブラウザで https://www.example.com/info.php
にアクセスして [FPM/FastCGI] が表示されることを確認する。
mod_security の設定
cp -p /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
systemctl reload apache2
web ブラウザで https://www.example.com/?q=<script
にアクセスして Not Acceptable が表示されることを確認する。
WordPress のインストール
「Apache2 : ブログシステム : WordPress」に従った。ただし作業済の工程はスキップし、インストール先は /var/www/html
に変更した。
wget https://ja.wordpress.org/latest-ja.tar.gz
tar zxvf /root/latest-ja.tar.gz -C /var/www/html
rm /root/latest-ja.tar.gz
chown -R www-data /var/www/html/wordpress
touch /etc/apache2/conf-available/wordpress.conf
vi /etc/apache2/conf-available/wordpress.conf
Timeout 600
ProxyTimeout 600
Alias /wordpress "/var/www/wordpress/"
DirectoryIndex index.php index.html index.htm
<Directory "/var/www/wordpress">
Options FollowSymLinks
AllowOverride All
Require all granted
<FilesMatch \.(php|phar)$>
SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost/"
</FilesMatch>
</Directory>
a2enconf wordpress
systemctl restart apache2
mysql
mysql のプロンプトに対して以下の SQL 文を入力して wordpress データベースを作成する。
create database wordpress;
grant all privileges on wordpress.* to wordpress@'localhost' identified by 'password';
exit
web ブラウザで https://www.example.com/wordpress/wp-admin/setup-config.php
にアクセスしてインストールを進める。
先に設定した wordpress データベースのユーザー名は wordpress、データベースのパスワードは password である。
次回以降、上記のアカウントで https://www.example.com/wordpress/wp-login.php?wp_lang=ja
にログインするとダッシュボードが表示される。
以上が正常に動作することを確認のうえ FQDN で wordpress にリダイレクトするよう以下を実行する。
mv /var/www/html/index.html /var/www/html/index_.html
touch /var/www/html/.htaccess
vi /var/www/html/.htaccess
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{HTTP_HOST} ^(www.)?www.example.com$
RewriteCond %{REQUEST_URI} !^/wordpress/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ /wordpress/$1
RewriteCond %{HTTP_HOST} ^(www.)?www.example.com$
RewriteRule ^(/)?$ wordpress/index.php [L]
</IfModule>