Welcome

Learning Pathゼロから学ぶサーバー構築

今日は、ここから1つ進める

初めてなら「環境がまだない」から。今の状態に合う作業を1つ選び、終わったら「何が分かったか」を1文残します。

  1. 環境がまだない図で3つの役割を知る

    目安10分。利用者・nginx・appを紙に描き、要求の通り道を言えたら今日はここまで。

  2. appとnginxを起動済み4つの応答を確かめる

    目安15〜30分。開始条件を確認し、予想と実結果を比べて記録します。

  3. 自分の実行記録がある理由を1分で説明する

    目安10分。4問で振り返り、できたことと未実施を分けて話します。

環境の準備・起動がこれからなら、図の次に主作品の準備手順へ。初回実習全体は準備済みで90〜120分が目安です。詳細資料はGitHubで開きます。

初回のゴール:小さく動かし、結果の意味を説明する

サーバーの「入口・返答・確認」を、ひとつずつ

この作品は、サーバーのCPUやメモリなどの数値を見られる個人学習用のラボです。サーバー構築とは、必要なソフトと通信の設定を用意し、使える状態を確かめること。最初はapp と nginx の2サービスで「応答する」「認証で守る」を学びます。

  1. 1 図で理解
  2. 2 小さく実行
  3. 3 予想と比較
  4. 4 自分で説明

1. 理解する:要求はどこを通る?

「数値を見せて」という要求を送り、応答を受け取ります。このやり取りのルールがHTTPです。まず、次の3つの役割を覚えます。

  1. 要求する人ブラウザ / curl

    画面やコマンドから
    「見せて」と頼む

    127.0.0.1:8080
  2. 入口・転送係nginx

    要求を受け取り
    appへ渡す

    app:5000 へ
  3. 認証・返答係app

    必要な認証を確認し
    画面や数値を返す

    app.py

動かす土台は Ubuntu(LinuxのOS)。Docker が app と nginx を別々のコンテナ(プログラムと実行環境をまとめて動かす単位)で動かし、Docker Compose が設定ファイルを読んで起動をまとめます。

要求は左から右へ、応答は逆向きに戻ります。縦表示では上から下へ進みます。/healthz も nginx を通って app に届きます。

80805000 は通信の入口を区別するポート番号です。この構成で利用者が入るのは 80805000 は内部のapp用です。127.0.0.1 は「今操作しているコンピューター自身」なので、Windowsと別のUbuntu VMでは指す相手が違います。

図と実際のコードを結び付ける

compose.yamlappnginxports が部品と入口、nginxの設定proxy_pass が転送先です。app.pyprotect_sensitive_routes が認証、/api/stats が数値を返す処理に対応します。

2. 実行する:まずは4つの応答を見る

操作の手順は 主作品 server の初心者向け学習ガイドに集約しています。「実行場所と準備」→ Step 1・2 → Step 3 の順に進み、app と nginx を起動します。初回実習全体の目安は準備済みで90〜120分。途中で区切って構いません。

この確認を始める条件
  • 破棄できる専用Ubuntu 24.04環境のBashで、compose.yaml のある server 直下にいる。
  • ガイドの前提診断に FAIL がなく、設定と秘密値の準備を終えている。
  • docker compose ps --all app nginx で app が Uphealthy、nginx が Up。nginxに healthy 表示は不要。

準備が足りない場合は理由を付けて BLOCKED(実行できず保留)。Windows PowerShellへBashの手順を貼り付けず、ガイドの準備へ戻ります。

条件がそろったら、同じUbuntuのターミナルで次を実行します。「入口からappへ届けば 200 になるはず」と予想してから結果を見ます。

curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/healthz

curl は要求を送る道具です。この書き方は応答の本文を表示せず、HTTPコードだけを表示します。続けてガイドの「3-3. 応答と認証を分けて確認する」の残り3件を、1行ずつ実行します。パスワードはガイドどおり入力し、コマンドや学習記録には書きません。

