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
OSDebian 13
WebサーバーApache 2.4.67
ドメインfideafact.ddns.net(DDNS)
CMSWordPress
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日以上前の古いログは自動削除されます。

zero

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です