こんにちは!「LINUX工房」管理人の「リナックス先生」です。
最新の「Ubuntu 26.04 LTS」でサーバーを構築し、WebサイトやWebアプリケーションを公開して一安心……と思っていませんか?実はインフラエンジニアの本当の戦いは、サービスを公開した「その次の日」から始まります。
サーバーを長期間運用していると、「突然パッケージのアップデートができなくなった」「ディスク容量が謎のファイルに食いつぶされた」「NginxやDockerのサービスが急に立ち上がらなくなった」といった、想定外のトラブル(障害)に必ず直面します。
これらを自力で素早く解決できなければ、プロのインフラエンジニアとは呼べません。
先生、助けてください!昨日まで普通に動いていたUbuntu 26.04のサーバーが、急に「No space left on device」ってエラーを吐いて、何も保存できなくなっちゃったんです!
しかも、焦って apt upgrade しようとしたら、今度は「Could not get lock」みたいな英語のエラーが出て、完全に手詰まりです。もうOSを再インストールするしかないんでしょうか……?
コウ君、深呼吸して!サーバーのトラブルで一番やってはいけないのは「焦って適当なコマンドを打つこと」と「すぐに再インストールに逃げること」よ。
Ubuntuが吐き出すエラーメッセージには、必ず「原因と解決のヒント」が隠されているの。今回は、Ubuntu 26.04 LTSのサーバー運用で発生する「あるあるトラブル」を網羅し、プロが現場で行う『原因の特定から復旧までのプロセス』を徹底的に解説するわ。これさえ読めば、どんなトラブルでも自力で直せるようになるわよ!
本記事は、対象バージョンをUbuntu 26.04 LTSに絞った「逆引きトラブルシューティング辞典」です。障害発生時に焦らず対処できるよう、必ずブックマークして手元に置いておいてください。
目次
1. トラブルシューティングの基本原則:「推測するな、計測せよ」
サーバーに障害が発生した際、初心者は「多分Nginxの設定がおかしい」「多分メモリが足りない」と推測(カン)で設定ファイルをいじり始めます。 これは最悪の悪手です。設定を適当に変更することで、元の原因が分からなくなるばかりか、新たな障害(二次災害)を引き起こします。
プロのエンジニアの鉄則は「推測するな、計測(ログ確認)せよ」です。そして、障害の切り分けは必ず「OSI参照モデルの下(ネットワーク層)から上(アプリケーション層)」に向かって行います。
1-1. 障害切り分けの「3つのレイヤー」
| 確認するレイヤー | 具体的な確認内容 | 使用するコマンド(Ubuntu 26.04) |
|---|---|---|
| 1. ネットワーク層 | そもそもサーバーにパケットが届いているか? ファイアウォール(UFW)で遮断されていないか? Netplanの設定は正しいか? |
ping, curl -I, sudo ufw status, ip a |
| 2. OS・ミドルウェア層 | NginxやDockerのプロセス(デーモン)は起動しているか? ポート(80や443)は正しくリッスン(待ち受け)しているか? ディスク容量やメモリは足りているか? |
systemctl status, ss -tulpn, df -h, free -m |
| 3. アプリケーション層 | プログラム(Python, PHP, Node.js)のコード内でエラーが発生していないか? DBへの接続パスワードが間違っていないか? |
docker logs, journalctl -xe, アプリ独自のログファイル |
なるほど!Webサイトが見れないからといって、いきなりNginxの設定をいじるのはダメなんですね。そもそもインターネットに繋がっているのか、OSが生きているのかを下から順番に確認していくわけですね。
2. パッケージ管理(APT/dpkg)の致命的トラブルと復旧術
Ubuntu 26.04でソフトウェアをインストール・更新する apt(Advanced Package Tool)は非常に優秀ですが、途中で処理が中断されたり、リポジトリの設定を間違えたりすると、システム全体を巻き込むエラーを引き起こします。
2-1. ロックエラー:「Could not get lock /var/lib/dpkg/lock」
sudo apt update や install を実行した際、最も頻繁に遭遇するのがこのエラーです。
📝 エラーメッセージの例
E: Could not get lock /var/lib/dpkg/lock-frontend. It is held by process 1234 (apt-get) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it?
【原因】
Ubuntuでは、パッケージの破損を防ぐため、同時に1つのプロセスしか apt や dpkg を実行できないように「ロックファイル」を作成します。
裏側で自動アップデート(Unattended Upgrades)が走っている最中に手動で apt を実行しようとしたり、前回のインストール中にSSH接続が切れてプロセスがゾンビ化して残っていたりすると発生します。
【解決策:プロの対応手順】
初心者はここで無理やりロックファイルを削除(rm)しがちですが、それはパッケージデータベースを破壊する最悪の悪手です。正しくは、ロックを握っているプロセスを特定して安全に終了させます。
| ステップ | 実行コマンド | 解説 |
|---|---|---|
| 1. プロセス特定 | ps -f -p 1234 |
エラー文にあるプロセスID(1234等)が何の処理をしているか確認します。 |
| 2. 安全な終了 | sudo kill -9 1234 |
数時間スタックしているなら強制終了させます。(自動更新中の場合は数分待ちます) |
| 3. データベース修復 | sudo dpkg --configure -a |
強制終了したことで中途半端になったパッケージ情報を再構成します。 |
| 4. 依存関係の修復 | sudo apt --fix-broken install |
壊れた依存関係を修復します。その後再度 apt update を実行します。 |
2-2. GPG鍵エラー:「NO_PUBKEY」
外部リポジトリ(DockerやNginxの公式リポジトリなど)を追加して apt update をした際に発生するエラーです。Ubuntu 26.04ではセキュリティ要件が厳格化されているため、古い追加方法ではエラーになりやすいです。
📝 エラーメッセージの例
W: GPG error: https://download.docker.com/linux/ubuntu noble InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8 E: The repository '...' is not signed.
【原因と最新の解決策】
リポジトリの署名を検証するためのGPG公開鍵が不足しています。昔は apt-key コマンドで追加していましたが、現在は非推奨(Deprecated)です。正しい方法は、/etc/apt/keyrings/ にキーを直接配置することです。
# 鍵を取得して所定の場所に保存する最新の作法 curl -fsSL https://example.com/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/example.gpg # リポジトリ設定ファイル(sources.list.d配下)に signed-by オプションを追記する # 例:deb [signed-by=/etc/apt/keyrings/example.gpg] https://example.com/ubuntu noble main
3. ディスク・ストレージの枯渇(Disk Full)問題の完全解決
「Webサイトが真っ白になった」「データベース(MySQL)に接続できなくなった」「ログが吐き出されない」。これらの原因の多くは、単なる「ディスク容量不足(No space left on device)」です。
先生、まさに昨日これになりました!でも、サーバーの中には大量のフォルダがあって、どこに巨大なファイルが隠れているのか全然見つけられません。1個ずつ ls -l で探すしかないんですか?
そんな非効率なことはしないわよ!Linuxには、ディレクトリごとの容量を一瞬で集計して、サイズの大きい順に並び替える強力なコマンドがあるの。これを使えば、犯人は一発で特定できるわ!
3-1. 容量を食いつぶしている「犯人」の特定手順
まずはシステム全体のディスク使用状況を確認します。
df -h
/(ルートディレクトリ)の Use% が 100% になっていれば、完全な枯渇状態です。
次に、ルートディレクトリ直下にある各フォルダの容量を計算し、大きい順に並べます。
sudo du -sh /* 2>/dev/null | sort -hr | head -n 10
このコマンドで、例えば /var が数十GBを使っていることがわかります。
さらに /var の中を深掘りします。
sudo du -sh /var/* 2>/dev/null | sort -hr | head -n 10
このようにドリルダウンしていくと、大抵は /var/log(ログファイル)か /var/lib/docker(使われていない古いDockerイメージ群)、または /var/lib/mysql(データベース)が犯人であることが判明します。
3-2. 巨大ファイルの安全な削除(ログファイルの罠)
ここで要注意なのが、稼働中のアプリケーション(NginxやDockerなど)が書き込んでいるログファイルを rm コマンドで直接削除してはいけないということです。
Linuxでは、プロセスがファイルを掴んでいる(オープンしている)状態で rm 削除を行うと、ファイルは見えなくなりますが「ディスク領域は解放されない(ゾンビファイル)」という現象が起きます。これを解消するにはそのプロセス自体を再起動しなければならなくなります。
| 状況 | やってはいけないこと | 正しい解決コマンド(truncateの活用) |
|---|---|---|
| Nginxのアクセスログが巨大化している | rm /var/log/nginx/access.log |
sudo truncate -s 0 /var/log/nginx/access.log(ファイルの中身だけを安全に空っぽにします) |
| systemdのジャーナルログが肥大化 | rm -rf /var/log/journal/* |
sudo journalctl --vacuum-time=3d(過去3日分だけを残して安全に消去します) |
| Dockerのイメージやビルドキャッシュが巨大化 | rm -rf /var/lib/docker |
docker system prune -a --volumes(使っていないイメージとボリュームを安全に一掃します) |
3-3. inode枯渇問題(隠れDisk Full)
「df -h で見るとディスク容量は半分も余っているのに、ファイルが保存できない!」
これはインフラエンジニアを最も悩ませる「inode(iノード)枯渇」という現象です。
Linuxのファイルシステムは、ファイルの「データ本体」とは別に、ファイル名や権限を管理する「inode」という管理領域を持っています。inodeの数には上限があるため、「数バイトの極小ファイルが数百万個生成された」場合、データ容量はガラ空きでも、管理枠がいっぱいになってファイルが作れなくなります。
【確認と解決策】
# inodeの使用率を確認する df -i
ここで IUse% が 100% になっていれば確定です。
原因の多くは、PHPのセッションファイル(/var/lib/php/sessions)や、メールのスプール(/var/mail)、あるいは不正なバッチ処理で生成された一時ファイルです。対象ディレクトリを見つけ出し、find コマンドで一斉削除します。
# 例:対象ディレクトリ内のファイルを一斉削除(ファイルが多すぎると rm * ではエラーになるため find を使う) sudo find /var/lib/php/sessions -type f -delete
4. サービスが起動しない!systemdトラブルの切り分け
Ubuntu 26.04の心臓部である systemd。NginxやDocker、MySQLなどのサービスを再起動(sudo systemctl restart nginx)した際に、プロンプトにエラーが表示されて起動に失敗するケースです。
4-1. active (failed) の原因を探る手順
サービスが落ちていることに気づいたら、まずはステータスを確認します。
ゼロからわかるLinuxサーバー超入門 Ubuntu対応版 [ 小笠原 種高 ] 価格:2860円 |
sudo systemctl status nginx
📝 systemctl status の出力例
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
Active: failed (Result: exit-code) since Wed 2026-05-10 10:00:00 JST; 1min 30s ago
Process: 12345 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=1/FAILURE)
May 10 10:00:00 server nginx[12345]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
May 10 10:00:00 server systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
先生、赤い文字で「failed」と出るとすごく焦ります。でも、下の方にある数行のログを読むと「Address already in use」って書いてありますね。これってどういう意味ですか?
いい着眼点ね!それがまさに「原因」よ。
「Address already in use」は、Nginxが使おうとしている80番ポートを、すでに他のプログラム(例えばApacheなど)が占有しているから起動できない、という意味なの。エラーメッセージは暗号じゃないわ、システムからの具体的な助け舟なのよ。
【プロの視点でのログ解読と対策】
| 注目すべきログのキーワード | 原因と解決策 |
|---|---|
Address already in use |
そのサービスが使おうとしているポートをすでに別のプログラムが使っています。 解決策: sudo ss -tulpn | grep :80 等で犯人のプロセスを特定し、killしてから再起動します。 |
syntax error in /etc/nginx/... |
設定ファイルにタイポ(書き間違い)や括弧 } の閉じ忘れがあります。解決策: sudo nginx -t など、そのアプリケーション専用の構文チェックコマンドを実行し、行数を特定して修正します。 |
Permission denied |
サービスがアクセスしようとしたディレクトリ(ログフォルダや証明書ファイル)の権限が不足しています、またはAppArmorにブロックされています。 解決策: ls -l で権限を確認し、適切なユーザー(www-data等)に権限を付与します。AppArmorのログも確認します。 |
4-2. ログが途切れている場合は journalctl を使う
systemctl status では直近の数行しか表示されません。詳細なエラーログの全貌を追うには、必ず journalctl を使います。
# そのサービスの直近の詳細な起動ログを確認する sudo journalctl -u nginx.service --since "10 minutes ago" --no-pager
5. ネットワークとSSHの「繋がらない」を解決する技術
「昨日までSSHでログインできていたのに、今日は繋がらない」。これはリモートサーバー管理において最も恐ろしい事態です。原因はネットワークの設定ミスか、ファイアウォールによる締め出しがほとんどです。
5-1. UFW / Fail2ban によるセルフ締め出しからの復旧
パスワードを何度も間違えたり、SSHのポート許可設定を忘れたままUFWを有効化した場合、サーバーの通信は完全に遮断されます。SSHが繋がらない場合、VPSやクラウドのコントロールパネルから提供されている「シリアルコンソール(VNCコンソール)」を使用して、強制的にローカルログインします。
ログイン後、以下のコマンドでファイアウォールの状態を確認・解除します。
# UFWを一時的に無効化し、通信を開放する sudo ufw disable # 自分のIPがFail2banのブラックリストに入っていないか確認する sudo fail2ban-client status sshd # もし自分のIP(例: 203.0.113.10)がBanされていれば解除する sudo fail2ban-client set sshd unbanip 203.0.113.10
安全を確保してから、UFWのルールを見直し(sudo ufw allow 22/tcp が抜けていないか等)、再度有効化してください。
5-2. Netplan設定ミスによるネットワーク切断
Ubuntu 26.04ではネットワーク管理に Netplan を使用します。YAMLファイルのインデントを間違えたり、ゲートウェイのIPを間違えたりすると、ネットワークが繋がりません。
【解決策】
シリアルコンソールからログインし、Netplanの設定ファイルを修正します。
sudo nano /etc/netplan/50-cloud-init.yaml # 修正後、文法エラーがないか確認しつつ適用する sudo netplan try
5-3. DNS名前解決の失敗(apt updateができない)
「SSHは繋がるし、IPアドレス指定ならPingも通るのに、ping google.com や apt update をすると Temporary failure in name resolution というエラーが出る」。
これは、サーバーが「ドメイン名」を「IPアドレス」に変換する機能(DNS)が壊れている証拠です。
【解決策:systemd-resolvedの修復】
Ubuntu 26.04では、名前解決を systemd-resolved サービスが管理しています。Netplanの nameservers 設定が正しいか確認し、サービスを再起動します。
sudo systemctl restart systemd-resolved resolvectl status
6. サーバーが重い・強制終了される(OOM Killer)時の処方箋
アクセス集中やプログラムのバグ(メモリリーク)によって、サーバーのメモリ(RAM)が枯渇すると、LinuxカーネルはOS自体の崩壊を防ぐために、最もメモリを食っているプロセスを「強制的に抹殺」します。これがOOM Killer(Out of Memory Killer)です。
6-1. OOM Killerの発動確認
「MySQLが勝手に落ちていた」「Dockerコンテナが消えていた(Exited 137)」という場合、真っ先にカーネルのログを確認します。
sudo dmesg -T | grep -i "out of memory" # または grep -i "killed process" /var/log/syslog
出力に Out of memory: Killed process 1234 (mysqld) のような記述があれば、犯人はOOM Killerで確定です。
6-2. スワップ(Swap)領域の追加による緊急回避
メモリ不足の根本解決は「物理メモリ(RAM)の増設」か「プログラムの改修」ですが、今すぐサーバーを安定させるための応急処置として、ストレージの一部を仮想メモリとして使う「スワップ(Swap)領域」を追加します。
※VPSなどではデフォルトでスワップがゼロに設定されていることが多いため、必ず確認してください。
| 手順 | 実行コマンド | 解説 |
|---|---|---|
| 1. 作成 | sudo fallocate -l 2G /swapfile |
ルート直下に2GBのスワップ用ファイルを作成します。 |
| 2. 権限付与 | sudo chmod 600 /swapfile |
セキュリティのため、root以外は読み書きできないようにします。 |
| 3. フォーマット | sudo mkswap /swapfile |
ファイルをスワップ領域としてフォーマットします。 |
| 4. 有効化 | sudo swapon /swapfile |
スワップをシステムに認識させ、即座に有効化します。 |
| 5. 永続化 | echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab |
OS再起動後もスワップが有効になるように設定ファイルに追記します。 |
確認は free -m または htop コマンドで行います。これでメモリが溢れそうになってもスワップ領域に逃がすことができるようになり、突然死の確率を劇的に下げることができます。
7. AIを活用したインシデント調査と事後検証
障害対応が一段落したら、最後に必ず行うべきことがあります。それは「なぜ起きたのか」「どう防ぐのか」をまとめたポストモーテム(障害報告・事後検証)の作成です。現代のインフラ運用では、ここでAI(GeminiやChatGPT)の分析力をフル活用します。
先生、障害が起きた時はパニックで、直った後は安心してしまって、なかなか「なぜ起きたのか」まで深く調べる余裕がないんです。AIに手伝ってもらえるんですか?
もちろんよ!AIは大量のエラーログを読み解いて、相関関係を見つけるのが大得意なの。エラーログをそのまま人間が読むのは苦痛だけど、プロンプトを工夫してAIに投げ込めば、一瞬で「根本原因」と「再発防止策」を提案してくれるわよ。
7-1. AIへ投げる「障害解析プロンプト」のテンプレート
エラー発生時の各種ログ(dmesg、journalctl、docker inspect)を集め、以下のように背景とログをセットにして投げ込みましょう。
「あなたはシニアSRE(サイト信頼性エンジニア)です。 私の管理するUbuntu 26.04サーバーで、以下のシステム障害が発生しました。 提供するログを解析し、根本原因(Root Cause)と、再発防止のための具体的なアクションアイテム(Action Item)を3つ提示してください。 【障害の概要】 NginxとPHP-FPMが稼働するWebサーバーにて、瞬間的にアクセスがスパイクし、その後Nginxが 502 Bad Gateway を返し続けた。サーバーのロードアベレージは一時的に 15.0 を超えた。 【エラーログの抜粋】 (ここに /var/log/nginx/error.log や dmesg の内容を貼り付け) 例: [error] 1234#0: *123 connect() to unix:/run/php/php8.3-fpm.sock failed (11: Resource temporarily unavailable) WARNING: [pool www] server reached pm.max_children setting (50), consider raising it 【出力形式】 1. 根本原因の技術的解説 2. 短期的な解決策(応急処置のコマンド等) 3. 中長期的な再発防止策(パラメータチューニング等)」
AIはログから「PHP-FPMの子プロセス数(pm.max_children)が上限の50に達し、Nginxからのリクエストを受け付けられなくなったことが原因です。短期的にはPHP-FPMの再起動、長期的には /etc/php/8.3/fpm/pool.d/www.conf の数値を引き上げるべきです」といった、プロフェッショナルな回答を瞬時に提示してくれます。
総まとめ:トラブルシューティングはインフラエンジニアの勲章
「Ubuntu 26.04 LTS サーバー運用トラブルシューティング大全」、いかがでしたでしょうか。
APTのロックエラー、ディスク容量の隠れ枯渇、systemdの起動失敗、ネットワークの締め出し、そしてOOM Killerの恐怖。これらはすべて、インフラエンジニアであれば誰もが必ず一度は通る「洗礼」です。
トラブルが発生した時、焦ってコマンドを打ち込む前に、まずは深呼吸をして「ログを見る」こと。
エラーメッセージを読み解き、ネットワーク層からアプリケーション層まで順番に切り分けていくこと。
この「論理的なアプローチ」こそが、あなたを真のプロフェッショナル・インフラエンジニアへと成長させてくれます。
サーバー構築は一度終われば形になりますが、運用には終わりがありません。障害を乗り越えるたびに、あなたの構築するサーバーはより堅牢になり、あなた自身のエンジニアとしての市場価値も確実なものになっていきます。
このトラブルシューティング大全が、真夜中の障害対応で孤独に戦うあなたの「最強の武器」となることを祈っています。
それでは、また次なる技術の最前線でお会いしましょう。LINUX工房の「リナックス先生」でした!
▼ トラブル対応力を磨くなら ▼
障害調査の練習や検証環境に最適
「スナップショット機能付き国内VPS」
トラブルシューティングの経験を武器に
「SRE・インフラエンジニアへ転職」

コメント