1. 不審なアクセス元IPの自動ブロック
Nginxのアクセスログを監視し、短時間で頻繁にリクエストを送るIPを特定してiptablesで遮断します。
#!/bin/bash
TARGET_LOG="/var/log/nginx/access.log"
THRESHOLD=20
CURRENT_TIME=$(date +%d/%b/%Y:%H:%M)
# 直近でアクセス数が多いIPを抽出
ABUSIVE_IPS=$(tail -n 1000 "$TARGET_LOG" | grep "$CURRENT_TIME" | awk '{a[$1]++} END {for(i in a) if(a[i] > '$THRESHOLD') print i}')
for IP in $ABUSIVE_IPS; do
if ! iptables -C INPUT -s "$IP" -j DROP 2>/dev/null; then
iptables -I INPUT -s "$IP" -j DROP
echo "$(date '+%Y-%m-%d %H:%M:%S') Blocked: $IP" >> /var/log/ip_block.log
fi
done
2. ログファイルのローテーション処理
古いログファイルを月ごとのディレクトリに退避させ、Nginxにシグナルを送って新規ログファイルを作成させます。
#!/bin/bash
BASE_DIR="/var/log/nginx"
ARCHIVE_DIR="$BASE_DIR/$(date +%Y-%m)"
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)
mkdir -p "$ARCHIVE_DIR"
mv "$BASE_DIR/access.log" "$ARCHIVE_DIR/access-$YESTERDAY.log"
# Nginx設定の再読み込み
kill -USR1 $(cat /var/run/nginx.pid)
3. リアルタイム・ネットワーク帯域監視
指定したネットワークインターフェースのトラフィックを1秒ごとに計測します。
#!/bin/bash
INTERFACE=$1
echo "Monitoring $INTERFACE (Ctrl+C to stop)"
while true; do
read RX1 TX1 < <(grep "$INTERFACE" /proc/net/dev | awk '{print $2, $10}')
sleep 1
read RX2 TX2 < <(grep "$INTERFACE" /proc/net/dev | awk '{print $2, $10}')
IN_KB=$(( (RX2 - RX1) / 1024 ))
OUT_KB=$(( (TX2 - TX1) / 1024 ))
echo "IN: ${IN_KB}KB/s | OUT: ${OUT_KB}KB/s"
done
4. OS環境の初期設定自動化
サーバー構築時のセキュリティ対策とパフォーマンスチューニングを自動化します。
#!/bin/bash
# タイムゾーン設定
ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
# SELinux無効化
sed -i 's/^SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
# オープンファイル制限の引き上げ
cat >> /etc/security/limits.conf << EOF
* soft nofile 65535
* hard nofile 65535
EOF
# カーネルパラメータ最適化
cat >> /etc/sysctl.conf << EOF
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_syn_backlog = 8192
EOF
sysctl -p
5. サーバーリソースの一括診断スクリプト
CPU、メモリ、ディスク使用率、現在のTCP接続数を一括で出力します。
#!/bin/bash
check_resources() {
echo "--- CPU Usage ---"
top -bn1 | grep "Cpu(s)" | awk '{print "Usage: " $2 + $4 "%"}'
echo "--- Memory ---"
free -h | awk '/^Mem:/ {print "Used: " $3 "/" $2}'
echo "--- Disk ---"
df -h | grep '^/dev/' | awk '{print $6 ": " $5 " used"}'
echo "--- TCP Connections ---"
ss -ant | awk '{status[$1]++} END {for(i in status) print i ": " status[i]}'
}
check_resources