raspberry pi でWordPress + SSL化

6 min read読了の目安(約5600字

やったこと

・raspberry pi を購入
・DynamicDNSの導入(myDNS)/Cronの設定
・Apache2 、PHP、MariaDBののインストール
・Let’s Encryptの導入/Cronの設定
・ファイヤーウォールの設定(UFW)
・ルータに穴あけ
・確認方法!!!(結構重要

不親切に説明します・・・

0.Raspberry pi の購入

https://room.rakuten.co.jp/room_f314fc39e4/1700113810812828

とりあえず、こういうところから買います。
microSDカードも購入してくださいね。
microSDカードリーダも購入してくださいね。
WindowsとmicroSDカードとmicroSDカードリーダを繋いで、以下ソフトで初期化

https://www.sdcard.org/downloads/formatter/

OSは"Install Raspberry Pi OS using Raspberry Pi Imager"を使ってみてください。

https://www.raspberrypi.org/software/

SSHなどは、"sudo apt install ssh"とか固定IPアドレスなどはご自分でやってね♪

1. DynamicDNSの導入

1.1 MyDNSの登録

今回は、MyDNSを使用:

https://www.mydns.jp/

手順1.上記URLより登録(登録方法は省きます)
手順2.Mydnsにログインして"Domain INFO"の一番下のほうにある"Domain"とMX (FQDN)"に自分のドメインを入力
手順3.確認を押す

1.2. cronの設定

MyDNSは何日か放置するとDNSの更新が出来なくなります。よって、定期的にログインしたりしてIPアドレスを通知してあげる必要があります。
そこで、Linux OS側でcronを設定してあげましょう

手順1. cd /etc/cron.daily
手順2. sudo vi <ファイル名>.sh
手順3. 以下のようなシェルスクリプトを作成

mydns.sh
#!/bin/sh
# update ddns
# MyDNS
wget -O - --http-user=<ユーザID> --http-password=<パスワード> http://www.mydns.jp/login.html

#以下は変数です
#<ユーザID>=mydns******
#<パスワード>=efawefaefnwa12

これで、一日後にはIPアドレスが更新されているはず。

もし更新されていなかったら?

事象によるのであまり多くは書けませんが、
ポイント1:less /var/log/cronを見てみる。実行されたか確認する
ポイント2:シェルスクリプトの権限を確認する
をやってみましょう。何かしらヒントがあるはずです。

2.Apache2 、PHPのインストール

このサイトを参考にしました。

https://raspida.com/wp-onthe-lamp#toc6

手順は上記URLの通りちょいちょいコメントを差し込みます。
まずは、お決まりのアップデート& apache、PHPインストール

sudo apt uodate && sudo apt upgrade
sudo apt install apache2 -y
sudo apt install php -y
cd /var/www/html
sudo rm index.html
sudo vi index.php

index.phpの中身は以下の通り

index.php
<?PHP echo date('Y-m-d H:i:s'); ?>

さて、サービスを起動してPHPが動くか試してみましょう

sudo systemctl enable apache2 
sudo systemctl restart apache2

この段階で、ブラウザ上のアドレスバーに
http://<raspberry pi IP add>
を打ち込んで、時刻が表示されていることを確認する
ここで、なんか、phpのソースコードが表示されているのなら、末尾の動かない場合を参照・・・
(と言ってもメモ書きレベルです。。。)

3. MariaDBののインストールとDB構築

次に、MarinaDB(MySQL)のインストール

sudo apt install mariadb-server
sudo apt install php-mysql
sudo systemctl enable mariadb
sudo systemctl start mariadb

では、DBの構築を行っていきます!
この時作成する、wordpress-userpasswordはWordpressの起動画面で使います。

sudo mysql
MariaDB [(none)]> create database wordpress;
MariaDB [(none)]> CREATE USER 'wordpress-user'@'localhost' IDENTIFIED BY 'password';

次に、MySQLを使う旨と、作ったデータベースの権限をユーザにします。

MariaDB [(none)]> use mysql;
MariaDB [mysql]> select user,password,plugin from user;
MariaDB [mysql]> exit

一旦抜けて、WordPressのユーザ名とパスワードを作成

sudo mysql
MariaDB [(none)]> GRANT ALL on wordpress.* TO '<先ほど設定したユーザ名>'@'localhost' IDENTIFIED BY '<先ほど設定したパスワード>';
MariaDB [(none)]> exit

4.WordPressの導入

さて、ここからWordPressを導入します。手順は、ダウンロード、解凍、権限付与、apacheの再起動です。

cd /var/www/html
sudo rm *
sudo wget http://wordpress.org/latest.tar.gz
sudo tar xzf latest.tar.gz
sudo mv wordpress/* .
sudo rm -rf wordpress latest.tar.gz
sudo chown -R www-data: .
sudo systemctl restart apache2

5.WordPressの初期設定

さて、以下アドレスにアクセスします。
http://<raspberry pi IP add>/wp-admin

すると、WordPressの初期画面になります。(画像はありません。心で読んでください)
日本語選択
⇒続ける
⇒”さあはじめよう”
⇒データベース名(wordpress)、<先ほど設定したSQLのユーザ名>、<先ほど設定したSQLのパスワード>を投入
⇒WordPressの管理画面にログインするためのユーザ名とパスワードの設定
⇒おめでとうございます!

〇つまづいたとき・・・・(メモ書き)

今回、私は結構つまづきました。。。
特に、ApacheくんがPHPを読み込んでくれませんでしたのはまぁまぁしんどかったです。

【確認したこと】

・Apacheにphpのプラグインが存在するか?
 以下コマンドは、phpのプラグインが存在するかを確認しています。
 もし存在したら、"/etc/apache2/mods-enabled"シンボリックリンクを張ってください

cd /etc/apache2/mods-available/
ls | grep php

・Apacheにphpプラグインが存在しない
 php -vを実行してみる
 ⇒存在するなら、apacheとphpを再インストールしてみる
  存在しないなら、phpをインストール

【実際にやったこと】

一度すべて消して、インストールしなおしました。この時、設定ファイルからすべて消すコマンドを使いました。パッケージマネージャ最高

sudo apt purge apache2
sudo apt purge php

6.https化(Let’s Encryptの導入)

参考URL

https://www.miki-ie.com/network/raspberry-pi-certificate-ssl-lets-encrypt/

丁寧な上記URLを参考にしてほしいのですが、メモ書きとして以下の通りです。

sudo apt -y install certbot
sudo apt -y install python-certbot-apache
sudo certbot --apache

あとは、英語を読みながら、上記MyDNSで設定した値を入れてくださいね♪
これを実行すると、なんか勝手にApacheの設定にSSLのものが入ってました。
多分、入ってる、うん、たぶん。。。

で、この証明書cron設定していないと2か月で失効します。
ちなみに、crontab -e を使うなら"0 1 * * 7 certbot renew"を書いても良いし、mydnsみたいにcron.weeklyに書くとか、色々考えてみてください。

キーワードは:cerbot renewです
※crebotはSSLを更新するためのものみたいです。
参考URL

https://letsencrypt.org/ja/docs/client-options/

7.ファイヤーウォールの設定(UFW)

参考URL
一つ目

http://kaoru-linux.cocolog-nifty.com/blog/2008/06/ufwlanpc_d6ff.html
二つ目
https://cocoinit23.com/ubuntu-ufw-local/

ファイヤーウォールで実現したいこと!
1.ローカルネットワーク(自宅ネットワーク)環境からのアクセスはOKにしたい
2.外からのネットワークからのアクセスは443しか許さん!!!

設定の大まかな流れは、
インストール⇒機能無効化⇒すべて否定⇒許可する通信を追加⇒有効化

設定していきましょう
※ネットワークアドレス/サブネット = 例:192.168.1.0/24

sudo apt -y install ufw
sudo ufw disable
sudo ufw status
sudo ufw default DENY
sudo ufw allow from <ネットワークアドレス/サブネット> to any port ssh
sudo ufw allow 443
sudo ufw enable

8.routerの穴あけ(ポート開放)

これは、各メーカで調べてください。フレッツであればHGWなどです
外からport 80(http)とかport443(https)アクセスが来たときraspberry piに届ける設定のことです。

普通は、80portなどの要求が外から来たらHGWなどのルータで叩き落とします。
それを叩き落とさない設定にするのがポート解放と言います。

参考URL

https://www.akakagemaru.info/port/pr500-portfw.html

9.確認方法

外からアクセスされているかを確認したいはずです。
しかし、同一ネットワーク内においてMyDNSで取得したドメインをアドレスバーに打ち込んでもエラーになるはず。
じゃあ、どうするの?

1.ポートの解放状況を確認する
このサイトを使ってみる

https://www.cman.jp/network/support/port.html

2.ホームーページを観たい
別のプロキシなどを使ってみる。
一番簡単なのは、google翻訳にURLを打ち込んで確認する

https://translate.google.co.jp/?hl=ja

アクセスログの確認方法

多分、以下のコマンドを打てば、色々見えてくるかも!

tail -f /var/log/apache2/access.log

最後に

これで恐らく、自宅ホームページができたはず。容量無制限ですから、ownCloudなどを作れば自分だけのDropboxが使える!とか色々できます。
多分、会社のプロキシもすり抜けるかも??
ただし、すべては自己責任だし、私が遭遇したトラブルは書いたつもりです。
他のトラブルはわからないっす。。。