🏗️ サーバー構築・運用 第5章-2節

Linuxサーバーの運用と監視

ログ管理

Linuxサーバーの運用で最も重要なスキルのひとつがログ管理です。サーバーの状態把握、障害原因の調査、セキュリティインシデントの検知など、あらゆる運用作業の基盤となります。

主要ログファイルの場所

ログファイル内容確認すべき場面
/var/log/syslog(Debian系)
/var/log/messages(RHEL系)
システム全般のログサーバーの異常全般の調査
/var/log/auth.log(Debian系)
/var/log/secure(RHEL系)
認証関連のログ不正ログイン試行の検知
/var/log/kern.logカーネルメッセージハードウェア障害の調査
/var/log/nginx/Nginxのアクセスログ・エラーログWebサーバーの問題調査
/var/log/mysql/MySQLのログデータベースの問題調査
/var/log/croncronジョブの実行ログ定期処理の成否確認

journalctlによるログ確認

journalctlはsystemdのジャーナルログを閲覧するコマンドで、すべてのサービスのログを統合的に検索できます。

コマンド説明
journalctl -u nginx特定サービスのログを表示
journalctl -u nginx --since "1 hour ago"直近1時間のログ
journalctl -p errエラー以上の重要度のログのみ
journalctl -fリアルタイムでログを追跡(tail -f相当)
journalctl --since "2024-01-01" --until "2024-01-02"期間指定でログ表示
journalctl --disk-usageジャーナルのディスク使用量
journalctl --vacuum-size=500Mジャーナルを500MBに削減

ポイント:journalctl -p err -bは「今回の起動以降のエラーログ」を表示します。サーバー再起動後に問題が発生した場合の第一段階の調査に最適です。-b -1で前回起動時のログも確認できます。

rsyslogによるログ集約

rsyslogは従来型のsyslogデーモンで、リモートサーバーへのログ転送が可能です。複数のLinuxサーバーのログを1台のログサーバーに集約する際に使用します。

📋 具体例

rsyslogでリモートログ転送を設定する例:

送信側(/etc/rsyslog.conf に追加)
*.* @@logserver.example.co.jp:514
(@@はTCP、@はUDPを意味する)

受信側(ログサーバーの /etc/rsyslog.conf)
module(load="imtcp")
input(type="imtcp" port="514")

SSH設定と鍵認証

SSH(Secure Shell)はLinuxサーバーへのリモート接続の標準プロトコルです。セキュアな設定を行うことが重要です。

SSH鍵認証の設定手順

  1. 鍵ペアの生成(クライアント側):
    ssh-keygen -t ed25519 -C "admin@example.co.jp"
  2. 公開鍵をサーバーに配置
    ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
  3. パスワード認証を無効化(/etc/ssh/sshd_config):
    PasswordAuthentication no
  4. sshdを再起動
    sudo systemctl restart sshd

SSH設定のセキュリティ強化

設定項目(sshd_config)推奨値説明
PermitRootLoginnorootでの直接SSH接続を禁止
PasswordAuthenticationnoパスワード認証を無効化(鍵認証のみ)
Port22以外(例:2222)デフォルトポートを変更して自動スキャンを回避
MaxAuthTries3認証試行の最大回数
AllowUsersadmin tanakaSSH接続を許可するユーザーを制限
ClientAliveInterval300無操作タイムアウト(秒)

⚠️ 注意

SSH設定を変更する際は、必ず既存のSSHセッションを維持したまま新しいセッションでテストしてください。設定ミスで既存セッションを切断すると、サーバーに接続できなくなる可能性があります。特にPasswordAuthentication noを設定する前に、鍵認証での接続が確実にできることを確認しましょう。

firewalld / iptables

Linuxサーバーのファイアウォール管理ツールです。

ツール特徴主な使用環境
firewalldゾーンベース。動的にルール変更可能。初心者向けRHEL/AlmaLinux/CentOS(デフォルト)
ufwシンプルなフロントエンド。iptablesのラッパーUbuntu(デフォルト)
iptables/nftables低レベルの制御が可能。上級者向け全ディストリビューション

