Raspberry Pi 4 でブログサイトを立ち上げた

&emsp;Raspberry Pi 4（以下「raspi」）に LAMP 環境を整え、WordPress でブログサイトを立ち上げた。情報共有と復旧時の備えとして投稿する。誤記・誤認があったらご指摘ください。

## OS のインストール

&emsp;基本的には[この記事](https://www.indoorcorgielec.com/resources/raspberry-pi/raspberry-pi-os%E3%81%AE%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB/)に従って作業した。ただし、今回は raspi を web サーバーとしてのみ稼働させるのと、環境設定は全て Windows マシンから ssh を用いて行うので OS は **Raspberry Pi OS (64-bit) Lite** を選択した。また、モニターとの接続は無用なので「... OS customization setting ?」は「YES」を選択して必要事項を入力した。

![](https://www.raspberrypi.com/documentation/computers/images/imager/os-customisation-prompt.png)
![](https://www.raspberrypi.com/documentation/computers/images/imager/os-customisation-general.png)
![](https://www.raspberrypi.com/documentation/computers/images/imager/os-customisation-services.png)
![](https://www.raspberrypi.com/documentation/computers/images/imager/os-customisation-options.png)

## ONU の設定

&emsp;raspi に microSD をアタッチして初回の起動した後 DHCP が割り振る IP アドレス（ここでは「192.168.1.5」とする）に対して次の設定を行った。

* IP アドレスの固定
* 80/tcp と 443/tcp の解放 

## SSH の設定

&emsp;[著者の備忘録](https://qiita.com/dan_yok/items/db9057541e4663390eb3)に従って鍵交換認証の設定を行った。

```shell
% 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
```

&emsp;同時に、これ以降は大半の作業を root 権限で行うことになるので以下を実行した。root のパスワードは後に MariaDB の初期設定時に必要になる。インストール作業が全て終了したら root によるログインは禁止しておく。

```shell
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
```

&emsp;Windows マシンの `~\.ssh\config` に以下を追加する。

```text
Host raspi
    Hostname 192.168.1.5 
    User root
    ForwardAgent yes
```

## LAMP の設定

&emsp;今回インストールした Raspberry Pi OS は Debian GNU/Linux (bookworm) なので[この記事](https://www.server-world.info/query?os=Debian_12&p=httpd&f=1)が非常に参考になった。</br>
&emsp;ここでは FQDN が `www.example.com`、サーバー管理者のメールアドレスが `admin@example.com` であるものとして記す。</br>
&emsp;なお、作業は VSCode Development を使うとコマンドの投入が本文のコピー・ペーストで済み、ファイルの編集にサーチボックスが使えるのでお勧めである。

### Cerbot のインストール

&emsp;「[SSL 証明書を取得する (Let's Encrypt)](https://www.server-world.info/query?os=Debian_12&p=ssl&f=2)」に従った。

```shell
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 : インストール](https://www.server-world.info/query?os=Debian_12&p=php&f=1)」に従うとともに、wordpress.org が推奨しているモジュールをインストールする。

```shell
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 のインストール

&emsp;「[MariaDB 10.11 : インストール](https://www.server-world.info/query?os=Debian_12&p=mariadb&f=1)」に従った。

```shell
apt -y install mariadb-server
vi /etc/mysql/mariadb.conf.d/50-server.cnf
```
```text
character-set-server  = utf8mb4
collation-server      = utf8mb4_general_ci
```
```shell
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 のインストール

#### [インストール](https://www.server-world.info/query?os=Debian_12&p=httpd&f=1)

```shell
apt -y install apache2 libapache2-mod-php libapache2-mod-security2
vi /etc/apache2/conf-enabled/security.conf
```
```text
ServerTokens Prod
```
```shell
vi /etc/apache2/mods-enabled/dir.conf
```
```text
DirectoryIndex index.html index.htm index.php
```
```shell
vi /etc/apache2/apache2.conf
```
&emsp;70 行目に追加
```text
ServerName www.example.com
```
```shell
vi /etc/apache2/sites-enabled/000-default.conf
```
```text
ServerAdmin admin@example.com
```
```shell
systemctl reload apache2
```
&emsp;web ブラウザで `http://www.example.com` にアクセスして Apache2 Debian Default Page が表示されることを確認する。

#### [SSL/TLS の設定](https://www.server-world.info/query?os=Debian_12&p=httpd&f=3)

```shell
vi /etc/apache2/sites-available/default-ssl.conf
```
```text
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
```
```shell
a2enmod ssl
systemctl restart apache2
```
&emsp;web ブラウザで `https://www.example.com` にアクセスして Apache2 Debian Default Page が表示されることを確認する。

#### [PHP スクリプトを利用する](https://www.server-world.info/query?os=Debian_12&p=httpd&f=6)

```shell
vi /etc/php/8.2/apache2/php.ini
```
```text
date.timezone = "Asia/Tokyo"
```
```shell
systemctl reload apache2
echo '<?php phpinfo(); ?>' > /var/www/html/info.php
```
&emsp;web ブラウザで `https://www.example.com/info.php` にアクセスして PHP Version 8.2.7 が表示されることを確認する。

#### [PHP + PHP-FPM の設定](https://www.server-world.info/query?os=Debian_12&p=httpd&f=7)

```shell
vi /etc/apache2/sites-available/default-ssl.conf
```
&emsp;&lt;VirtualHost&gt; - &lt;/VirtualHost&gt; 内に追記
```text
    <FilesMatch \.php$>
        SetHandler "proxy:unix:/var/run/php/php8.2-fpm.sock|fcgi://localhost/"
    </FilesMatch>
</VirtualHost>
```
```shell
vi /etc/php/8.2/fpm/pool.d/www.conf
```
&emsp;最終行に追記
```text
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
```
```shell
vi /etc/apache2/apache2.conf
```
```text
<Directory /var/www/>
    Options Indexes FollowSymLinks
    # AllowOverride None
    AllowOverride All
    Require all granted
</Directory>
```
```shell
a2enmod proxy_fcgi setenvif rewrite
a2enconf php8.2-fpm
systemctl restart php8.2-fpm apache2
```
&emsp;web ブラウザで `https://www.example.com/info.php` にアクセスして [FPM/FastCGI] が表示されることを確認する。

#### [mod_security の設定](https://www.server-world.info/query?os=Debian_12&p=httpd&f=14)

```shell
cp -p /etc/modsecurity/modsecurity.conf-recommended /etc/modsecurity/modsecurity.conf
systemctl reload apache2
```
&emsp;web ブラウザで `https://www.example.com/?q=<script` にアクセスして Not Acceptable が表示されることを確認する。

## WordPress のインストール

&emsp;「[Apache2 : ブログシステム : WordPress](https://www.server-world.info/query?os=Debian_12&p=httpd2&f=4)」に従った。ただし作業済の工程はスキップし、インストール先は `/var/www/html` に変更した。


```shell
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
```
```text
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>
```
```shell
a2enconf wordpress
systemctl restart apache2
mysql
```
&emsp;mysql のプロンプトに対して以下の SQL 文を入力して wordpress データベースを作成する。
```text
create database wordpress; 
grant all privileges on wordpress.* to wordpress@'localhost' identified by 'password';
exit
```

&emsp;web ブラウザで `https://www.example.com/wordpress/wp-admin/setup-config.php` にアクセスしてインストールを進める。

![](https://www.xserver.ne.jp/bizhp/wp-content/uploads/2023/06/wordpress-download-install-10.png)
&emsp;先に設定した wordpress データベースのユーザー名は wordpress、データベースのパスワードは password である。

![](https://www.xserver.ne.jp/bizhp/wp-content/uploads/2023/06/wordpress-download-install-11.png)

![](https://www.xserver.ne.jp/bizhp/wp-content/uploads/2023/06/wordpress-download-install-12.png)

![](https://www.xserver.ne.jp/bizhp/wp-content/uploads/2023/06/wordpress-download-install-13.png)

![](https://www.xserver.ne.jp/bizhp/wp-content/uploads/2023/06/wordpress-download-install-14.png)

![](https://www.xserver.ne.jp/bizhp/wp-content/uploads/2023/06/wordpress-download-install-15.png)

![](https://www.xserver.ne.jp/bizhp/wp-content/uploads/2023/06/wordpress-download-install-16.png)

&emsp;次回以降、上記のアカウントで `https://www.example.com/wordpress/wp-login.php?wp_lang=ja` にログインするとダッシュボードが表示される。</br>
&emsp;以上が正常に動作することを確認のうえ FQDN で wordpress にリダイレクトするよう以下を実行する。

```shell
mv /var/www/html/index.html /var/www/html/index_.html
touch /var/www/html/.htaccess 
vi /var/www/html/.htaccess
```
```text
<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>
```