こんにちは!「LINUX工房」管理人の「リナックス先生」です。
全8回の「Ubuntu 26.04 LTS サーバー構築入門」を完走した皆さん、本当にお疲れ様でした!皆さんの手元には今、SSHの鍵認証で守られ、UFWとFail2banが稼働し、NginxとDockerが連携する、美しく堅牢なクラウドネイティブ・サーバーが存在しているはずです。
しかし、本番環境(プロダクション)の世界へ船出すると、教科書通りにはいかない「嵐」が必ず待ち受けています。
「急にWebサイトが表示されなくなった!」「アクセスが集中してサーバーが応答しない!」「昨日まで動いていたDockerコンテナが突然死した!」……これらは、インフラエンジニアであれば誰もが経験する冷や汗もののシチュエーションです。
先生!実は昨日、自分が作ったWebサイトをSNSで宣伝したら、急にアクセスが増えて「502 Bad Gateway」って表示されて真っ白になっちゃったんです!
テンパってしまって、とりあえずサーバーを強制再起動したら直ったんですけど……原因がサッパリわからなくて、今夜もまた落ちるんじゃないかとビクビクしています。
コウ君、それは典型的な「リソース枯渇」の症状ね。とりあえず再起動で直すのは「素人の応急処置」よ!
プロのインフラエンジニアは、ログから『なぜ落ちたのか(OOM Killerか、コネクション不足か)』を正確に特定し、二度と同じ障害が起きないようにチューニングを施すの。
今回は番外編として、現場で起きるトラブルの「原因究明プロセス」と、Ubuntu 26.04ならではの「極限チューニング術」を叩き込むわよ!
本記事は、サーバー構築後に必ず手元に置いておくべき「逆引きのトラブルシューティング辞典」であり、システムを一段階上のパフォーマンスへと引き上げる「チューニングのバイブル」です。
🚀 Ubuntu 26.04サーバー構築入門・全8回+番外編アーカイブ
- 【第1回】RHELとの違いとUbuntu 26.04 OSインストール完全ガイド
- 【第2回】公開サーバーへの道:SSH鍵認証とsudo権限の厳格化
- 【第3回】UFWとFail2ban:強固なファイアウォールと不正アクセス対策
- 【第4回】不要なサービスの停止とOSカーネルのセキュリティチューニング
- 【第5回】Netplanによる高度なネットワーク設定とIPv6完全対応
- 【第6回】Nginxのインストールと最新Webサーバーの構築
- 【第7回】Dockerの導入:Ubuntuの強みを最大限に活かすコンテナ運用
- 【第8回】システム監視と自動アップデートの自律運用(最終回)
- 【番外編】プロが教えるトラブル解決と極限チューニング(本記事)
目次
1. トラブルシューティングの極意:「推測するな、計測せよ」
サーバーに障害が発生した際、初心者は「多分Nginxの設定がおかしい」「多分メモリが足りない」と推測(カン)で設定ファイルをいじり始めます。 これは最悪の悪手です。設定を適当に変更することで、元の原因が分からなくなるばかりか、新たな障害(二次災害)を引き起こします。
プロのエンジニアの鉄則は「推測するな、計測(ログ確認)せよ」です。そして、障害の切り分けは必ず「OSI参照モデルの下(ネットワーク層)から上(アプリケーション層)」に向かって行います。
1-1. 障害切り分けの「3つのレイヤー」
| 確認するレイヤー | 具体的な確認内容 | 使用するコマンド(Ubuntu 26.04) |
|---|---|---|
| 1. ネットワーク層 | そもそもサーバーにパケットが届いているか? ファイアウォール(UFW)で遮断されていないか? |
ping, curl -I, sudo ufw status |
| 2. OS・ミドルウェア層 | NginxやDockerのプロセス(デーモン)は起動しているか? ポート(80や443)は正しくリッスン(待ち受け)しているか? |
systemctl status, ss -tulpn, journalctl -xe |
| 3. アプリケーション層 | プログラム(Python, PHP, Node.js)のコード内でエラー(例外)が発生していないか? DBへの接続パスワードが間違っていないか? |
docker logs, アプリ独自のログファイル (/var/log/...) |
この順番を頭に叩き込んだ上で、実際の具体的なトラブルシューティングに入りましょう。
2. ネットワーク・SSHの「繋がらない」を切り分ける技術
「サーバーにSSH接続できない」というトラブルは、インフラ管理において最も致命的です。しかし、ターミナルに表示されるエラーメッセージを見れば、原因は一発で特定できます。
2-1. SSHエラーメッセージ別・原因と対策リスト
| エラーメッセージ | 意味と主な原因 | 解決策 |
|---|---|---|
| Connection timed out | パケットがサーバーに到達せず、時間切れになった。原因の99%はファイアウォール(UFWやVPSの管理画面のセキュリティグループ)の設定漏れ、またはIPアドレスの打ち間違い。 | VPSコンソールからログインし、sudo ufw status を確認。22番(または変更したSSHポート)が ALLOW になっているか確認する。 |
| Connection refused | サーバーにパケットは届いたが、「そのポートで待ち受けているサービスがない」と拒否された。sshdサービスが落ちている、またはポート番号が間違っている。 | コンソールから systemctl status ssh を確認し、再起動する。設定ファイル(sshd_config)のポート番号設定を見直す。 |
| Permission denied (publickey) | ネットワークは正常でSSHデーモンも応答したが、「鍵」が合わずに認証を拒否された。 秘密鍵の指定忘れ(-iオプション)、またはサーバー側の ~/.ssh のパーミッション設定ミス(700と600になっていない)。 |
ssh -v コマンドで詳細なデバッグログを表示し、どの鍵が使われているか確認する。サーバー側の権限を厳密に修正する。 |
なるほど!「Timed out」と「Refused」は全然意味が違うんですね。
Timed outの時はネットワークの途中や入り口で弾かれていて、Refusedの時は中には入れたけど門前払いされたってことですね。これを知っているだけでパニックにならずに済みそうです!
3. Nginxの「真っ白なエラー画面」を読み解き復旧する
Webサイトにアクセスしたとき、画面に大きく「502 Bad Gateway」や「403 Forbidden」と表示されることがあります。これらはNginxが親切に「ここで処理が止まったよ」と教えてくれているサインです。
3-1. HTTPステータスコードのプロ的解釈
| エラーコード | プロはどう読み解くか(原因) | 解決のアクション |
|---|---|---|
| 403 Forbidden | Nginxはファイルを見つけたが、「OSの権限不足」で読み込めなかった。または、UFW/AppArmorによってアクセスが禁じられている。 | ドキュメントルート(/var/www/html等)の所有者が www-data になっているか、パーミッションが 755 / 644 になっているか確認する。 |
| 404 Not Found | Nginxに設定された root ディレクトリの中に、要求されたファイルが存在しない。ディレクトリパスの記述ミス。 |
/etc/nginx/sites-available/ 内の root 指定パスが、実際のディレクトリと1文字も違わず合致しているか確認する。 |
| 502 Bad Gateway | Nginxは正常だが、裏側(リバースプロキシ先)のDockerコンテナやNode.jsアプリが落ちているか、ポートが違う。 | 裏側のアプリが起動しているか確認。docker ps や pm2 status。proxy_pass に書かれたポート番号が正しいか確認。 |
| 504 Gateway Timeout | 裏側のアプリに通信は届いたが、処理が重すぎて(DBの応答遅延など)制限時間内にNginxに返事を返せなかった。 | DBのクエリが重くないか確認。Nginx側の proxy_read_timeout の値を一時的に引き上げる(例:60s から 300s へ)。 |
3-2. 神コマンド「tail -f」によるリアルタイムログ監視
ブラウザでエラー画面を出したまま、ターミナルで以下のコマンドを実行し、ブラウザをリロード(F5)してください。
# エラーログをリアルタイムで追従表示する sudo tail -f /var/log/nginx/error.log
すると、画面に [error] 12345#0: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.1.10, server: example.com, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:8080/" といった詳細なエラーが出力されます。これが原因究明のすべてです。
4. Dockerコンテナが「すぐ落ちる・動かない」時の処方箋
第7回で導入したDocker。docker compose up -d を打ったのに、すぐにコンテナが止まってしまう(Exitしてしまう)ことがあります。コンテナは「中で動いているプロセス(PID 1)が終了すると、コンテナ自体も終了する」という仕様を持っています。
4-1. 終了コード(Exit Code)で死因を特定する
docker ps -a を実行した際、Exited (XXX) という数字が表示されます。この数字(終了コード)が死因(ダイイングメッセージ)です。
| Exit Code | 死因と解説 | 対策 |
|---|---|---|
| Exited (1) | アプリケーションの内部エラー。プログラムの構文エラーや、設定ファイル(YAML等)の記述ミス。 | docker logs [コンテナ名] を実行し、プログラムが出力したエラーメッセージ(PythonのトレースバックやPHPのFatal error)を読む。 |
| Exited (137) | 「OOM Killer(Out of Memory Killer)」による強制終了。ホストOSのメモリが枯渇したため、Linuxカーネルがコンテナを強制的に殺した。 | サーバーのメモリ(RAM)を増設する、またはスワップ(Swap)領域を作成する。アプリのメモリリークを修正する。 |
| Exited (255) | 正常な終了プロセスを経ずに強制キル(kill -9)された場合など。 | 再起動を試みる。ホストマシンの再起動などが原因の場合が多い。 |
昨日サーバーが落ちた原因はこれですね!docker ps -a を見たら、見事に Exited (137) になっていました。アクセスが急増してメモリが足りなくなって、OSに強制的に殺されてしまったんですね……。残酷だけど、OS全体を守るためには仕方ない仕組みなんですね。
4-2. 奥の手「docker inspect」
ログを見ても原因がわからない場合、コンテナの「完全な内部状態(JSONデータ)」を丸裸にするコマンドを使います。
docker inspect [コンテナ名]
出力されたJSONの中の "State" -> "OOMKilled" が true になっていれば、100%メモリ不足が原因です。また、"Mounts" の項目を見れば、ホストOSのディレクトリが正しくコンテナにマウントされているか(権限エラー等がないか)を確認できます。
5. サーバーが「重い・遅い」時のボトルネック特定術
「エラーにはならないが、ページの表示に10秒かかる」。インフラエンジニアにとって、完全にダウンしている時よりも厄介なのがこの「スローダウン」です。原因はCPU、メモリ、ディスクI/O、ネットワークのいずれかに潜んでいます。
5-1. ロードアベレージ(Load Average)の正しい読み方
サーバーにログインして uptime または top コマンドを打つと、load average: 2.50, 1.20, 0.80 というような数字が出ます。これはそれぞれ「過去1分間、5分間、15分間」の平均負荷を表します。
【プロの判断基準】
サーバーの「CPUコア数」を基準にします。
もし2コアのサーバーでロードアベレージが「2.00」なら、CPUは100%フル稼働で余裕がゼロの状態です。
もし2コアのサーバーでロードアベレージが「5.00」なら、3つの処理が常に「順番待ち(渋滞)」している状態であり、明らかにキャパシティオーバー(重い)です。
5-2. 3種の神器による切り分け
| コマンド | 何を見るか(注目ポイント) | ボトルネックの判断 |
|---|---|---|
| htop | CPU使用率(棒グラフ)と、メモリの Swp(スワップ)使用量。 |
CPUが100%に張り付いていればプログラムの処理限界。Swpが増え続けていればメモリ不足(スラッシング発生中で極端に遅くなる)。 |
| iostat -x 1 (sysstatパッケージ) |
%util (ディスクの稼働率) と await (読み書きの待ち時間)。 |
%util が100%近ければ、ディスクの読み書き速度(I/O)がボトルネック。SSDへの変更や、DBのインデックス見直しが必要。 |
| dmesg -T | OSカーネルが出力するハードウェア・システムエラー。 | Out of memory: Killed process やディスクのハードウェアエラーが出力されていれば即座に対応が必要。 |
6. 【Ubuntu 26.04新境地】eBPFを活用した次世代パフォーマンス分析
これまでは strace などのコマンドでプロセスの動きをトレースしていましたが、負荷が高すぎて本番環境では使えないという致命的な弱点がありました。
しかし、Ubuntu 26.04が搭載する Linux Kernel 7.0 では、「eBPF(Extended Berkeley Packet Filter)」という技術が完全に成熟しています。
6-1. eBPFとは何か?
eBPFは、「カーネルの中に安全な砂場(サンドボックス)を作り、そこに監視プログラムを注入して、OSのあらゆる挙動(システムコールやネットワークパケット)をオーバーヘッド(負荷)ほぼゼロで監視できる」という、黒魔術のようなテクノロジーです。
6-2. bpfcc-tools を使った神の視点
Ubuntu 26.04でeBPFツールキットをインストールします。
sudo apt update sudo apt install bpfcc-tools linux-headers-$(uname -r) -y
これで、信じられないほど強力な分析コマンドが使えるようになります。
sudo execsnoop-bpfcc: サーバー内で一瞬だけ起動して消える短命なプロセス(裏で動くcronスクリプトやマルウェア)をすべて可視化します。sudo biolatency-bpfcc: ディスクの読み書きの「遅延(レイテンシ)」をマイクロ秒単位でヒストグラム(分布図)化して表示します。「平均的には速いけど、たまに10秒かかる遅いI/Oがある」といった隠れボトルネックを一撃で発見できます。sudo tcptop-bpfcc: 現在アクティブなTCP通信を、帯域(スループット)を最も消費している順にリアルタイム表示します。
eBPFを使いこなせるエンジニアは、現在のインフラ市場において「プラチナチケット」並みの価値があるわ。
見えないボトルネックを負荷ゼロでレントゲン撮影のように透視できるから、大規模なKubernetes環境やマイクロサービスアーキテクチャのトラブルシューティングにおいて、eBPFは絶対に欠かせない必須ツールになっているのよ!
7. Nginxとカーネルの「限界突破」極限チューニング
ボトルネックが特定できたら、いよいよチューニング(最適化)です。Ubuntu 26.04とNginxの組み合わせにおいて、1台のサーバーで限界(1万〜10万同時接続)まで性能を引き出すための「究極のパラメータ設定」を公開します。
7-1. OSのファイルディスクリプタ(ファイルを開く限界数)の引き上げ
Linuxは「通信の接続(ソケット)」を「ファイル」として扱います。デフォルトでは「1プロセスにつき同時に1024個までしかファイルを開けない」という安全制限がかかっているため、Nginxのワーカープロセスも1024接続で限界を迎えます。
これを /etc/security/limits.conf で引き上げます。
sudo nano /etc/security/limits.conf # 末尾に追記 * soft nofile 65535 * hard nofile 65535 root soft nofile 65535 root hard nofile 65535
再起動後、制限が 65535(一般的な上限)まで解放されます。
7-2. Nginxの限界突破設定(nginx.conf)
第6回の設定をさらに先鋭化した、プロ仕様の /etc/nginx/nginx.conf です。
worker_processes auto;
# OSの制限に合わせて、Nginx側のプロセスあたりの上限も引き上げる
worker_rlimit_nofile 65535;
events {
# 1ワーカーあたりの同時接続数を極限まで引き上げ
worker_connections 20480;
multi_accept on;
# Linux特有の超高速I/Oイベント通知機構を使用
use epoll;
}
http {
# --- 基本の高速化 ---
sendfile on; # カーネル空間で直接ファイルを送信し、CPU負荷を激減
tcp_nopush on; # データをある程度まとめてから一気に送信する
tcp_nodelay on; # 逆に、小さなデータは即座に送信する(動的コンテンツ向け)
# --- タイムアウトの最適化(重要) ---
# クライアントが応答しない通信を素早く切り捨て、メモリを節約する
keepalive_timeout 15;
client_body_timeout 10;
client_header_timeout 10;
send_timeout 10;
# --- バッファとキャッシュ ---
# ファイルの場所(メタデータ)をメモリにキャッシュし、ディスクI/Oを減らす
open_file_cache max=200000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
}
これらの設定と、第4回で行った sysctl によるTCPスタックのチューニング(tcp_tw_reuse 等)が組み合わさることで、あなたのサーバーはちょっとやそっとのアクセス砲(バズり)では微動だにしない、無敵の要塞へと進化します。
8. AIを活用した「障害報告書(ポストモーテム)」の自動作成
トラブルを解決して「あー直ってよかった」で終わらせてはいけません。プロの組織では、必ず「ポストモーテム(事後検証報告書)」を作成し、「なぜ起きたのか」「どう解決したのか」「再発防止策は何か」をチームに共有(ナレッジ化)します。
8-1. AIプロンプト:ポストモーテムの生成
障害発生時の各種ログ(dmesg、journalctl、docker inspect)を集め、AI(Gemini等)に以下のプロンプトを入力します。
「あなたはシニアSRE(サイト信頼性エンジニア)です。 先ほど発生したサーバーダウン(OOM KillerによるDockerコンテナの強制終了)について、以下のログ情報を基に、経営層および開発チームに提出するための『ポストモーテム(障害報告書)』を作成してください。 【提供するログ情報】 [ここに dmesg や docker logs の抜粋を貼り付ける] 【報告書の必須構成】 1. 障害の概要(発生日時、影響範囲) 2. 根本原因の分析(Root Cause Analysis: なぜOOMが発生したのか技術的根拠) 3. 復旧までに行った対応のタイムライン 4. 再発防止策(インフラ側でのスワップ領域の追加や、アプリ側でのメモリリーク調査の提言など、Action Itemを3つ提示) 専門用語は適度に用いながらも、論理的で分かりやすい構成にしてください。」
AIはログから「MySQLの処理待ちが積み重なり、Webコンテナのメモリが急増した結果、OOM Killerが発動した」といった相関関係を見抜き、見事な障害報告書を数秒で書き上げてくれます。これは、エンジニアとしてのあなたの評価を劇的に高めるアウトプットになります。
総まとめ:トラブルを愛せるエンジニアになれ
本編8回に続く、この超特大の「番外編」、本当にお疲れ様でした!
ネットワーク層からの切り分け、Nginxのエラーコードの読解、DockerのExit Codeからの死因特定。そして、トッププロが使うeBPFを用いたボトルネックの可視化と、サーバーの限界を引き出す極限チューニング。
これらはすべて、数え切れないほどの「サーバーダウン」という地獄をくぐり抜けてきた先人たちが残してくれた、貴重なノウハウの結晶です。
トラブルが起きた時、最初は誰でもパニックになります。
しかし、今日学んだ「推測するな、計測せよ」の精神と、ログを読み解く知識があれば、障害は「サーバーが発するSOSのサイン」であり、システムをより強固にするための「成長のチャンス」に変わります。
これで「Ubuntu 26.04 LTS サーバー構築入門」の全行程は本当に終了です。
皆さんがこの連載で得た知識とトラブル解決の技術を武器に、インフラエンジニアとして、あるいはフルスタックエンジニアとして、大空へ羽ばたいていくことを心から応援しています!
それでは、また新しい技術の最前線でお会いしましょう。
LINUX工房の「リナックス先生」でした。
▼ 限界突破のチューニングを試そう ▼
eBPFや高負荷テストを本番環境で回すなら
「超高性能・完全専有型VPS」
トラブルシューティングとチューニング力で
「ハイクラスSREエンジニアへ転職」

コメント