端末やファイル操作が初めての場合

練習環境の準備ファイルを1つ作る「最初の30分」を先に行います。現在のフォルダと保存した内容を確認できたら、このサーバー実習へ戻ります。ファイル作成だけではサーバーの動作確認は完了しません。

3. 確認する:数字を見て、どこまで分かった?

以下は初期設定と秘密値の準備が正しくできたときの期待値です。あなたの実測結果ではありません。実行日時・Ubuntuの環境・コードの版(git rev-parse HEAD)と、4件それぞれの実際の結果を残します。

ガイド Step 3-3 の4件と、確認できる範囲(小さい画面では表を横にスクロールできます)
送る要求期待値この結果から分かること
/healthz200 要求成功nginxを経由してappが応答する。認証・監視・復元の合格は別に確かめる。
認証なしの /401 認証が必要認証なしでは画面を取得できない。ここでは期待どおり。
tokenなしの /metrics401 認証が必要数値の収集用にも認証が必要。画面用パスワードとは別のtokenを使う。
正しいBasic認証付きの /api/stats200 要求成功正しいユーザー名とパスワードで数値取得の要求に成功する。

成功の判断は「全部200」ではなく、要求ごとの期待値との一致です。このcurlには -f を付けていないため、コマンドの終了コードが 0 でもHTTPが 401503 のことがあります。

期待値と違うとき:502・000・503をどう読む?
  • 502:nginx経由でこの値が返るなら、入口からappへの通信を調べます。appの状態とログを確認し、コードだけで原因を断定しません。
  • 000:curlがHTTP応答を取得できなかった表示です。サーバーが返すHTTPコードではありません。実行場所、宛先、nginxの状態、接続エラーを確認します。
  • 503:appの認証用秘密値が未設定などの場合にも返ります。appのログと設定を、秘密値を記録へ載せずに調べます。

ガイド Step 4-1 の状態 → ログ → 通信 → 設定へ戻ります。実行結果が期待と違えば FAIL。未実行の項目は NOT RUN のまま残します。

ここまでの合格条件:4件の予想と実結果を記録し、下の問いに図を見ずに答えられること。そろったらガイド Step 4・5で計画停止・再開・終了と説明までを行います。その後は主作品のStep 6で監視を加え、Level 0〜5の道筋で未確認の範囲へ進みます。このページの8段階の構築演習は、VM本体のOS・SSH・設計・引き渡しを補うときに使います。

読める → 手を動かせる → 理由を説明できる

4. 説明する:自分の記録を使って1分で話す

まず図を隠し、「利用者 → nginx → app」を紙に描いて、要求と応答の向きを声に出します。次の問いは答えと「なぜなら」を先に1文ずつ書いてから開きます。合わなかった理由と、戻って読む場所を記録します。読むだけで実行結果が増えることはありません。

問い1:Ubuntu、Docker、nginx、appは何を担当しますか?

Ubuntuは動かす土台のOS、Dockerはコンテナを動かす仕組みです。nginxは要求を受け取ってappへ渡し、appは必要な認証を確認して画面や数値を返します。Composeは設定をもとに複数のサービスの起動をまとめます。

問い2:/healthzは200、認証なしの画面は401。画面を200に直すべきですか?

認証なしで見せないことが目的なので、この401は期待どおりです。この実習では //metrics を認証で守ります。/healthz の200で分かるのは入口経由のappの応答まで。正しい認証での取得、監視の収集、バックアップからの復元は、それぞれの試験が必要です。迷ったら4件の要求と期待値へ戻り、「誰に何を許可する試験か」を確かめます。

問い3:nginxを停止すると、appが動いていても使えないのはなぜですか?

利用者が通る入口が停止するからです。この構成ではappの5000番をホストへ直接公開していません。ガイドの計画停止で観測する接続エラーと、nginx再開後の200を記録します。自分で停止・再開した結果は、自動復旧の実績とは分けます。

