Raspberry Pi4 WebサーバーHTTPS化 作業レポート
対象ドメイン: fideafact.ddns.net
実施日: 2026年6月5日
対象サーバー: Raspberry Pi 4(Debian)
Webサーバー: Apache2
1. 作業概要
Raspberry Pi4上で稼働しているWordPressサイト(fideafact.ddns.net)を、HTTP通信からHTTPS通信に移行した。SSL証明書はLet’s Encryptを使用し、Certbotで自動取得・自動設定を行った。
2. 環境情報
| 項目 | 内容 |
|---|---|
| サーバー | Raspberry Pi 4 |
| OS | Debian 13 |
| Webサーバー | Apache 2.4.67 |
| ドメイン | fideafact.ddns.net(DDNS) |
| CMS | WordPress |
| SSL証明書 | Let’s Encrypt(無料) |
| Certbotバージョン | 4.0.0 |
3. 実施手順
ステップ① Certbot インストール確認
CertbotおよびApache用プラグインがすでに最新版でインストール済みであることを確認した。
bash
sudo apt install certbot python3-certbot-apache -y
# → certbot 4.0.0-2+deb13u1(インストール済み)
# → python3-certbot-apache 4.0.0-2(インストール済み)
ステップ② SSL証明書取得・Apache設定の自動適用
--apache オプションにより、証明書の取得からApache設定ファイルの書き換えまで自動で実行された。
bash
sudo certbot --apache -d fideafact.ddns.net
結果:
- 証明書の取得: 成功
- Apache設定ファイルへの自動デプロイ: 成功
- 自動更新スケジュール: 自動設定済み
証明書の保存先:
| ファイル | パス |
|---|---|
| 証明書 | /etc/letsencrypt/live/fideafact.ddns.net/fullchain.pem |
| 秘密鍵 | /etc/letsencrypt/live/fideafact.ddns.net/privkey.pem |
| 有効期限 | 2026年9月2日 |
Apache設定ファイルの保存先:
/etc/apache2/sites-available/000-default-le-ssl.conf
ステップ③ Apacheモジュールの有効化
bash
sudo a2enmod ssl # → すでに有効
sudo a2enmod rewrite # → すでに有効
sudo a2enmod headers # → 新たに有効化
ステップ④ 設定ファイルのテストとApache再起動
bash
sudo apache2ctl configtest # → Syntax OK
sudo systemctl restart apache2
ステップ⑤ ポート開放確認
ファイアウォーク(ufw・iptables)が未インストールの環境であったため、Raspberry Pi側のファイアウォール設定は不要と判断。ポートの待受状態をssコマンドで確認した。
bash
sudo ss -tlnp | grep 443
# → Apache2がポート443でListen中であることを確認
4. 動作確認結果
bash
curl -I https://fideafact.ddns.net
HTTP/1.1 200 OK
Date: Fri, 05 Jun 2026 00:53:14 GMT
Server: Apache/2.4.67 (Debian)
Content-Type: text/html; charset=UTF-8
| 確認項目 | 結果 |
|---|---|
| HTTPS接続 | ✅ 成功(200 OK) |
| SSL証明書 | ✅ 有効 |
| ポート443 Listen | ✅ 確認済み |
| ポート80 Listen | ✅ 確認済み |
| 自動更新設定 | ✅ Certbotが自動設定 |
5. 自動更新について
Let’s Encrypt証明書の有効期限は90日間。Certbotが自動更新のスケジュールを設定済みのため、手動更新は不要。
更新のテストコマンド:
bash
sudo certbot renew --dry-run
6. 作業後の構成
インターネット
│
│ HTTPS(ポート443)
▼
ルーター(ポートフォワーディング: 443→Raspberry Pi)
│
▼
Raspberry Pi 4
├── Apache2
│ ├── ポート80(HTTP)→ HTTPSへリダイレクト
│ └── ポート443(HTTPS)← SSL証明書適用済み
│ └── /etc/letsencrypt/live/fideafact.ddns.net/
└── WordPress
7. 今後のメンテナンス
| 作業 | タイミング | コマンド |
|---|---|---|
| 証明書の有効期限確認 | 随時 | sudo certbot certificates |
| 証明書の手動更新 | 期限60日前以降 | sudo certbot renew |
| Apache設定確認 | 変更時 | sudo apache2ctl configtest |
シェルスクリプトにまとめてcronで定期実行する形が最適です。
作成するスクリプトの内容
以下を自動で一括実行します:
| 作業 | 内容 |
|---|---|
| システム更新 | apt update && apt upgrade |
| Apache2更新 | 最新版への更新確認 |
| 証明書更新 | 期限60日以内なら自動更新 |
| Apache設定テスト | 構文チェック |
| Apache再起動 | 設定反映 |
| 動作確認 | HTTPSレスポンス確認 |
| ログ保存 | 実行結果をファイルに記録 |
- 毎週1回(日曜深夜など)→ 最もバランスが良い
Raspberry Piへの設置手順
① スクリプトをコピーして配置
ダウンロードしたファイルをRaspberry Piに転送するか、以下で直接作成します:
bash
sudo nano /usr/local/bin/maintenance.sh
#!/bin/bash
# ============================================================
# Raspberry Pi4 週次メンテナンススクリプト
# 対象: fideafact.ddns.net (Apache2 + WordPress)
# 実行: 毎週日曜日 深夜2:00
# ============================================================
DOMAIN="fideafact.ddns.net"
LOG_DIR="/var/log/maintenance"
LOG_FILE="$LOG_DIR/$(date +%Y%m%d_%H%M%S).log"
NOTIFY_EMAIL="" # 通知先メール(任意)
# ログディレクトリ作成
mkdir -p "$LOG_DIR"
# ログ出力関数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
# 結果記録用
ERRORS=0
log "======================================================"
log "週次メンテナンス 開始"
log "======================================================"
# ------------------------------
# 1. システムパッケージ更新
# ------------------------------
log "[1/6] システムパッケージ更新"
apt update -qq >> "$LOG_FILE" 2>&1
if apt upgrade -y >> "$LOG_FILE" 2>&1; then
log " → 成功"
else
log " → エラーが発生しました"
ERRORS=$((ERRORS + 1))
fi
# ------------------------------
# 2. 不要パッケージの削除
# ------------------------------
log "[2/6] 不要パッケージの削除"
if apt autoremove -y >> "$LOG_FILE" 2>&1; then
log " → 成功"
else
log " → エラーが発生しました"
ERRORS=$((ERRORS + 1))
fi
# ------------------------------
# 3. SSL証明書の更新確認
# ------------------------------
log "[3/6] SSL証明書の更新確認"
EXPIRY=$(certbot certificates 2>/dev/null | grep "Expiry Date" | head -1 | awk '{print $3, $4, $5}')
log " → 有効期限: $EXPIRY"
if certbot renew --quiet >> "$LOG_FILE" 2>&1; then
log " → 証明書の確認・更新: 成功"
else
log " → 証明書の更新に失敗しました"
ERRORS=$((ERRORS + 1))
fi
# ------------------------------
# 4. Apache設定ファイルのテスト
# ------------------------------
log "[4/6] Apache設定ファイルのテスト"
if apache2ctl configtest >> "$LOG_FILE" 2>&1; then
log " → Syntax OK"
else
log " → 設定ファイルにエラーがあります(再起動をスキップします)"
ERRORS=$((ERRORS + 1))
# 設定エラー時はここで終了してApacheを壊さない
log "======================================================"
log "設定エラーのため処理を中断しました(ERRORS: $ERRORS)"
log "======================================================"
exit 1
fi
# ------------------------------
# 5. Apache再起動
# ------------------------------
log "[5/6] Apache再起動"
if systemctl restart apache2 >> "$LOG_FILE" 2>&1; then
log " → 成功"
else
log " → 再起動に失敗しました"
ERRORS=$((ERRORS + 1))
fi
# ------------------------------
# 6. HTTPS動作確認
# ------------------------------
log "[6/6] HTTPS動作確認"
sleep 3 # 再起動の安定待ち
HTTP_STATUS=$(curl -o /dev/null -s -w "%{http_code}" --max-time 10 "https://$DOMAIN")
if [ "$HTTP_STATUS" = "200" ]; then
log " → https://$DOMAIN → HTTP $HTTP_STATUS OK"
else
log " → 異常を検知: HTTP $HTTP_STATUS"
ERRORS=$((ERRORS + 1))
fi
# ------------------------------
# 完了サマリー
# ------------------------------
log "======================================================"
if [ "$ERRORS" -eq 0 ]; then
log "週次メンテナンス 完了(エラーなし)"
else
log "週次メンテナンス 完了(エラー $ERRORS 件 → ログを確認してください)"
fi
log "ログファイル: $LOG_FILE"
log "======================================================"
# ------------------------------
# 古いログの削除(90日以上前)
# ------------------------------
find "$LOG_DIR" -name "*.log" -mtime +90 -delete
exit $ERRORS
② 実行権限を付与
bash
sudo chmod +x /usr/local/bin/maintenance.sh
③ 動作テスト(手動で一度実行)
bash
sudo /usr/local/bin/maintenance.sh
エラーなく完了することを確認します。
④ cronに登録(毎週日曜 深夜2:00)
bash
sudo crontab -e
以下の1行を追加して保存:
0 2 * * 0 /usr/local/bin/maintenance.sh
⑤ cron登録確認
bash
sudo crontab -l
ログの確認方法
実行のたびに /var/log/maintenance/ に日時付きのログが保存されます。
bash
# 最新のログを確認
sudo cat $(ls -t /var/log/maintenance/*.log | head -1)
# ログ一覧を確認
ls -lh /var/log/maintenance/
ログの例:
[2026-06-07 02:00:01] ======================================
[2026-06-07 02:00:01] 週次メンテナンス 開始
[2026-06-07 02:00:01] [1/6] システムパッケージ更新
[2026-06-07 02:00:45] → 成功
...
[2026-06-07 02:03:12] 週次メンテナンス 完了(エラーなし)
90日以上前の古いログは自動削除されます。