こんにちは!「LINUX工房」管理人の「リナックス先生」です。
サーバーを無事に構築し、Webサイトやアプリケーションを公開して一安心……と思っていませんか?実はインフラエンジニアの本当の戦いは、サービスを公開した「その次の日(Day 2)」から始まります。
Ubuntuサーバーを長期間運用していると、「突然パッケージのアップデートができなくなった」「ディスク容量が謎のファイルに食いつぶされた」「NginxやDockerのサービスが急に立ち上がらなくなった」といった、想定外のトラブル(障害)に必ず直面します。
これらを自力で解決できなければ、プロのインフラエンジニアとは呼べません。
先生、助けてください!昨日まで普通に動いていたサーバーが、急に「No space left on device」ってエラーを吐いて、何も保存できなくなっちゃったんです!
しかも、焦って apt upgrade しようとしたら、今度は「Could not get lock」みたいな英語のエラーが出て、完全に手詰まりです。もうOSを再インストールするしかないんでしょうか……?
コウ君、深呼吸して!サーバーのトラブルで一番やってはいけないのは「焦って適当なコマンドを打つこと」と「すぐに再インストールに逃げること」よ。
Ubuntuが吐き出すエラーメッセージには、必ず「原因と解決のヒント」が隠されているの。今回は、Ubuntuサーバーの運用で発生する「あるあるトラブル」を網羅し、プロが現場で行う『原因の特定から復旧までのプロセス』を徹底的に解説するわ。これさえ読めば、どんなトラブルでも自力で直せるようになるわよ!
本記事は、Ubuntuサーバー運用における「逆引きトラブルシューティング辞典」です。障害発生時に焦らず対処できるよう、必ずブックマークして手元に置いておいてください。
目次
1. パッケージ管理(APT)の致命的トラブルと復旧術
Ubuntuでソフトウェアをインストール・更新する apt(Advanced Package Tool)は非常に優秀ですが、途中で処理が中断されたり、リポジトリの設定を間違えたりすると、システム全体を巻き込むエラーを引き起こします。
1-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)しがちですが、それはパッケージデータベースを破壊する最悪の悪手です。正しくは、ロックを握っているプロセスを特定して安全に終了させます。
- プロセスを特定する: エラー文に表示されているプロセスID(上記の例なら
1234)が何をしているか確認します。ps -f -p 1234
- プロセスを終了させる: もしそれが
unattended-upgradesであれば、終わるまで数分待つのが正解です。しかし、数時間前にスタックしたaptプロセスであれば強制終了させます。sudo kill -9 1234
- パッケージシステムの修復: プロセスを強制終了したことで、中途半端な状態でインストールが止まっている可能性があります。以下のコマンドでデータベースを修復します。
sudo dpkg --configure -a sudo apt --fix-broken install
1-2. GPG鍵エラー:「NO_PUBKEY」
外部リポジトリ(DockerやNginxの公式リポジトリなど)を追加して apt update をした際に発生するエラーです。
📝 エラーメッセージの例
W: GPG error: https://download.docker.com/linux/ubuntu focal InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 7EA0A9C3F273FCD8 E: The repository '...' is not signed.
【原因】
Ubuntuは、ダウンロードするパッケージが改ざんされていないか確認するために「GPG公開鍵」を使用します。指定されたリポジトリのGPG鍵がシステムに登録されていない、または期限切れになっているため、セキュリティ機能が働いてダウンロードを拒否しています。
【解決策】
エラー文に表示されている16進数のキー(例:7EA0A9C3F273FCD8)をキーサーバーから取得し、システムに登録します。
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 7EA0A9C3F273FCD8 sudo apt update
※最近のUbuntu(22.04以降)では apt-key コマンドが非推奨になりつつあるため、公式ドキュメントに従って /etc/apt/keyrings/ にキーを配置する方式(curl -fsSL URL | gpg --dearmor)が推奨されます。
1-3. 依存関係の破損:「Unmet dependencies」
サードパーティ製の野良パッケージを無理やりインストールしようとした時に起こります。
【解決策】
競合しているパッケージを自動修復オプションで解決させます。
sudo apt --fix-broken install sudo apt autoremove sudo apt update
それでも直らない場合は、原因となっているパッケージを一度 sudo apt purge [パッケージ名] で完全削除してからやり直してください。
2. ディスク・ストレージの枯渇(Disk Full)問題の完全解決
「Webサイトが真っ白になった」「データベース(MySQL)に接続できなくなった」「ログが吐き出されない」。これらの原因の多くは、単なる「ディスク容量不足(No space left on device)」です。
ディスクがいっぱいになったのは分かるんですが、サーバーの中には大量のフォルダがあって、どこに巨大なファイルが隠れているのか全然見つけられません。1個ずつ ls -l で探すしかないんですか?
そんな非効率なことはしないわよ!Linuxには、ディレクトリごとの容量を一瞬で集計して、サイズの大きい順に並び替える強力なコマンドがあるの。これを使えば、犯人は一発で特定できるわ!
2-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(データベース)が犯人であることが判明します。
2-2. 巨大ファイルの安全な削除(ログファイルの罠)
ここで要注意なのが、稼働中のアプリケーション(Nginxなど)が書き込んでいるログファイルを rm コマンドで直接削除してはいけないということです。
Linuxでは、プロセスがファイルを掴んでいる(オープンしている)状態で rm 削除を行うと、ファイルは見えなくなりますが「ディスク領域は解放されない(ゾンビファイル)」という現象が起きます。
【正しいログの削除方法】
ファイルを消すのではなく、ファイルの中身を「空っぽ(ゼロ)」にします。
# 巨大な syslog の中身を空にする sudo truncate -s 0 /var/log/syslog # Nginxのアクセスログを空にする sudo truncate -s 0 /var/log/nginx/access.log
これを実行した瞬間に、ディスク容量がドカンと回復します。その後、再発防止のために logrotate の設定を見直してください。
2-3. inode枯渇問題(隠れDisk Full)
「df -h で見るとディスク容量は半分も余っているのに、ファイルが保存できない!」
これはインフラエンジニアを最も悩ませる「inode(iノード)枯渇」という現象です。
Linuxのファイルシステムは、ファイルの「データ本体」とは別に、ファイル名や権限を管理する「inode」という管理領域を持っています。inodeの数には上限があるため、「数バイトの極小ファイルが数百万個生成された」場合、データ容量はガラ空きでも、管理枠がいっぱいになってファイルが作れなくなります。
![]() |
ゼロからわかるLinuxサーバー超入門 Ubuntu対応版 (かんたんIT基礎講座) 新品価格 |
【確認と解決策】
# inodeの使用率を確認する df -i
ここでIUse%が100%になっていれば確定です。
原因の多くは、PHPのセッションファイル(/var/lib/php/sessions)や、メールのスプール(/var/mail)に数百万個のゴミファイルが溜まっていることです。対象ディレクトリを見つけ出し、find コマンドで一斉削除します。
# 例:対象ディレクトリ内のファイルを一斉削除(ファイルが多すぎるとrm *ではエラーになるためfindを使う) sudo find /var/lib/php/sessions -type f -delete
3. サービスが起動しない!systemdトラブルの切り分け
Ubuntuの心臓部である systemd。NginxやMySQLなどのサービスを再起動(sudo systemctl restart nginx)した際に、プロンプトにエラーが表示されて起動に失敗するケースです。
3-1. active (failed) の原因を探る手順
サービスが落ちていることに気づいたら、まずはステータスを確認します。
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
【プロの視点でのログ解読】
| 注目すべきログのキーワード | 原因と解決策 |
|---|---|
Address already in use |
そのサービスが使おうとしているポート(例:80番)を、すでに別のプログラムが使ってしまっています。 解決策: sudo ss -tulpn | grep :80 で犯人のプロセス(Apacheが残っている等)を特定し、killしてから再起動します。 |
syntax error in /etc/nginx/nginx.conf |
設定ファイルにタイポ(書き間違い)や括弧 } の閉じ忘れがあります。解決策: sudo nginx -t でエラー箇所(行数)を特定し、ファイルを修正します。 |
Permission denied |
サービスがアクセスしようとしたディレクトリ(ログフォルダや証明書ファイル)の権限が不足しています。 解決策: ls -l で権限を確認し、chown や chmod で適切なユーザー(www-data等)に権限を付与します。 |
3-2. ログが途切れている場合は journalctl を使う
systemctl status では直近の10行程度しか表示されません。詳細なエラーログを追うには、必ず journalctl を使います。
# そのサービスの直近の詳細な起動ログを確認する sudo journalctl -u nginx.service --since "10 minutes ago" --no-pager
インフラエンジニアのトラブルシューティングは、常に「ログとの対話」です。
4. ネットワークとSSHの「繋がらない」を解決する技術
「昨日までSSHでログインできていたのに、今日は繋がらない」。これはリモートサーバー管理において最も恐ろしい事態です。原因はネットワークの設定ミスか、ファイアウォールによる締め出しがほとんどです。
4-1. UFW / Fail2ban によるセルフ締め出しからの復旧
パスワードを何度も間違えたり、設定をミスして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 が抜けていないか等)、再度有効化してください。
以前、UFWの設定中にSSHが切れてパニックになりましたが、VPSのシリアルコンソールという「裏口」があれば、物理的にキーボードを繋いでいるのと同じように操作できるんですね!これを知っているだけで安心感が違います。
4-2. DNS名前解決の失敗(apt updateができない)
「SSHは繋がるし、IPアドレス指定ならPingも通るのに、ping google.com や apt update をすると Temporary failure in name resolution というエラーが出る」。
これは、サーバーが「ドメイン名(URL)」を「IPアドレス」に変換する機能(DNS名前解決)が壊れている証拠です。
【解決策:systemd-resolvedの修復】
Ubuntuでは、名前解決を systemd-resolved というサービスが管理しています。Netplanの設定(nameservers)が正しいか確認し、サービスを再起動します。
sudo systemctl restart systemd-resolved sudo resolvectl status
それでも直らない場合の緊急回避策として、大元の設定ファイル /etc/resolv.conf のシンボリックリンクを張り直すか、直接GoogleのDNSを指定します。
# 応急処置としてGoogle Public DNSを直接書き込む echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
5. サーバーが重い・強制終了される(OOM Killer)時の処方箋
アクセス集中やプログラムのバグ(メモリリーク)によって、サーバーのメモリ(RAM)が枯渇すると、LinuxカーネルはOS自体の崩壊を防ぐために、最もメモリを食っているプロセスを「強制的に抹殺」します。これがOOM Killer(Out of Memory Killer)です。
5-1. OOM Killerの発動確認
「MySQLが勝手に落ちていた」「Dockerコンテナが消えていた」という場合、真っ先にカーネルのログを確認します。
sudo dmesg -T | grep -i "out of memory"
出力に Out of memory: Killed process 1234 (mysqld) のような記述があれば、犯人はOOM Killerで確定です。
5-2. スワップ(Swap)領域の追加による緊急回避
メモリ不足の根本解決は「物理メモリ(RAM)の増設」か「プログラムの改修」ですが、今すぐサーバーを安定させるための応急処置として、ストレージの一部を仮想メモリとして使う「スワップ(Swap)領域」を追加します。
※VPSなどではデフォルトでスワップがゼロに設定されていることが多いため、必ず確認してください。
# 現在のスワップ領域を確認 free -m # 1. 2GBのスワップファイルを作成 sudo fallocate -l 2G /swapfile # 2. 権限を厳密に設定(root以外読み書き禁止) sudo chmod 600 /swapfile # 3. スワップ領域としてフォーマット sudo mkswap /swapfile # 4. スワップを有効化 sudo swapon /swapfile # 5. OS再起動後も有効にするため /etc/fstab に追記 echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab # 再度確認 free -m
これで、メモリが溢れそうになってもスワップ領域に逃がすことができるようになり、突然死(OOM Kill)の確率を劇的に下げることができます。ただし、スワップはディスクへの読み書きが発生するため処理速度は大幅に低下(スローダウン)します。あくまで「落ちるよりは遅い方がマシ」という処置であることを理解してください。
6. ログ解析の極意とAIを活用したインシデント調査
障害対応が一段落したら、最後に必ず行うべきことがあります。それは「なぜ起きたのか」「どう防ぐのか」をまとめたポストモーテム(障害報告・事後検証)の作成です。現代のインフラ運用では、ここでAI(GeminiやChatGPT)の分析力をフル活用します。
6-1. AIへ投げる「障害解析プロンプト」のテンプレート
エラーログをそのまま人間が読むのは苦痛ですが、AIにとっては大好物です。以下のように背景とログをセットにして投げ込みましょう。
「あなたはシニア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 の数値を100に引き上げるべきです」といった、プロフェッショナルな回答を瞬時に提示してくれます。
総まとめ:トラブルシューティングはインフラエンジニアの勲章
超特大の「Ubuntuサーバー運用トラブルシューティング大全」、いかがでしたでしょうか。
APTのロックエラー、ディスク容量の隠れ枯渇、systemdの起動失敗、ネットワークの締め出し、そしてOOM Killerの恐怖。これらはすべて、インフラエンジニアであれば誰もが必ず一度は通る「洗礼」です。
トラブルが発生した時、焦ってコマンドを打ち込む前に、まずは深呼吸をして「ログを見る」こと。
エラーメッセージを読み解き、ネットワーク層からアプリケーション層まで順番に切り分けていくこと。
この「論理的なアプローチ」こそが、あなたを真のプロフェッショナル・インフラエンジニアへと成長させてくれます。
サーバー構築は一度終われば形になりますが、運用には終わりがありません。障害を乗り越えるたびに、あなたの構築するサーバーはより堅牢になり、あなた自身のエンジニアとしての市場価値も確実なものになっていきます。
このトラブルシューティング大全が、真夜中の障害対応で孤独に戦うあなたの「最強の武器」となることを祈っています。
それでは、また次なる技術の最前線でお会いしましょう。LINUX工房の「リナックス先生」でした!
▼ トラブル対応力を磨くなら ▼
障害調査の練習や検証環境に最適
「スナップショット機能付き国内VPS」
トラブルシューティングの経験を武器に
「SRE・インフラエンジニアへ転職」


コメント