問い4:教材の期待値・自動テストの成功・自分の実測は、同じ証拠ですか?

それぞれ確認した対象と実施者が違います。教材の期待値は予想、自動テストの成功はそのテストが調べた範囲の結果です。どちらも、学習者本人が実機で操作し、意味を説明できた証拠にはなりません。面談では、自分が実行した日時・環境・コードの版・実結果を根拠にします。公開済みの過去試験は参考資料、未実施は NOT RUN。AIの補助を受けた範囲と、自分で操作・確認・説明できる範囲も分けます。

4行を書けば、説明に使う材料がそろう

  1. 目的と予想:【何を確認するために、どの応答を予想したか】
  2. 実行:【日時・環境・コードの版・自分が行った操作】
  3. 確認:【4件の実結果と期待値との比較・秘密情報を除いた記録の場所】
  4. 説明:【分かった理由・まだ未実施のこと・次に確認する1つ】

詳しく残すときは、主作品の初心者実習記録テンプレートを使います。初期値は NOT RUN。実行前に成功へ書き換えません。

面談で使う1分の型

「サーバー構築を学ぶ個人ラボで、入口のnginxがappへ要求を渡し、appが認証して数値を返す構成を学んでいます。私が【環境】で行ったのは【自分の操作】です。【確認した要求】の期待値【予想】に対し、【実結果】を得て、【記録の場所】に残しました。【その結果から説明できる理由】が分かりました。【未実施の範囲】はNOT RUNです。AIの補助は【使った範囲】で、自分が確認したのは【確認した範囲】です。」

翌日の復習:図の3つの役割と、200・401の意味を資料なしで言います。数日後はガイドを見ながら起動・確認・終了をもう一巡し、前回の記録と比べます。答えを暗唱するだけでなく、実際の結果から理由を説明できれば、この小さな実習は習得の目安を満たします。

所要目安 12〜20時間/自分のPC内の検証環境

読むだけで終わらせず、「予想する → 実行する → 証拠を残す → 説明する」の順で進めます

このページは成果物を見る順番ではなく、未経験者が手を動かす順番です。各段階は、目的・前提・操作・期待結果・失敗例・合格条件という同じ型で確認します。型をそろえるのは、次に何を見ればよいか迷わないためです。分からない言葉はインフラ基礎用語集(意味・具体例・確認方法つき)か、一言用語集へ戻ります。冒頭の所要目安12〜20時間は、「8段階の学習ルート」本編8つを合計した時間です。下の準備教材(環境構築・最初の30分・困ったとき・提出前レビュー)に使う時間は、この12〜20時間には含みません。

安全ルール(学習者が必ず守ること)

個人PCの中に作ったVM(1台のPCの中に作る仮想のパソコン)またはWSL2(Windowsの中でLinuxを動かす仕組み)で実施します。職場・学校・第三者のサーバーでは実行しません。ファイルの削除、Firewall(決めた条件で通信を許可・拒否する関所)の変更、SSH(離れた場所からサーバーを操作する通信)の設定変更は、元に戻せなくなる危険があります。実行する前に、スナップショット(今の状態をまるごと保存したもの)を取り、戻し方を確認します。パスワード、秘密鍵、トークンはコマンド行や公開ログへ書きません。

このコースの実測範囲(NOT RUN)

AWS(Amazonが提供するクラウドサービス)での構築、Slackへの実際の通知、72時間連続試験、別ホスト復元(別のサーバーへ復元し直すこと)は、手順は設計済みです。ただし、このリポジトリ(このサイトのファイル一式を置いている場所)では未実測(NOT RUN/手順はあるが実行していない)です。実際に行った範囲だけ、状態の表示を変更します。各Stepの証跡(作業した証拠として残すログや記録)では、MEASURED(実際に測った結果)とNOT RUN(未実行)をはっきり分けて示します。できていないことを、できたように見せないためです。

完全未経験者向けの準備教材

準備 0/所要目安 15〜120分

