(2023.06)レンタルサーバ変更に伴い、ドメイン変更致しました(旧URL:https://i-topics.net)。

【ラズパイ4】NGINXサーバでWordPress(SSL化済)を公開

この記事は約45分で読めます。

以前、ラズパイ4(Raspberry Pi 4)のApache上でローカル専用WordPressサイトを作る記事を書きました。
今回はnginx(エンジンエックス)上でWWW公開するためのWordPressサイト(Let's EncryptでSSL化済)の作り方を書いてみます。

あちらこちら調べ回ったため、この記事は私自身のメモとして残すのを目的としています。

  1. はじめに結論:ラズパイは公開用Webサーバとして運用していけるのか?
  2. なぜ、nginx(エンジンエックス)でWebサーバを作るのか?
  3. 前提
  4. 手順概要・所要時間
  5. 事前準備
    1. SSHのセキュリティ対策(6分)
      1. 起動後のログイン時にユーザー名・パスワードを必須に設定(1分)
      2. SSHのポート変更(2分)
    2. ufwをインストール・変更ポートを許可(3分)
  6. LAMPの順序のようにインストール(4分)
    1. nginx インストール(1分)
    2. mariadb-server インストール(1分)
    3. php インストール(2分)
  7. nginx 設定(6分)
    1. /etc/nginx/sites-available/default のバックアップ(1分)
    2. /etc/nginx/sites-available/default ファイルを編集(2分)
    3. ufw で'Nginx Full'を許可(1分)
    4. nginx 動作確認(2分)
  8. ルータのポート開放(1分)
  9. MyDNS取得ドメインのSSL化:certbot インストール・Let's Encrypt 取得(3分)
  10. ルータのポートを閉じる
  11. phpをWordPress仕様に調整(11分)
    1. nginxでphpが動くように設定(1分)
    2. WordPressがフル稼働するよう、php.ini を調整(10分)
    3. nginxでphp動作確認
    4. nginxがエラーで動作しない場合
  12. WordPressサイト作成
    1. mariadbでWordPress用のデータベース・ユーザーを作成(4分)
    2. Duplicator でWordPressサイトを作成
      1. Duplicatorが正常に動作しない・エラーが生じる場合
    3. WordPressをパスワード認証にする
    4. 無効にしておく方が良いプラグイン
    5. 変更しておく方が良いWordPress設定
  13. ルータのポート開放して、スマホでサイトを確認
  14. WordPressサイト設置後にやること
    1. 1日1回、バックアップ
    2. 1日1回、指定時刻に自動で再起動
    3. 1日1回、自動アップデート&自動アップグレード
    4. 1日1回、MyDNSにIPアドレスを自動で通知
    5. Let's Encrypt 期限を更新するコマンド(2023-07-06 追記)
      1. Let's Encrypt から通知メールが届く
      2. Let's Encrypt のSSL有効期限を更新するコマンド
  15. SSD起動のラズパイが再起動後、起動しなくなった時の対処方法
  16. 脚注

はじめに結論:ラズパイは公開用Webサーバとして運用していけるのか?

  • 結論:WWWからのサーバレスポンスを仮に許容しても、目の届かないタイミングでサーバダウンに不安を感じ、ラズパイ4をWebサーバとして運用していく気にならない(個人の感想)

私のラズパイ4が32-bitだからかもしれませんが、スマホでWWWからアクセスするとサーバレスポンスが「やっぱりな」という程度のもたつき感があります。
恐らく、一般ユーザがアクセスすると、サイト内ページ遷移が遅く感じ、
「ユーザに迷惑が掛かることになる」と思います。

大事なデータやコンテンツは、とても安心してラズパイサーバに置けないので、
潰れても良いコンテンツを置くのが無難な使用法になると思います。

実用的な用途としては、

<ラズパイサーバの実用例>

  1. Linuxでnginxサーバの構築手順を覚える練習(apacheよりは、設定工程が少なく済みます)
    • サーバ構築手順を理解すると、ハイスペックLinuxマシンを入手したときに、実用化できるかもしれません。
  2. Duplicatorでのサーバ移転の練習(今回、10回近くやり直しました)
  3. サーバまるごと不具合起こしても構わない気構えのサイト設置(2週間で2回、SSDを作り直しました)
  4. 月1回も更新しない頻度のWordPressサイトの設置
  5. 1日に0〜2アクセス程度のWordPressサイトの設置

後述でサーバまるごとバックアップする方法も書いているので、復旧は可能ですが、
毎日、サーバダウンに怯えるよりは、

<レンタルサーバの方がベターと判断>

のプランを契約する方が日々のメンタルには良いと思います。
特に、サーバの月額電気代が220円を超える場合は、上のレンタルサーバを契約する方が、
サーバセキュリティやサーバダウンなど気にせずに済むので、
精神衛生的にもベターだと思います。

なぜ、nginx(エンジンエックス)でWebサーバを作るのか?

  1. apacheよりnginxの方が速いから
  2. apacheより設定工程が少なく、シンプルだから

前提

  • 本記事のサーバ知識は全て独学であり、専門的に学んでおりません。出来る限りの検証を繰り返した上で内容を書いていますが、故障や不具合が発生した場合には一切責任を負えません。予めご了承ください。
  • ラズパイOS Lite を使用(サーバの軽量化目的)
  • ラズパイSSD起動化済(サーバの処理速度を高める目的)
  • 有線LANで接続(有線LANの方がWi-Fiより速いので。有線にできない場合はこちらを検討ください)
  • DebianからSSH接続でラズパイサーバ構築します
  • MyDNSで無料ドメインを取得済(独自ドメインの場合は、DNS設定を済ましておく)
  • nginx, mariadb, phpは、ラズパイ公式リポジトリのバージョンを使用(基礎理解を目的のため)
  • DocumentRootは /var/www/html を使用(基礎理解を目的のため)
  • SSHで入力するコマンドを赤字、ユーザ環境に応じて変更する箇所を黄色ラインで示しています。

手順概要・所要時間

  • 所要時間:40〜60分
  1. 事前準備(6分)
    1. SSHのセキュリティ対策
      1. Auto Login をconsole text(1分)
      2. SSHのポート変更(2分)
    2. ufwをインストール・変更ポートを許可(3分)
  2. LAMPの順序のようにインストール(4分)
    1. nginx インストール(1分)
    2. mariadb-server インストール(1分)
    3. php インストール(2分)
  3. nginx 設定(6分)
    1. /etc/nginx/sites-available/default をバックアップ(1分)
    2. /etc/nginx/sites-available/default を編集(2分)
    3. ufw で'Nginx Full'を許可(1分)
    4. nginx 動作確認(2分)
  4. ルータのポート開放(1分)
  5. MyDNS取得ドメインのSSL化:certbot インストール・Let's Encrypt 取得(3分)
  6. ルータのポート閉じる(1分)
  7. phpをWordPress仕様に調整(11分)
  8. WordPressサイト作成(5分)
  9. ルータのポート開放(1分)
  10. スマホでサイトを確認(1分)

事前準備

SSHのセキュリティ対策(6分)

起動後のログイン時にユーザー名・パスワードを必須に設定(1分)

sudo raspi-config

System Options>Boot / Auto Login>B1 Console

を選択し、Tabキー、OKでEnterキーを打鍵。
raspi-config のトップメニューに戻るので、Tabキー2回、FinishでEnterキーを打鍵。
「Would you lik to reboot now(今すぐ再起動しますか?)」と尋ねられるので、
YesでEnterキーを打鍵。

ラズパイが再起動後、再度DebianからSSHで接続。

SSHのポート変更(2分)

SSHのポート番号はデフォルトでは22です。このまま使用すると危険なので、下記の範囲でポート番号を変更します(黄色)。
5桁だと複雑なポート番号が作れるので、ベターだと思います。

You should run SSH on an unprivileged port number, i.e. from 1024 to 65535

引用:https://unix.stackexchange.com/questions/196484/what-it-the-min-max-port-range-for-ssh
cd /etc/ssh #ディレクトリ移動
sudo cp sshd_config sshd_config.org #元のsshd_configファイルをバックアップ。「.org」はorignalの略。
sudo nano /etc/ssh/sshd_config #nanoでファイルを開き、編集
Port xxxxx #行頭の「#」を削除してポート番号を上記の範囲で変更する
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
sudo reboot
ssh -p xxxxx username@ラズパイIPアドレス #新しいポート番号へSSH接続する

ufwをインストール・変更ポートを許可(3分)

ufwをインストールし、SSH変更ポートに適用して、有効化します。
1行ずつ実行してください。

sudo apt install ufw
sudo ufw limit xxxxx
sudo ufw enable
sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
xxxxx                      LIMIT      Anywhere
xxxxx (v6)                 LIMIT      Anywhere (v6)

IPv6からのSSH接続は不要なので、以下のコマンドで削除します。

sudo ufw delete 2

再度、ufwの状況を確認します。

sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
xxxxx                      LIMIT      Anywhere

LAMPの順序のようにインストール(4分)

ここでは先にインストールを一式に行い、後で細々と設定します。

nginx インストール(1分)

sudo apt install nginx

mariadb-server インストール(1分)

sudo apt install mariadb-server

php インストール(2分)

apacheでWordPressを動かすPHPに、php-fpm を追加して記述しています。
apache関連は不要と思われるかもしれませんが、大した容量でもないので、
念の為インストール内容に入れています。

WordPressプラグインの中には、以下のどれかのphp不足が原因で正しく機能しない場合があります。
私の体験では、php-gdのインストールが抜け落ちて、SiteGurad WP Pluginの画像認証が動作しなくなりました。
一通りのphpをインストールしておくのが無難だと思います。

sudo apt install php libapache2-mod-php php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl

apacheプログラムをインストールしていないのに、nginxより優先して有効化され、apacheが先にポートを占有し、nginxが起動できないエラーが生じました。
そのため、ラズパイ起動してもapacheが起動しない設定にしておきます。

sudo systemctl disable apache2

nginx 設定(6分)

/etc/nginx/sites-available/default のバックアップ(1分)

cd /etc/nginx/sites-available #ディレクトリ移動
sudo cp default default.org #defaultファイルをバックアップ

/etc/nginx/sites-available 配下でバックアップファイルが作成されたのを確認

ls
default  default.org

/etc/nginx/sites-available/default ファイルを編集(2分)

sudo nano /etc/nginx/sites-available/default

このステップで3箇所の赤字部分を入力してください。

  1. index.php: index.php でのトップページ表示を可能にする
  2. xxx.mydns.jp: MyDNS で取得したドメインを入力する
  3. /index.php?$args: WordPressでのパーマリンク変更を可能にする[1]出典:https://hacknote.jp/archives/57635/
root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.php index.html index.htm index.nginx-debian.html;

        server_name xxx.mydns.jp;

location / {
                # First attempt to serve request as file, then
                # as directory, then fall back to displaying a 404.
                try_files $uri $uri/ /index.php?$args;
        }

nginx の文法チェック。

sudo nginx -t

以下のような結果になればOKです。

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

nginx に設定を再読込。

sudo nginx -s reload

nginx を再起動。

sudo systemctl restart nginx

ufw で'Nginx Full'を許可(1分)

ufwの設定は、nginx をインストールしてから行ってください。
nginxインストール時にプロファイルが作られるので、'Nginx Full'が可能となります。
ポート番号80, 443にufwを適用します。

sudo ufw allow 'Nginx Full'
~ $ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
xxxxx                      LIMIT       Anywhere
Nginx Full                 ALLOW       Anywhere
Nginx Full (v6)            ALLOW       Anywhere (v6)

nginx 動作確認(2分)

nginxの動作がactiveになっているのか状況を確認します。

sudo systemctl status nginx

active(running) の緑字ならOKです。
Qキーを打鍵して抜けます。

ufwを適用したら、DebianのブラウザにラズパイのIPアドレスを入力します。
初めはApacheのDefault Pageが表示されると思います。

以下のコマンドでDebian Default Pageを削除します。

sudo rm /var/www/html/index.html

上のブラウザを再読込すると、nginxのdefault pageが表示されると思います。

これでnginxサーバが作動しているのが確認できました。

ラズパイが起動する都度、nginxが起動するように有効化。

sudo systemctl enable nginx

ルータのポート開放(1分)

次のステップのSSL化のために、一時的にルータのポートを開放します。

  1. 契約しているISPからレンタル中のルータ機にログイン
  2. ポートマッピングまたはポートフォワードの設定:
    • ラズパイのIPアドレスを入力
    • ポート:80-80
    • ポート:443-443

初めてポート開放したときは、やり方をかなり調べました。
「契約しているISP名 ルータ ポートマッピング」などで検索すると、情報に辿り着くと思います。

この段階でのセキュリティは、ポート番号80と443だけufwで許可しています。

MyDNS取得ドメインのSSL化:certbot インストール・Let's Encrypt 取得(3分)

狙い:WordPressデータを流し込む入れ物(ディレクトリ)を先にSSL化する

certbotをnginx用プラグインと一緒にインストールします。

sudo apt install certbot python3-certbot-nginx
sudo certbot --nginx -d xxx.mydns.jp

下記の手続きの途中、「メーリングリストに登録しますか?」と尋ねられます(赤線)。私は無料で使わせてもらっているので、yesにしました。この判断は任意です。

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Plugins selected: Authenticator nginx, Installer nginx
Enter email address (used for urgent renewal and security notices)
 (Enter 'c' to cancel): xxx@xxx.jp

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at

404 Page not found - Let's Encrypt
Let's Encrypt is a free, automated, and open certificate authority brought to you by the nonprofit Internet Security Res...
You must agree in order to register with the ACME server. Do you agree? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Would you be willing, once your first certificate is successfully issued, to share your email address with the Electronic Frontier Foundation, a founding partner of the Let's Encrypt project and the non-profit organization that develops Certbot? We'd like to send you email about our work encrypting the web, EFF news, campaigns, and ways to support digital freedom. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - (Y)es/(N)o: Y Account registered. Requesting a certificate for xxx.mydns.jp Performing the following challenges: http-01 challenge for xxx.mydns.jp Waiting for verification... Cleaning up challenges Deploying Certificate to VirtualHost /etc/nginx/sites-enabled/default Redirecting all traffic on port 80 to ssl in /etc/nginx/sites-enabled/default - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Congratulations! You have successfully enabled https://xxx.mydns.jp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Subscribe to the EFF mailing list (email: xxx@xxx.jp). We were unable to subscribe you the EFF mailing list. You can try again later by visiting https://act.eff.org. IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at: /etc/letsencrypt/live/xxx.mydns.jp/fullchain.pem Your key file has been saved at: /etc/letsencrypt/live/xxx.mydns.jp/privkey.pem Your certificate will expire on 2023-06-09. To obtain a new or tweaked version of this certificate in the future, simply run certbot again with the "certonly" option. To non-interactively renew *all* of your certificates, run "certbot renew" - If you like Certbot, please consider supporting our work by: Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate Donating to EFF: https://eff.org/donate-le

SSL品質の確認。
https://www.ssllabs.com/ssltest/

ルータのポートを閉じる

certbot によるSSL化が成功したら、一旦、ルータのポートを閉じます。
ルータ内のポートマッピング設定を削除します。

外部からアクセスできない状態で、WebサーバやWordPressの設定を進めます。

phpをWordPress仕様に調整(11分)

certbotによるSSL化が成功すると、/etc/nginx/sites-available/default ファイルが自動的に書き換わっています
この書き換わったファイルに手を加え、nginx上でphpが動く仕様に調整します。

nginxでphpが動くように設定(1分)

sudo nano /etc/nginx/sites-available/default

赤字の「#」を削除し、有効にします。

# pass PHP scripts to FastCGI server
        #
        #location ~ \.php$ {
        #        include snippets/fastcgi-php.conf;
        #
        #       # With php-fpm (or other unix sockets):
        #        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
        #       # With php-cgi (or other tcp sockets):
        #       fastcgi_pass 127.0.0.1:9000;
        #}

WordPressがフル稼働するよう、php.ini を調整(10分)

php.ini のバックアップを取ってから作業するのが無難だと思います。
1行ずつ実行してください。

cd /etc/php/7.4/fpm #ディレクトリ移動
sudo cp php.ini php.ini.org #元ファイルをバックアップ
ls #ディレクトリ配下を確認
conf.d  php-fpm.conf  php.ini  php.ini.org  pool.d

1.空きRAMを知るために、一旦再起動し、DebianからSSH接続します。
1行ずつ実行してください。

sudo reboot
ssh -p xxxxx username@ラズパイIPアドレス

2.ラズパイの空きRAMを調べます。

free -h
               total        used        free      shared  buff/cache   available
Mem:           3.8Gi       114Mi       3.5Gi       3.0Mi       225Mi       3.6Gi

ざっくりと、3GBのRAMをphpに割り当てることにしました。
3GBをMBに直し、近い数値を求めます。
3000MB÷128MB≒23.4
128MB☓24倍=3072MB

以下のphp.ini の3箇所を3072に変更します。
※この割当数値が適切か否か分かりませんので、保証できません。ラズパイが正しく動作しない恐れがあります。

2.php.iniファイルを編集するために、以下を入力、実行。

sudo nano /etc/php/7.4/fpm/php.ini #nanoでphp.iniファイル編集

以下の文字列を探し出して、数値を変更。

max_execution_time = 600 #Duplicatorがタイムアウトにならないために、長めに変更
memory_limit = 3072M #上で計算した数値
post_max_size = 3072M #上で計算した数値
upload_max_filesize = 3072M #上で計算した数値

数値の大小関係は、バイト単位で、
upload_max_filesize ≦ post_max_size ≦ memory_limit [2]出典:php.net, 2023-03-11閲覧。
ここではシンプルに、数値を同じにしています。

nginxとphp-fpmを再起動するとのことですが[3]出典:stackoverflow.com, 2023-03-11閲覧。、php-fpmの再起動が出来なかったので、
ラズパイまるごと再起動します。

sudo reboot
ssh -p xxxxx username@ラズパイIPアドレス

nginxの動作確認。

sudo systemctl status nginx

active(running)の緑字ならOKです。

nginxでphp動作確認

DocumentRootにphpファイルを置いて、動作確認を行います。

nano で新規ファイルを作成します。

sudo nano /var/www/html/info.php

以下の<>はブログ表記の都合上、全角なので半角に直してください。

<?php
phpinfo();
?>

Debianのブラウザに ラズパイIPアドレス/info.php と入力し、以下のように表示されるとphpはnginx上で動いています。

下にスクロールするとサーバ設定の細かな情報が見れるのですが、WWWからのアクセス者に知られるとセキュリティホールを見つけられやすくなるため、すぐにファイルを削除します。

sudo rm /var/www/html/info.php #info.phpファイルを削除

nginxがエラーで動作しない場合

nginxの動作がエラーになる場合は、apacheが動いている可能性があります。
以下のコマンドでapacheを無効化します。
1行ずつ実行してください。

sudo systemctl status apache2 #activeの場合は、Qキーを打鍵し、下のコマンドへ
sudo systemctl stop apache2 #apacheを停止
sudo systemctl disable apache2 #apacheを無効化

nginxのエラーログは以下の場所にあります。

cat /var/log/nginx/error.log

私の場合はエラーログに以下のように表示され、「既にポートを使用中」だったので、apache作動中に気づきました。

0.0.0.0:80 failed (98: Address already in use)

nginxをスタート・ラズパイ起動時に自動起動を設定し、ラズパイそのものを再起動します。
1行ずつ実行してください。
途中エラーが生じた場合でも、ラズパイ再起動後、直るケースがありました。

sudo systemctl start nginx
sudo systemctl enable nginx
sudo reboot

WordPressサイト作成

Duplicatorを使わず新規でWordPressをインストールする場合は、過去記事をご覧ください。

今回はサーバレスポンスのテスト目的のため、既存の本サイトをDuplicatorでクローン化して、
ラズパイサーバのDocumentRootへ本サイトのデータを流し込みます。

mariadbでWordPress用のデータベース・ユーザーを作成(4分)

mariadbのデータベースとユーザーを作成します。
Duplicator公式によると、全く新規のデータベースとユーザーが望ましいです。
黄色ラインは任意に変更してください(推測されにくい文字列で)。

sudo mariadb -u root -p
create database wordpress;
create user 'pi'@'localhost' identified by 'password';
grant all on wordpress.* to 'pi'@'localhost' identified by 'password';
flush privileges;
exit;

Duplicator でWordPressサイトを作成

  1. Duplicatorで予めinstaller.php, アーカイブzipファイルを作り、microSDに保存しておく
  2. ラズパイOS LiteでmicroSDのマウント先を作る
  3. fstab 編集でmicroSDをマウント
  4. /var/www/html 配下のファイルを全て削除
  5. microSD の installer.phpとアーカイブzipファイルを /var/www/html にコピー
  6. /var/www/html 所有権を変更
  7. Duplicator を実行

Duplicatorデータを保存したmicroSDをUSB端子に差します。
以下のコマンドを実行し、microSDがマウントされていないことを確認します。

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       234G  1.8G  220G   1% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           778M  1.0M  777M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/sda1       253M   50M  203M  20% /boot
tmpfs           389M     0  389M   0% /run/user/1000

マウントポイントを作ります。

sudo mkdir /media/sd

microSDのPARTUUIDを調べます。

sudo blkid
/dev/sda1: UUID="0903-3317" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="b7b3583f-01"
/dev/sda2: LABEL="256GB" UUID="2296a031-6418-4a25-a416-4b04ae154dc8" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="b7b3583f-02"
/dev/sdb1: UUID="5AA1-A994" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="01202b1e-01"
sudo nano /etc/fstab
proc            /proc           proc    defaults          0       0
PARTUUID=b7b3583f-01  /boot           vfat    defaults          0       2
PARTUUID=b7b3583f-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

PARTUUID=01202b1e-01 /media/sd vfat defaults 0 0

マウントを追加します。

sudo mount -a

黄色ラインのようにマウントされました。

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       234G  1.8G  220G   1% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           778M  1.0M  777M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/sda1       253M   50M  203M  20% /boot
tmpfs           389M     0  389M   0% /run/user/1000
/dev/sdb1       3.8G  949M  2.8G  25% /media/sd

Duplicator公式によると、移行先のディレクトリの中身を空にしておかなければいけないので[4]出典:https://e-topics.net/duplicator/#ik
/var/www/html中身を全て削除します。

sudo rm /var/www/html/* #*(ワイルドカード)html配下のファイルを全て削除

microSDからDocumentRootへDuplicatorデータをコピーします。
黄色ラインは表示されているファイル名に置き直してください。

cd /media/sd #microSDがマウントされているディレクトリへ移動
ls #microSDの中身を表示
20230310092922_archive.zip   installer.php
sudo cp 20230310092922_archive.zip installer.php /var/www/html #DocumentRootへコピー

DocumentRootの所有権をnginx(www-data)へ変更します。
(これをしないと、Duplicatorに権限が渡らず、ブラウザ操作が出来ません)

sudo chown -R www-data:www-data /var/www/html

Duplicator を実行。続きの手順は以下の過去記事をご覧ください。

microSDからDocumentRootへDuplicatorデータのコピーが終わると、マウントポイントを無効にしておくのが無難だと思います。
今、ラズパイの電源を落としてmicroSDを抜き、再びラズパイの電源を入れるとOSの起動が途中で止まって、ラズパイが起動しなくなる恐れがあります。
「電源を落とす前のデバイスが無いぞ」とラズパイが判断して、OS起動を停止します。

この事態を避けるために、以下を実行します。

microSDをマウントポイントからマウント解除(アンマウント)します。

sudo umount /media/sd

fstabを編集します。

sudo nano /etc/fstab

赤字部分の「#」を入れて、コメントアウトし無効にします。

proc            /proc           proc    defaults          0       0
PARTUUID=b7b3583f-01  /boot           vfat    defaults          0       2
PARTUUID=b7b3583f-02  /               ext4    defaults,noatime  0       1
# a swapfile is not a swap partition, no line here
#   use  dphys-swapfile swap[on|off]  for that

# PARTUUID=01202b1e-01 /media/sd vfat defaults 0 0

アンマウントを確認します。
上の黄色が無いのを確認)

df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/root       234G  1.8G  220G   1% /
devtmpfs        1.8G     0  1.8G   0% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           778M  1.0M  777M   1% /run
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
/dev/sda1       253M   50M  203M  20% /boot
tmpfs           389M     0  389M   0% /run/user/1000

この後は、ラズパイの電源を落とし、microSDを抜いて、再度電源を入れ、
正常にラズパイが起動するのか確認します。

Duplicatorが正常に動作しない・エラーが生じる場合

私が経験したエラーは、

  1. 504 Gateway Time-out
  2. Duplicatorに許可が無い

504 Gateway Time-out はDuplicatorが作動中に実行時間切れとなって弾かれているので、php.iniのmax_execution_time を再度確認します。

「Duplicatorに許可が無い」と英文で表示された場合は、DocumentRootの所有権がrootのままで、nginxに渡っていない可能性があるので、再度所有権変更やり直します

その後、nginx文法チェックなど行い、ラズパイ再起動が無難だと思います。
1行ずつ実行してください。

sudo nginx -t #文法チェック
sudo nginx -s reload #設定の読み込み
sudo systemctl restart nginx #再起動
sudo systemctl enable nginx #ラズパイ起動の都度、有効化
sudo reboot #エラーが無ければ、ラズパイを再起動

WordPressをパスワード認証にする

WordPressプラグイン「Password Protected」で、サイト全体を見えないようにします。
目的は、

  1. Googleへのインデックス防止対策(ミラーサイト防止対策)
  2. WWWから閲覧されないための対策

無効にしておく方が良いプラグイン

  1. Invisible reCaptcha:有効にしたままDuplicatorを実行すると、ログインできなかった
  2. SiteGuard WP Plugin: URL変更をOFFに
  3. LiteSpeed Cache:CDN重複利用を避けるため。
  4. Jetpack:Duplicatorの機能で自動的に無効になる
  5. Site Kit by Google:ミラーサイトになるのを避けるため
  6. UpdraftPlus:以下の方法でバックアップを取るので不要

変更しておく方が良いWordPress設定

  1. AdSenseコードを削除
  2. 設定>一般:サイトのタイトルを変更
  3. ユーザー>プロフィール:ニックネームを変更し、適用
  4. 外観>カスタマイズ>サイト基本情報:サイトアイコンを削除、または変更

ルータのポート開放して、スマホでサイトを確認

上述の方法で再度ルータのポート開放して、スマホのキャリア回線からアクセスして、ラズパイサーバ上のWordPressサイトを確認します。

私の感想では、レンタルサーバと比較して、「やっぱりな」という程度のもっさり感でした。

WordPressサイト設置後にやること

1日1回、バックアップ

  • コピー先のmicroSDはrpi-cloneが自動でマウントするので、fstabを編集しないでください。fstabでマウント先を定義すると、ラズパイ再起動後にUSBに同じOSが2つあるため、OS起動できなくなる経験をしました。解決策は後述

rpi-clone を使います。使い方は以下の過去記事をご覧ください。

※注意:SSDを下側のUSB端子に差している場合は、バックアップ先のmicroSDはsdbになっていると思います(黄色ライン)。見分け方はディスク容量です。
rpi-cloneを実行するときも、sdbにクローンしてください。

lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 238.5G  0 disk 
├─sda1   8:1    0   256M  0 part /boot
└─sda2   8:2    0 238.2G  0 part /
sdb      8:16   1  28.8G  0 disk 
└─sdb1   8:17   1  28.8G  0 part /media/sd

正常に動作するのか確認のために、今実行してみます。

sudo rpi-clone sdb

※microSDへの初回書き込みは、時間が掛かります。
下の例では、256GBのSSDを32GBのmicroSDにクローンするのに、初回時、61分35秒掛かりました(黄色ライン)。
rpi-cloneは差分だけをコピーするので、2回目は2分11秒で終わりました。

  Destination disk partition /dev/sdb1 is mounted on /media/sd.
  The clone cannot proceed unless it is unmounted.
Do you want to unmount /media/sd?  (yes/no): yes

Booted disk: sda 256.1GB                   Destination disk: sdb 31.0GB
---------------------------------------------------------------------------
Part      Size    FS     Label           Part   Size    FS     Label  
1 /boot   256.0M  fat32  --              1       28.8G  fat32  --     
2 root    238.2G  ext4   256GB                                        
---------------------------------------------------------------------------
== Initialize: IMAGE partition table - partition number mismatch: 2 -> 1 ==
1 /boot               (49.5M used)   : MKFS  SYNC to sdb1
2 root                (2.9G used)    : RESIZE  MKFS  SYNC to sdb2
---------------------------------------------------------------------------
Run setup script       : no.
Verbose mode           : no.
-----------------------:
** WARNING **          : All destination disk sdb data will be overwritten!
-----------------------:

Initialize and clone to the destination disk sdb?  (yes/no): yes
Optional destination ext type file system label (16 chars max): bk32gb

Initializing
  Imaging past partition 1 start.
  => dd if=/dev/sda of=/dev/sdb bs=1M count=8 ...
  Resizing destination disk last partition ...
    Resize success.
  Changing destination Disk ID ...
  => mkfs -t vfat -F 32  /dev/sdb1 ...
  => mkfs -t ext4 -L bk32gb /dev/sdb2 ...

Syncing file systems (can take a long time)
Syncing mounted partitions:
  Mounting /dev/sdb2 on /mnt/clone
  => rsync // /mnt/clone with-root-excludes ...
  Mounting /dev/sdb1 on /mnt/clone/boot
  => rsync /boot/ /mnt/clone/boot  ...

Editing /mnt/clone/boot/cmdline.txt PARTUUID to use 237f9543
Editing /mnt/clone/etc/fstab PARTUUID to use 237f9543
===============================
Done with clone to /dev/sdb
   Start - 09:17:40    End - 10:19:15    Elapsed Time - 61:35

Cloned partitions are mounted on /mnt/clone for inspection or customizing. 

Hit Enter when ready to unmount the /dev/sdb partitions ...
  unmounting /mnt/clone/boot
  unmounting /mnt/clone
===============================

正常動作が確認できれば、crontabに書き込んで自動化します。

sudo crontab -e

アクセスが少ない時間帯が良いと思います。
(例)毎日、午前1時にバックアップする場合。書式は過去記事をご覧ください。

00 1 * * * sudo bash rpi-clone sdb -q

1日1回、指定時刻に自動で再起動

sudo crontab -e

(例)毎日、午前3時に再起動(リブート)する場合。

00 3 * * * /sbin/reboot

1日1回、自動アップデート&自動アップグレード

(例)毎日、午前3時5分にアップデート・アップグレードする場合。

homeディレクトリにシェルスクリプト「update.sh」を作成します[5]参考:raspiブログ, 2023-03-13閲覧。

sudo nano update.sh

以下を入力します。

#!/bin/sh
sudo apt update -y
sudo apt upgrade -y
sudo apt autoremove -y
sudo apt-get clean -y
sudo apt-get autoclean -y
sudo apt-get check -y

実行権限を与えます。

sudo chmod 755 update.sh

正常に動作するのか、今確認します。

sudo ./update.sh

crontab に登録します。

sudo crontab -e
05 3 * * * sudo /home/username/update.sh

1日1回、MyDNSにIPアドレスを自動で通知

(例)毎日、午前3時10分にMyDNSへIPアドレスを通知する場合。

homeディレクトリにシェルスクリプト「mydns.sh」を作成します[6]参考:cooeil.com, 2023-03-13閲覧。

sudo nano mydns.sh

以下を入力します。

curl https://ipv4.mydns.jp/login.html -u mydnsID:password

実行権限を与えます。

sudo chmod 755 mydns.sh

正常に動作するのか、今確認します。

sudo ./mydns.sh

crontab に登録します。

sudo crontab -e
10 3 * * * sudo /home/username/mydns.sh

Let's Encrypt 期限を更新するコマンド(2023-07-06 追記)

Let's Encrypt から通知メールが届く

Let's Encrypt から「ドメインの証明書有効期限の通知」のメールが届きました(下画像)。

内容は以下です。

Hello,

Your certificate (or certificates) for the names listed below will expire in 19 days (on 2023-07-25). Please make sure to renew your certificate before then, or visitors to your web site will encounter errors.

We recommend renewing certificates automatically when they have a third of their total lifetime left. For Let's Encrypt's current 90-day certificates, that means renewing 30 days before expiration. See https://letsencrypt.org/docs/integration-guide/ for details.

***.mydns.jp

For details about when we send these emails, please visit: https://letsencrypt.org/docs/expiration-emails/ In particular, note that this reminder email is still sent if you've obtained a slightly different certificate by adding or removing names. If you've replaced this certificate with a newer one that covers more or fewer names than the list above, you may be able to ignore this message.

For any questions or support, please visit: https://community.letsencrypt.org/ Unfortunately, we can't provide support by email.

To learn more about the latest technical and organizational updates from Let's Encrypt, sign up for our newsletter: https://mailchi.mp/letsencrypt.org/******

If you are receiving this email in error, unsubscribe at:
http://delivery.letsencrypt.org/track/unsub.php?*****
Please note that this would also unsubscribe you from other Let's Encrypt service notices, including expiration reminders for any other certificates.

Regards,
The Let's Encrypt Team

Let's Encrypt のSSL有効期限を更新するコマンド

LXTerminalで以下のコマンドを入力します(赤字のコマンドを入力)。
「Congratulations(黄色マーカー部分)」が表示されれば、成功です。
ルータのポートを開いた状態で実行しないと、エラーになり失敗します。

<ログ内容>

~ $ sudo /usr/bin/certbot renew
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/***.mydns.jp.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator nginx, Installer nginx
Renewing an existing certificate for ***.mydns.jp
Performing the following challenges:
http-01 challenge for ***.mydns.jp
Waiting for verification...
Cleaning up challenges

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/***.mydns.jp/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Processing /etc/letsencrypt/renewal/***.net.conf
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Cert is due for renewal, auto-renewing...
Plugins selected: Authenticator nginx, Installer nginx
Renewing an existing certificate for ***.net
Performing the following challenges:
http-01 challenge for ***.net
Waiting for verification...
Cleaning up challenges


- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
new certificate deployed with reload of nginx server; fullchain is
/etc/letsencrypt/live/***.net/fullchain.pem
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Congratulations, all renewals succeeded: 
  /etc/letsencrypt/live/***.mydns.jp/fullchain.pem (success)
  /etc/letsencrypt/live/***.net/fullchain.pem (success)
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

crontab で自動更新を設定すると楽になると思いますが、個人的な都合により私は手動で行っています。
事前にメールが届くのは、「有り難く良心的」と感じました。

SSD起動のラズパイが再起動後、起動しなくなった時の対処方法

以下の過去記事の方法をお試しください。

以上で本記事のコンテンツは終わりです。
お役に立てれば嬉しく思います。

脚注

脚注
1 出典:https://hacknote.jp/archives/57635/
2 出典:php.net, 2023-03-11閲覧。
3 出典:stackoverflow.com, 2023-03-11閲覧。
4 出典:https://e-topics.net/duplicator/#ik
5 参考:raspiブログ, 2023-03-13閲覧。
6 参考:cooeil.com, 2023-03-13閲覧。

コメント