📋 具体例

firewalldの基本操作:
# 状態確認
sudo firewall-cmd --state

# 許可されているサービスの一覧
sudo firewall-cmd --list-all

# HTTPを永続的に許可
sudo firewall-cmd --permanent --add-service=http

# 特定ポートを許可
sudo firewall-cmd --permanent --add-port=8080/tcp

# 設定を再読み込み
sudo firewall-cmd --reload


ufwの基本操作:
# ufwを有効化
sudo ufw enable

# SSHを許可
sudo ufw allow ssh

# 特定ポートを許可
sudo ufw allow 80/tcp

# 特定IPからの接続のみ許可
sudo ufw allow from 192.168.1.0/24 to any port 22

# 状態確認
sudo ufw status verbose

プロセス監視

コマンド説明使用場面
topリアルタイムのプロセス・リソース監視CPU・メモリ使用状況の確認
htoptopの強化版。色付き表示、マウス操作対応より見やすいリアルタイム監視
ps aux全プロセスの一覧表示特定プロセスの確認
ps aux | grep nginx特定サービスのプロセス検索サービスの稼働確認
kill -15 PIDプロセスに終了シグナル送信正常停止
kill -9 PIDプロセスを強制終了応答しないプロセスの強制停止
lsof -i :80特定ポートを使用しているプロセスを表示ポート競合の調査

シェルスクリプトによる自動化

Linuxサーバーの運用効率を高めるために、シェルスクリプトによる自動化は必須スキルです。

📋 具体例

サーバー監視スクリプトの例(/opt/scripts/server_check.sh):
#!/bin/bash
# サーバー状態チェックスクリプト

MAILTO="admin@example.co.jp"
HOSTNAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M:%S')

# ディスク使用率チェック(90%以上で警告)
DISK_USAGE=$(df -h / | awk 'NR==2 {print $5}' | tr -d '%')
if [ "$DISK_USAGE" -gt 90 ]; then
  echo "[$DATE] WARNING: Disk usage is ${DISK_USAGE}% on $HOSTNAME" | \
    mail -s "Disk Alert: $HOSTNAME" $MAILTO
fi

# メモリ使用率チェック
MEM_USAGE=$(free | awk '/Mem:/ {printf "%.0f", $3/$2*100}')
if [ "$MEM_USAGE" -gt 90 ]; then
  echo "[$DATE] WARNING: Memory usage is ${MEM_USAGE}% on $HOSTNAME" | \
    mail -s "Memory Alert: $HOSTNAME" $MAILTO
fi

# 重要サービスの稼働チェック
for SERVICE in nginx mysql sshd; do
  if ! systemctl is-active --quiet $SERVICE; then
    echo "[$DATE] CRITICAL: $SERVICE is down on $HOSTNAME" | \
      mail -s "Service Alert: $HOSTNAME" $MAILTO
  fi
done


cronで5分ごとに実行する設定:
*/5 * * * * /opt/scripts/server_check.sh

バックアップスクリプトの自動化

📋 具体例

データベースバックアップの自動化例:
#!/bin/bash
BACKUP_DIR="/backup/mysql"
DATE=$(date '+%Y%m%d_%H%M%S')
RETENTION_DAYS=7

# バックアップ実行
mysqldump --all-databases | gzip > "${BACKUP_DIR}/alldb_${DATE}.sql.gz"

# 古いバックアップの削除
find "$BACKUP_DIR" -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete

# 結果ログ
echo "$(date) Backup completed: alldb_${DATE}.sql.gz" >> /var/log/backup.log

ひとり情シスの視点:Linuxサーバーの運用では、「手作業でやったことは必ずスクリプト化する」という習慣が重要です。最初は簡単なバックアップスクリプトやログ確認スクリプトから始めて、徐々に自動化の範囲を広げていきましょう。スクリプトは/opt/scripts/などの決まった場所に保管し、Gitでバージョン管理するのが理想的です。また、自分が不在のときに他の担当者がスクリプトの内容を理解できるよう、コメントを丁寧に書くことを心がけてください。