WSL2・VMを選ぶ

必要な空き容量、制限(できないこと)、導入の手順、削除の手順、スナップショットの取り方までを、コース別に確認します。

学習環境を0から用意する

準備 1/所要目安 30分

最初の成功体験

画面に出る表示例とその意味を読みながら進めます。ファイルの作成、確認、記録、片付けまでを一続きの流れで行います。

CUIの最初の30分

困ったとき/所要目安 都度5〜10分

止める・調べる・相談する

よくあるエラーから安全に復帰し、秘密情報を除いて質問します。

エラーFAQ質問テンプレート

提出前/所要目安 20〜40分

完成水準を見比べる

記入前の空のテンプレート、架空の完成例、そして採点根拠(どこを見て点を付けるか)を確認します。提出前に、自分の成果物がどこまで書けていれば合格かを知るためです。

成果物テンプレートと完成例

開始チェック

  • CPU、メモリ、ディスク、IPアドレスを自分の言葉で説明できる(Step 0の合格条件で確認)
  • 端末(キーボードで命令を打ち込む黒い画面)を開き、現在位置終了コード(直前のコマンドが成功したか失敗したかを表す数字)を確認できる
  • 8GB以上の空き容量があり、作った検証環境(練習用の使い捨ての環境)を後から消しても困らない(学習環境を0から用意するの必要容量と削除方法を参照)
  • パスワード、秘密鍵(本人だけが持つ電子の鍵ファイル)、トークン(サービスに入るための合言葉)を、Git(変更履歴を残す仕組み)へ保存しないと理解している(CUI入門 7. 変更コマンドの前に6点確認を参照)
  • 困ったら作業を止め、現象・直前操作・時刻を記録できる(エラーFAQ「まず行うこと」を参照)

不足があればCUI入門から始める CLI演習案件パックで練習する 詳細ハンズオンを開く

8段階の学習ルート

主作品を続ける入口はserverのLevel 0〜5です。以下はVM本体の構築・設計・引き渡しを補う教材です。教材ごとの役割を見て必要な段階を選び、対象と確認条件が同じ自分の記録は再利用します。Docker内とVM本体の確認は区別します。

チェックは、各カードの合格条件を自分の実行記録で確かめたときに付けます。「次の候補」は最初の未確認項目で、着手・合格の自動判定ではありません。チェックだけでは、実機の動作や本人の習得を証明できません。

チェックはこのブラウザだけに保存されます。日時・環境・実結果の記録は、実習記録テンプレートへ別に残します。

かんたんに言うとここからは、設計・構築・確認・復旧・引き渡しを段階ごとに学ぶ本編です。DockerのWebサービスと、VM本体のSSH・nginxは別の演習として記録します。各カードは「前提(始めてよい条件)→必要なものと影響→目的→操作→期待(うまくいった状態)→失敗例→合格(次へ進める条件)」の順に読みます。上から順に進め、合格の条件を満たしてから次のStepへ移ります。

STEP 0/30分未着手

環境と安全を確認

前提: 環境準備ガイド完了。一般ユーザー、8GB以上の空き、削除方法。

必要なもの: OSの種類、空き容量、IPアドレス、Gitの状態を調べられること。影響: この段階では設定を変更しない。

目的: 壊してよい範囲を決める。

操作: OS、容量、IP、Git状態を採録。例: bash scripts/capture-lab-evidence.sh preflightStep 0の詳細手順

期待: 環境情報ファイルが作られる。

失敗例: 実機とVMの取り違え。

合格: 削除方法と秘密情報の扱いを説明できる。

STEP 1/60分未着手

要件と構成を決める

前提: Step 0に合格していること。用語集でIPアドレス、Port(通信の入口番号)、RTO/RPO(RTOは復旧までにかけてよい時間の目標、RPOは失ってよいデータの時間の上限)を確認しておく。

必要なもの: 文書を書くことだけ。管理者権限もインターネット接続も要らない。影響: サーバーの設定は変わらない。

