(Linux)大規模基盤のLinux運用で得た知見まとめ #サーバー – Qiita

(障害対応/テンプレ化/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 想定でまとめている。

  1. OS最小構成(Minimal + 必要パッケージ)
yum groupinstall "Minimal Install" -y
yum install -y vim-enhanced wget curl git net-tools lsof tree bash-completion
  1. SELinuxポリシー初期設定
sed -i 's/^SELINUX=.*/SELINUX=permissive/' /etc/selinux/config
setenforce 0

(本番で ON 運用する環境では permissive → enforcing へ事前検証)

  1. firewall の基本ポートだけ許可
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --reload
  1. chrony で時刻同期設定
yum install -y chrony
sed -i 's/^server .*/server ntp.nict.jp iburst/' /etc/chrony.conf
systemctl enable --now chronyd
chronyc sources
  1. fstab 最適化(noatime 推奨)

例:/ を noatime 化する場合

sed -i 's/defaults/defaults,noatime/' /etc/fstab
mount -o remount /
  1. ログローテーション標準化
cat << 'EOF' > /etc/logrotate.d/custom
/var/log/custom/*.log {
    rotate 7
    daily
    compress
    missingok
    notifempty
}
EOF

※ 大規模基盤だと logrotate のテンプレ化は事故防止に必須。

  1. ユーザー/sudo 権限テンプレ
useradd & sudo設定
useradd deploy
echo 'deploy ALL=(ALL) NOPASSWD:ALL' > /etc/sudoers.d/deploy
chmod 440 /etc/sudoers.d/deploy
  1. 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
  1. 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
  1. 初期ディレクトリ構造テンプレ(再現性重視)
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インストール〜ミドルウェア設定〜監視設定まで一連の流れを記載
        
  • パラメータシート
    • IPアドレス/ホスト名/DNS/ゲートウェイ
    • Firewall公開ポート/SELinuxモード/ユーザー・権限
    • ディスクレイアウト(VG/LV/マウントポイント)
        
  • トラブルシュート手順
    • CPU高負荷時の切り分け手順
    • メモリ不足時の確認手順
    • ネットワーク疎通不良時の確認手順
    • アプリ応答遅延時の確認手順 など
        
  • 定期運用手順
    • パッチ適用手順
    • バックアップ取得・リストア確認
    • 監視の閾値・項目の見直し手順
        
  • 構成図
  • ネットワーク構成図(L2/L3)
  • 仮想基盤構成図(ホスト〜ゲスト〜ストレージ)
  • サービス構成図(LB → Web → AP → DB)
      
    ▶ 手順書の特徴(意識していたこと)
      
  • 「誰がやっても同じ結果になる」ことを最優先
    • 手順を“コマンド+期待する出力+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




元の記事を確認する

関連記事