(障害対応/テンプレ化/OS更改)
はじめに
私はフリーランスインフラエンジニアとして 10年以上、大規模Linux基盤の構築・運用・保守 に携わってきました。
RHEL / CentOS(RedHat系ディストリビューション)を中心に、
- OS更改(RHEL6→7→8)
- テンプレート化・標準化(KVM/VMware)
- 障害対応(切り分け〜再発防止)
- 運用改善・自動化
といった領域を一貫して担当してきました。
長く現場を経験する中で強く感じたのは:(あくまで個人的に感じたことです)
- 実務で本当に求められるのは「専門知識」よりも“再現性”と“切り分け力”であること
- OS更改は 技術の高さより、正確な影響調査と手順書精度が9割
- 障害対応は コマンドの知識より、切り分けの“順番”が重要
- テンプレ化は ミドルウェアの理解より、標準化思想が本質
- 運用保守は 高度な知識より、安定性+報連相の早さを評価される
資格や座学で身につく知識よりも、
「現場でどう動くか」 が圧倒的に価値を持つ世界でした。
本記事のテーマ(大規模基盤で得た実務知)
本記事では、私がこれまで大規模Linux基盤で得た知見のうち、
特に現場で評価され続けてきた以下の3つの領域にフォーカスしています。
1. 障害対応(切り分けと再発防止の“型”)
現場の安定稼働は、トラブル時の初動と切り分け精度で決まります。
“CPU・メモリ・IO・ネットワーク・アプリ” のどこから攻めるべきか、
再発防止の書き方まで含めて体系化しています。
2. テンプレ化・標準化(再現性のある環境構築)
複数台構築を高速化し、運用の品質と速度を底上げするための
「テンプレート作成」「初期設定」「構成管理」の実務ノウハウ をまとめています。
3. OS更改(RHEL6→7→8)における“実務の落とし穴”
systemd, firewalld, OpenSSL, Python 互換性など、
よくある“事故ポイント”とその回避策 を具体的に整理しています。
本記事の対象読者
- 障害対応を論理的に進めたい方
- OS更改の全体像を把握したい方
- 大規模基盤の運用ノウハウを知りたい方
- Linux構築・運用の実務を体系的に理解したい方
- 自分のスキルを“再現性のある形”としてまとめたい方
この記事で意識していること
- “実務で本当に使う知識” だけを抽出
- コマンドを羅列するのではなく 「なぜその操作をするか」 を明示
- 誰が読んでも現場で再現できるレベルの内容にする
- 技術と運用の両方の視点でまとめる
- 初心者〜中級者でも理解しやすい構造にする
1. Linux構築の実績まとめ
以下、テンプレート作成 → サーバ構築 → WEB/AP設定 → 運用設定
の流れで、現場寄りにまとめ直した。
1-1. テンプレートサーバ構築(KVM/VMware)
▶ 目的
構築のばらつきを無くす
再現性の高いサーバを “複製 → 初期化 → 利用” できる状態にする
設定・セキュリティの標準化で長期運用の事故を減らす
▶ 実際に盛り込んでいた内容(コマンド/設定例つき)
以下は、テンプレート構築時に実際に設定していた構成。
RHEL7/8 想定でまとめている。
- OS最小構成(Minimal + 必要パッケージ)
yum groupinstall "Minimal Install" -y
yum install -y vim-enhanced wget curl git net-tools lsof tree bash-completion
- SELinuxポリシー初期設定
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
setenforce 0
(本番で ON 運用する環境では permissive → enforcing へ事前検証)
- firewall の基本ポートだけ許可
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --reload
- chrony で時刻同期設定
yum install -y chrony
sed -i 's/^server .*/server ntp.nict.jp iburst/' /etc/chrony.conf
systemctl enable --now chronyd
chronyc sources
- fstab 最適化(noatime 推奨)
例:/ を noatime 化する場合
sed -i 's/defaults/defaults,noatime/' /etc/fstab
mount -o remount /
- ログローテーション標準化
cat << 'EOF' > /etc/logrotate.d/custom
/var/log/custom/*.log {
rotate 7
daily
compress
missingok
notifempty
}
EOF
※ 大規模基盤だと logrotate のテンプレ化は事故防止に必須。
- ユーザー/sudo 権限テンプレ
useradd & sudo設定
useradd deploy
echo 'deploy ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/deploy
chmod 440 /etc/sudoers.d/deploy
- sshd_config 強化
sed -i 's/^#PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
sed -i 's/^#ClientAliveInterval.*/ClientAliveInterval 300/' /etc/ssh/sshd_config
sed -i 's/^#ClientAliveCountMax.*/ClientAliveCountMax 3/' /etc/ssh/sshd_config
echo "Authorized access only" > /etc/issue
systemctl restart sshd
- rsyslog 統一設定
例:アプリログを /var/log/app に集約するテンプレ
mkdir -p /var/log/app
chmod 755 /var/log/app
cat << 'EOF' > /etc/rsyslog.d/10-app.conf
if ($programname == 'app') then {
/var/log/app/app.log
stop
}
EOF
systemctl restart rsyslog
- 初期ディレクトリ構造テンプレ(再現性重視)
mkdir -p /app /logs /backup
chmod 755 /app /logs /backup
※ /app はアプリ本体、/logs はアプリログ、/backup は設定退避など
実務ではこれが地味に便利。
▶ テンプレ作成後に “必ずクリアする項目” の自動化(実務仕様)
テンプレ複製後の事故防止のため、
初回起動時に固有情報をクリアするスクリプトを自動実行 していた。
初期化スクリプト(/usr/local/bin/firstboot.sh)
#!/bin/bash
# machine-id 再生成
rm -f /etc/machine-id
systemd-machine-id-setup
# SSH鍵再生成
rm -f /etc/ssh/ssh_host_*
ssh-keygen -A
# NIC udev ルール削除
rm -f /etc/udev/rules.d/70-persistent-net.rules
# ホスト名リセット
hostnamectl set-hostname localhost.localdomain
# ログクリア
find /var/log -type f -exec truncate -s 0 {} \;
# 再起動案内
echo "First-boot cleanup done. Please reboot."
### systemd で初回のみ実行する Unit
cat << 'EOF' > /etc/systemd/system/firstboot.service
[Unit]
Description=First boot initialization
ConditionPathExists=/usr/local/bin/firstboot.sh
[Service]
Type=oneshot
ExecStart=/usr/local/bin/firstboot.sh
ExecStartPost=/bin/rm -f /etc/systemd/system/firstboot.service
[Install]
WantedBy=multi-user.target
EOF
systemctl enable firstboot
→ 初回起動時だけ実行し、完了後は自動で Unit が消える方式。
大規模基盤のテンプレートで“最も事故が少なかった運用パターン”。
1-2. 仮想サーバ複製・初期セットアップ
▶ よく実施していた複製後作業
① ホスト名・domain設定
hostnamectl set-hostname app01.example.local
② /etc/hosts の標準化
cat << 'EOF' > /etc/hosts
127.0.0.1 localhost localhost.localdomain
10.0.1.10 app01.example.local app01
10.0.1.11 db01.example.local db01
EOF
③ NIC名の固定化(predictable naming対策)
rm -f /etc/udev/rules.d/70-persistent-net.rules
grubby --update-kernel=ALL --args="net.ifnames=0 biosdevname=0"
④ IPアドレス設定(nmcli)
nmcli con mod eth0 ipv4.addresses "10.0.1.10/24"
nmcli con mod eth0 ipv4.gateway "10.0.1.1"
nmcli con mod eth0 ipv4.dns "8.8.8.8 1.1.1.1"
nmcli con mod eth0 ipv4.method manual
nmcli con up eth0
⑤ DNS 設定
cat << 'EOF' > /etc/resolv.conf
search example.local
nameserver 10.0.0.53
nameserver 8.8.8.8
EOF
⑥ Zabbix agent 設定
yum install -y zabbix-agent
sed -i 's/^Server=.*/Server=10.0.0.5/' /etc/zabbix/zabbix_agentd.conf
sed -i 's/^Hostname=.*/Hostname=app01/' /etc/zabbix/zabbix_agentd.conf
systemctl enable --now zabbix-agent
⑦ sudoers(プロジェクト用)
echo '%web-admins ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/web-admins
chmod 440 /etc/sudoers.d/web-admins
⑧ バックアップスクリプト配置
cat << 'EOF' > /usr/local/bin/backup.sh
#!/bin/bash
rsync -av --delete /app/ /backup/app/
EOF
chmod +x /usr/local/bin/backup.sh
echo "0 3 * * * root /usr/local/bin/backup.sh" >> /etc/crontab
▶ KVMでの構築時ポイント(実務で重要)
① virt-install でOS自動セットアップ
virt-install \
--name app01 \
--ram 4096 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/app01.qcow2,size=40 \
--os-variant rhel8.0 \
--network bridge=br0 \
--graphics none \
--location /iso/RHEL-8.6-x86_64-dvd.iso \
--extra-args "console=ttyS0"
② qcow2 thin provisioning
qemu-img create -f qcow2 /var/lib/libvirt/images/app01.qcow2 40G
③ ディスク拡張
qemu-img resize /var/lib/libvirt/images/app01.qcow2 +20G
pvresize /dev/vda2
lvextend -r -l +100%FREE /dev/mapper/rhel-root
④ CPU/MEM ホットプラグ
virsh setvcpus app01 4 --live
virsh setmem app01 8192M --live
⑤ MACアドレス固定
virsh dumpxml app01 | grep "mac address"
# 1-3. WEB/APサーバ構築(Apache / nginx / Tomcat)
※ すべてコマンドは bash で統一済み
## ■ Apache
### ▶ SSL/TLS(Let’s Encrypt)
yum install -y certbot python3-certbot-apache
certbot --apache -d example.com
### ▶ VirtualHost 設定
cat << 'EOF' > /etc/httpd/conf.d/app.conf
ServerName example.com
DocumentRoot /app/public
EOF
▶ mod_proxy(リバースプロキシ)
cat << 'EOF' >> /etc/httpd/conf.d/app.conf
ProxyPass /app http://127.0.0.1:8080/app
ProxyPassReverse /app http://127.0.0.1:8080/app
EOF
▶ KeepAlive / worker 調整
sed -i 's/^KeepAlive .*/KeepAlive On/' /etc/httpd/conf/httpd.conf
sed -i 's/^MaxKeepAliveRequests .*/MaxKeepAliveRequests 200/' /etc/httpd/conf/httpd.conf
sed -i 's/^KeepAliveTimeout .*/KeepAliveTimeout 5/' /etc/httpd/conf/httpd.conf
■ nginx
▶ gzip 圧縮
cat << 'EOF' >> /etc/nginx/nginx.conf
gzip on;
gzip_types text/css application/json application/javascript;
EOF
▶ 413 Payload Too Large の解消
echo "client_max_body_size 20M;" >> /etc/nginx/nginx.conf
▶ upstream(バックエンド設定)
cat << 'EOF' > /etc/nginx/conf.d/upstream.conf
upstream backend {
server 10.0.1.10 max_fails=3 fail_timeout=10s;
}
EOF
▶ リバースプロキシ設定
cat << 'EOF' > /etc/nginx/conf.d/app.conf
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://backend;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
EOF
■ Tomcat
▶ JVM メモリ設定
echo 'export JAVA_OPTS="-Xms1024m -Xmx2048m"' >> /etc/tomcat/tomcat.conf
▶ server.xml チューニング
sed -i 's/Connector port="8080"/Connector port="8080" maxThreads="200" acceptCount="300"https://qiita.com/" \
/etc/tomcat/server.xml
▶ WAR デプロイ
cp /tmp/sample.war /usr/share/tomcat/webapps/
▶ ログローテーション設定
cat << 'EOF' > /etc/logrotate.d/tomcat
/var/log/tomcat/*.log {
daily
rotate 30
compress
missingok
}
EOF
1-4. 運用前の安定化設定
■ セキュリティ設定
fail2ban
yum install -y epel-release fail2ban
systemctl enable --now fail2ban
firewalld(最小公開)
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
auditd 有効化
systemctl enable --now auditd
CIS Benchmarks(例)
chmod 700 /root
chmod 600 /etc/ssh/sshd_config
■ ログ・監視
journalctl 永続化
mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald
プロセス死活(systemd)
[Service]
ExecStart=/usr/bin/python3 /app/app.py
Restart=always
RestartSec=5s
■ バックアップ・保全
rsync 世代管理
rsync -av --delete /app/ /backup/app/$(date +%Y%m%d)/
LVM snapshot
lvcreate --size 2G --snapshot --name snap_root /dev/rhel/root
設定バックアップ
tar czf /backup/etc-$(date +%F).tar.gz /etc
1-5. 手順書・パラメータシートの標準化
大規模基盤だと、ここが一番評価されやすい(&事故を減らせる)ポイントでした。
▶ 作成していたドキュメント
- 初期構築手順書
- OSインストール〜ミドルウェア設定〜監視設定まで一連の流れを記載
- OSインストール〜ミドルウェア設定〜監視設定まで一連の流れを記載
- パラメータシート
- IPアドレス/ホスト名/DNS/ゲートウェイ
- Firewall公開ポート/SELinuxモード/ユーザー・権限
- ディスクレイアウト(VG/LV/マウントポイント)
- トラブルシュート手順
- CPU高負荷時の切り分け手順
- メモリ不足時の確認手順
- ネットワーク疎通不良時の確認手順
- アプリ応答遅延時の確認手順 など
- 定期運用手順
- パッチ適用手順
- バックアップ取得・リストア確認
- 監視の閾値・項目の見直し手順
- 構成図
- ネットワーク構成図(L2/L3)
- 仮想基盤構成図(ホスト〜ゲスト〜ストレージ)
- サービス構成図(LB → Web → AP → DB)
▶ 手順書の特徴(意識していたこと)
- 「誰がやっても同じ結果になる」ことを最優先
- 手順を“コマンド+期待する出力+OK/NGの判断基準”まで書く
- 手順を“コマンド+期待する出力+OK/NGの判断基準”まで書く
- スクリーンショット+コマンド+戻り値判断
- GUI作業が混ざる箇所はスクショも添付
- CLIは実行例とともに、想定される成功出力・失敗パターンを明記
- ロールバック手順を必ずセットで記載
- 変更前のバックアップ取得方法
- 差し戻し手順
- ロールバック時の確認ポイント
- 注意点とリスクを事前に明示
- 「ここで間違えるとサービス停止につながる」箇所に警告文
- 作業時間帯の前提(深夜帯/メンテナンス枠)
- 影響範囲(どのサービス/どのサーバに影響するか)
★ まとめ
テンプレート作成 → WEB/AP構築 → 監視 → 障害対応 → 運用標準化
まで一気通貫で対応してきた内容を整理しました。
特に、
再現性の高い構築・テンプレ化・OS更改・トラブルシュート
は現場で継続的に評価をいただいてきた領域です。
📚 連載ナビ
▶️ Part1:Linux 基本操作(LPIC1の“実務対応版”)
Part1URL
▶️ Part2:大規模基盤の Linux 運用で得た知見まとめ(障害対応/テンプレ化/OS更改) ← 今回の記事
ThisArticleURL
▶️ Part3:RHEL 更改の深掘り(6→7→8の変更点と実務影響)
Part3URL
▶️ Part4:障害対応の体系化(“切り分けパターン集” で高速に原因特定)
Part4URL
▶️ Part5:仮想基盤(KVM/VMware)構築ノウハウまとめ
Part5URL
▶️ Part6:運用改善/標準化の実例(再現性のある基盤の作り方)
Part6URL
▶️ Part7:セキュリティ運用(firewalld/SELinux/CIS)」
Part7URL