目的: 作業前に完成条件を決める。

操作: 利用者、通信、RTO/RPO、除外範囲を記入。(Step 1の記入項目

期待: 要件と構成図が対応する。

失敗例: 技術名だけで目的がない。

合格: 「誰が何のために使うか」を1分で説明できる。

STEP 2/90分未着手

最小OSを準備

前提: Step 1に合格していること。Ubuntu(Linuxの一種)のVM、スナップショット、コンソール経路(SSHが使えなくなっても画面から直接操作できる別の入口)を用意しておく。

必要なもの: インターネット接続と管理者権限。影響: システム設定が変わる。SSHの設定を変える前に、締め出されたときのために別の接続経路を残しておく。

目的: 初期状態を再現する。

操作: Ubuntu VM、一般ユーザー、SSH、更新を準備。例: ssh -i ~/.ssh/lab_key student@192.0.2.10Step 2の詳細手順

期待: 管理端末から鍵で接続できる。

失敗例: SSH変更後に接続不能。

合格: 再起動後も接続でき、バージョンを記録できる。

STEP 3/2時間未着手

手動で最小構築

前提: Step 2に合格していること。Package(導入しやすくまとめたソフト)、Service(動き続ける機能)、Port、Firewallの意味を用語集で確認しておく。

必要なもの: Docker(アプリを箱に入れて動かす仕組み)を導入すること。影響: Firewallの設定が変わる。失敗したらスナップショットから戻せる状態にしておく。

目的: 自動化の前に構成を理解する。

操作: A: DockerのWeb応答を自分のPC内で確認。B: VM本体のSSHとFirewallを別に確認。例: ss -lntpで待受portを確認(Step 3の詳細手順

期待: AのローカルWeb応答と、BのSSH許可・拒否を別々に確認する。

失敗例: UFWでDockerの公開ポートも遮断できたと思い込む。

合格: AとBの通信経路・実結果・ログ位置を図で説明できる。

STEP 4/2時間未着手

Ansibleで同じ状態を作る

前提: Step 3合格。Git差分とYAMLの基本を確認。

必要なもの: Ansible(設定作業を自動で行うツール)。影響: サーバーの設定が書き換わる。いきなり適用せず、syntax-check(書式の確認)とcheck(変更の予行演習)をapply(実際の適用)より先に実行する。

目的: 人による手順差を減らす。ここではVM本体にnginxを入れる独立した入門演習を行う。

操作: syntax-check、check、applyを順に実行。例: ansible-playbook -i inventory.ini playbook.yml --check --diffStep 4の詳細手順

期待: 同じ手順を2回目に実行すると、不要な変更が0になる(冪等性=同じ操作を何度実行しても結果が変わらない性質)。

失敗例: 変数未定義、権限不足。

合格: changed=0と差分を証跡に残せる。

STEP 5/2時間未着手

監視と通知を確認

前提: Step 4に合格していること。Metrics(時間ごとの数値データ)、Logs(出来事の記録)、Alert(異常を知らせる通知)、Runbook(状況別の対応手順書)を用語集で確認しておく。

必要なもの: Docker Composeで複数のコンテナをまとめて動かす構成。影響: 通知先は自分のPCの中だけで、外部サービスへは送らない。

目的: 利用者より先に異常へ気付く。

操作: メトリクス、ログ、ローカル通知を確認。例: docker compose up -dで監視スタックを起動(Step 5の詳細手順

期待: 発生時刻と復旧時刻が追える。

失敗例: 監視自身の停止を見逃す。

合格: アラートからRunbookへ移動できる。

STEP 6/3時間未着手

障害を切り分ける

前提: Step 5の正常値を採録済み。障害演習の共通ルールを確認。

必要なもの: 管理者権限。影響: わざとサービスを止めるので、動かなくなる。原因が分からなくならないよう、壊すのは1回に1つだけにする。どうなったら演習を中止するかを、先に書いておく。

目的: 勘ではなく事実で原因を狭める。

操作: 仮説、確認、結果、次の判断を記録。例: Dockerの lab-webdocker logs --tail 20 lab-web、VM本体のnginxは sudo journalctl -u nginx -n 50 で状態変化のログを確認(Step 6の詳細手順

期待: 復旧前後の証拠が残る。

失敗例: 記録前に再起動する。

合格: 原因と再発防止を第三者へ説明できる。

STEP 7/3時間未着手

復元して引き渡す

前提: Step 6に合格していること。バックアップ、checksum(ファイルが壊れていないか確かめる要約値)、RTO/RPOを用語集で確認しておく。

必要なもの: 新しく作るVMと、十分な空き容量。影響: 復元先のVMだけを変える。元のデータには一切手を加えない。

目的: バックアップが使えることを確かめる。

操作: 復元、整合性確認、RTO/RPO採録。例: sha256sum backup.tar.gzで値を計算し、保存済みの正しい値と比較。さらに復元後の内容と動作を確認(Step 7の詳細手順

期待: 手順だけで再現できる。

失敗例: バックアップを取っただけで終わり、実際に復元できるか試していない。

合格: 結果票、残課題、切り戻しを引き渡せる。

正常に動くことを確認した後に行う8つの障害演習

かんたんに言うとわざと故障を起こして、直す練習をします。下の表の矢印は、原因を探すときに確認する順番です。手前から順に「ここは正常」と確かめていき、最初に異常が見つかった場所が原因の候補になります。

障害、最初の確認、完了条件
障害最初の確認完了条件
SSH接続不可IP → 経路 → TCP/22(SSHが使う通信の入口) → Firewall → sshd(SSH接続を受け付ける側のプログラム)通信を止めている箇所を特定し、別の接続経路で復旧
Web応答なしDNS → TCP → Proxy → App → DB依存関係ごとに合否を記録
ディスク逼迫df(ディスク使用率を表示) → inode(ファイル管理情報の残数) → du(ディレクトリ配下の使用量を集計) → ログ削除前に原因と保持要件を確認
CPU高騰uptime(稼働時間と負荷平均を表示) → top(プロセスごとのCPU/メモリ使用率をリアルタイム表示) → ps(実行中プロセスの一覧) → ログ対象プロセスと発生時刻を特定
メモリ不足free(空きメモリ量を表示) → psjournal/OOM(メモリ不足によるプロセス強制終了)再起動だけに頼らず原因を記録
設定破損構文検査 → Git差分 → 直前変更修正または切り戻しを選択
TLS(通信を暗号化する仕組み)の期限異常名前解決 → 時刻 → 証明書の期限・SAN(証明書が有効な名前の一覧)更新手順と、期限切れ前に知らせる監視のしきい値を説明
バックアップ破損サイズ → checksum → 展開 → 復元代替世代を選び整合性を確認

安全な故障注入手順と記録テンプレート

修了判定と次の行動

かんたんに言うとここは自己採点のやり方です。左の5つの成果物がそろっているかを確かめ、右の5区分(各20点、合計100点)で自分に点を付けます。まだ実行していない項目は「NOT RUN」と記録し、推測で加点しません。必須区分の確認がそろうまで、修了判定は保留します。

必須成果物

  1. 要件・構成図・パラメータ
  2. 構築と確認の手順
  3. 再実行結果とテスト結果
  4. 障害記録と復旧記録
  5. 引き渡し報告と残課題

100点ルーブリック(採点の基準表)

  • 安全・秘密情報 20点
  • 設計の説明 20点
  • 再現可能な構築 20点
  • 監視・切り分け 20点
  • 復旧・記録・引き渡し 20点

80点以上かつ各区分12点以上を取れたら修了とします。未実施は「NOT RUN」と記録して加点せず、必須区分に未確認があれば修了は保留します。面接では「この範囲は実施済み、この範囲は未実施」と分けて説明できる状態を目指します。