55
67

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

(Linux)大規模基盤のLinux運用で得た知見まとめ

55
Posted at

(Linux)大規模基盤のLinux運用で得た知見まとめ

(障害対応/テンプレ化/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
<VirtualHost *:80>
    ServerName example.com
    DocumentRoot /app/public
</VirtualHost>
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"/' \
  /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

55
67
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
55
67

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?