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/cron | cronジョブの実行ログ | 定期処理の成否確認 |
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鍵認証の設定手順
- 鍵ペアの生成(クライアント側):
ssh-keygen -t ed25519 -C "admin@example.co.jp" - 公開鍵をサーバーに配置:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server - パスワード認証を無効化(/etc/ssh/sshd_config):
PasswordAuthentication no - sshdを再起動:
sudo systemctl restart sshd
SSH設定のセキュリティ強化
| 設定項目(sshd_config) | 推奨値 | 説明 |
|---|---|---|
PermitRootLogin | no | rootでの直接SSH接続を禁止 |
PasswordAuthentication | no | パスワード認証を無効化(鍵認証のみ) |
Port | 22以外(例:2222) | デフォルトポートを変更して自動スキャンを回避 |
MaxAuthTries | 3 | 認証試行の最大回数 |
AllowUsers | admin tanaka | SSH接続を許可するユーザーを制限 |
ClientAliveInterval | 300 | 無操作タイムアウト(秒) |
⚠️ 注意
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・メモリ使用状況の確認 |
htop | topの強化版。色付き表示、マウス操作対応 | より見やすいリアルタイム監視 |
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でバージョン管理するのが理想的です。また、自分が不在のときに他の担当者がスクリプトの内容を理解できるよう、コメントを丁寧に書くことを心がけてください。
✅ 完了済み