はじめに
どうも。
インフラ/クラウドエンジニアを目指して、毎回Linuxコマンドにわからされとる新人1年目です。
ここまでの流れをざっくり振り返ると、だいたいこんな感じ。
1回目、気づいたら /root におった。
管理者権限の玉座に、なぜか強制着席。傀儡の王、ここに爆誕や。
2回目、rm -r の強さを知った。
「これ会社で雑に打ったら、たぶん普通に終わるやつやん……」と、静かに悟った。
3回目、ログ確認・リダイレクト・パイプを練習。
grep と sort | uniq -c を打って、「あれ、おれ今ちょっとインフラっぽいことしてへん?」と勘違いした。
4回目、IP・DNS・ping・curl を触った。
HTTP/2 200 が返ってきて「勝ったな」と思った。
実際は通信が通っただけ。浮かれるの、毎度早すぎる。
そして今回。
ポート番号・localhost・HTTPサーバー です。
出ました。
急にサーバーっぽい単語が並びはじめた。
「8000番ポートで待ち受ける」とか「localhostにcurlする」とか、字面だけ見たらもう完全に"仕事してる人"のそれ。
中身はまだバリバリ初心者なんやけど、見た目だけはちょっとずつインフラっぽくなってきました。
見た目から入るの、大事。知らんけど。
やることはシンプルで、Pythonの簡易HTTPサーバーを立てて、ss で待ち受けポートを見て、curl でアクセスして、最後に server.log を読む。この一連の流れを通しでやってみます。
※この記事は、Linux初心者が
localhost:8000にアクセスして、ちょっとだけサーバー運用してる気分になった記録です。
今回やること
ざっくり並べるとこのへん。
- ポート番号の意味を知る
- TCP / UDP をざっくり理解する
- HTTP / HTTPS の代表的なポートを確認する
-
ss -tulnで待ち受けポートを見る - Pythonの簡易HTTPサーバーを起動する
-
curlでlocalhost:8000にアクセスする -
server.logを確認する -
psでプロセスを探す -
killでHTTPサーバーを止める
学習環境
| 項目 | 内容 |
|---|---|
| OS | Windows |
| Linux環境 | WSL / Ubuntu |
| ユーザー名 | tama |
| 作業ディレクトリ | /home/tama/infra-study/linux-lesson5 |
| Python | Python 3.12.3 |
今回のゴール
今回のゴールは、ローカルでHTTPサーバーを立てて、ポート番号・待ち受け・アクセスログの流れを通しで体験することです。
チェックリストにするとこんな感じ。
- 5回目用フォルダを作成する
- Python3が使えるか確認する
-
index.htmlを作成する - Pythonの簡易HTTPサーバーを起動する
-
ss -tulnで8000番ポートの待ち受けを確認する -
curlでlocalhost:8000にアクセスする -
curl -Iでヘッダーを確認する -
server.logを読む -
psでプロセスを確認する -
killでサーバーを停止する
これ全部できたら、今回はもう合格でええことにします。
1. 5回目用フォルダを作成する
まずは今回の作業部屋を用意します。
mkdir -p ~/infra-study/linux-lesson5
やってることは、~/infra-study の中に linux-lesson5 というフォルダを作る、それだけ。
-p は、途中のフォルダがまだ無くてもまとめて作ってくれる指定です。地味やけど便利。
で、作ったフォルダへ引っ越し。
cd ~/infra-study/linux-lesson5
ちゃんと着いたか、現在地を確認します。
pwd
実行結果:
/home/tama/infra-study/linux-lesson5
うん、ちゃんと5回目用フォルダにおる。
pwd はもう反射で打ちます。
迷子防止。
Linux初心者、ほんまに気づいたら知らん場所におるので。……私です。
2. ポート番号とは何か
ネットワーク通信では、IPアドレスだけやなくて ポート番号 ってやつも使います。
ざっくりイメージするとこう。
IPアドレス = 建物の住所
ポート番号 = 建物の中の受付窓口
同じサーバー(建物)でも、
- Webサイト用の入口
- SSH接続用の入口
- データベース用の入口
みたいに、用途ごとに窓口がちゃんと分かれてる、と。
入口を間違えたら門前払い、って考えると分かりやすいかもしれません。
よく見るポート番号はこのあたり。
| ポート番号 | 用途 |
|---|---|
22 |
SSH |
53 |
DNS |
80 |
HTTP |
443 |
HTTPS |
3306 |
MySQL |
5432 |
PostgreSQL |
8000 |
開発用HTTPサーバーなど |
今回の主役は 8000 番ポートです。
8000番、開発環境でめっちゃ見る顔してる。
まだ友達ではない。
3. TCP / UDP をざっくり理解する
通信には大きく分けて TCP と UDP があります。
| 種類 | ざっくり説明 | 使われる例 |
|---|---|---|
| TCP | 相手と接続して、届いたか確認しながら通信する | HTTP, HTTPS, SSH |
| UDP | 細かい確認は省いて、軽く速く送る | DNS, 音声通話, 動画配信など |
今の段階で完璧に理解しようとせんでもよさそう。
とりあえずこれくらいの粒度で覚えときます。
Web通信やSSHはだいたいTCP
DNSはUDPも使う
深掘りしたらたぶん沼。
今は入口だけ覗いて、そっと閉じます。足取られたないので。
4. Python3が使えるか確認する
今回はPythonの簡易HTTPサーバーを使うので、まずはPython3が動くか確認。
python3 --version
実行結果:
Python 3.12.3
おった。使える。
Python、ここで登場。
Linux学習してるはずやのに急にPythonが顔出してきて、「お前も来るんかい」とちょっと笑いました。
とはいえ今回はプログラムをガッツリ書くわけやなくて、Pythonにもともと付いてる簡易HTTPサーバー機能を借りるだけ。お世話になります。
5. 表示用のindex.htmlを作成する
HTTPサーバーで返すための中身を用意します。
echo "Hello from Linux lesson 5" > index.html
index.html ってファイルを作って、その中に Hello from Linux lesson 5 と書き込む、という意味。
ちゃんと書けてるか中身を確認。
cat index.html
実行結果:
Hello from Linux lesson 5
HTTPサーバーにアクセスしたら、この文字が返ってくる予定です。
予定。
初心者なんで、まだ何が起きるか完全には信じてません。
6. Pythonの簡易HTTPサーバーを起動する
いよいよ本番。8000番ポートでHTTPサーバーを立ち上げます。
python3 -m http.server 8000 > server.log 2>&1 &
一行に色々詰まってるので、分解するとこう。
| 部分 | 意味 |
|---|---|
python3 -m http.server 8000 |
8000番ポートで簡易HTTPサーバーを起動 |
> server.log |
標準出力を server.log に保存 |
2>&1 |
標準エラーも標準出力と同じ場所へ送る |
& |
バックグラウンドで実行 |
2>&1 が出てきた瞬間、ちょっと顔が曇った。
3回目で標準出力と標準エラーをやってるので、なんとなくは分かる。
でも、ほんま「なんとなく」。
今は「エラーも同じログにまとめとくやつ」くらいの理解で握っておきます。完璧は後回し。
7. ssで8000番ポートの待ち受けを確認する
サーバーがちゃんと立ったか、ss で確認します。
ss -tuln | grep 8000
意味は、待ち受け中のTCP / UDPポート一覧から 8000 を含む行だけ抜き出す、ということ。
実行結果:
tcp LISTEN 0 5 0.0.0.0:8000 0.0.0.0:*
注目すべきはここ。
LISTEN
0.0.0.0:8000
要するに、
8000番ポートで接続待ちしている
ということ。
つまりPythonのHTTPサーバーが、8000番でちゃんとスタンバってる。
ss -tuln のオプション
| オプション | 意味 |
|---|---|
-t |
TCPを表示 |
-u |
UDPを表示 |
-l |
LISTEN中のものを表示 |
-n |
名前解決せず、数字のまま表示 |
ss -tuln、字面はもう完全に呪文。
でも実務でめっちゃ出そうな顔してるので、覚えます。たぶん。
8. curlでlocalhost:8000にアクセスする
立てたサーバーに、curl で自分からアクセスしてみます。
curl http://localhost:8000
自分自身の8000番で動いてるHTTPサーバーへアクセスする、という意味。
実行結果:
Hello from Linux lesson 5
成功。
さっき index.html に書いた中身が、ちゃんと返ってきた。
流れにするとこう。
index.html を作る
↓
HTTPサーバーを起動する
↓
localhost:8000 にアクセスする
↓
index.html の中身が返ってくる
ちょっとサーバーっぽい。
いや、ちょっとやなくて、これもう実際サーバーやん。
簡易とはいえ、立派にサーバーしてる。
9. curl -Iでヘッダーだけ確認する
次は本文やなくて、ヘッダーだけ覗いてみます。
curl -I http://localhost:8000
ローカルHTTPサーバーにアクセスして、レスポンスヘッダーだけ表示する、という意味。
実行結果:
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.12.3
Date: Mon, 22 Jun 2026 06:53:26 GMT
Content-type: text/html
Content-Length: 26
Last-Modified: Mon, 22 Jun 2026 06:36:23 GMT
まず見るのはここ。
HTTP/1.0 200 OK
意味はシンプルに、
HTTP通信が成功した
他の行もそれぞれ意味があります。
| 表示 | 意味 |
|---|---|
Server: SimpleHTTP/0.6 Python/3.12.3 |
Pythonの簡易HTTPサーバーが応答している |
Content-type: text/html |
HTMLとして返している |
Content-Length: 26 |
本文サイズが26バイト |
Last-Modified |
ファイルの最終更新日時 |
Server: SimpleHTTP/0.6 Python/3.12.3 が出てるの、地味におもろい。
「はい、Pythonの簡易サーバーです」って、自分から自己紹介してくれてる。
礼儀正しいやん。
10. localhostとは何か
さっきから出てる localhost。これは自分自身を指します。
localhost = 自分自身
127.0.0.1 = 自分自身
なので、
curl http://localhost:8000
これは「自分自身の8000番ポートへアクセスする」という意味。
ほぼ同じことが、こっちでもできます。
curl http://127.0.0.1:8000
IPアドレス 127.0.0.1 を使って、自分自身の8000番へアクセスする、という意味。
localhost は自分自身。
ネットワーク初心者には、これかなり大事そう。
自分でサーバーを立てて、自分でアクセスする。
字面だけ見たら完全に一人芝居やけど、学習ではこれがめちゃくちゃ便利なんよな。
11. server.logを確認する
サーバーへのアクセス記録を見てみます。
cat server.log
HTTPサーバーのアクセスログを表示する、という意味。
実行結果:
127.0.0.1 - - [22/Jun/2026 15:53:06] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [22/Jun/2026 15:53:26] "HEAD / HTTP/1.1" 200 -
最初に見たときは、
127.0.0.1 - - [日時] "GET / HTTP/1.1" 200 -
みたいな謎の文字列にしか見えんかった。
またログや。
ログはいつも、無言で事実だけ突きつけてくる。
でも分解したら、意外とちゃんと読めます。
12. server.log の1行目を分解する
1行目はこれ。
127.0.0.1 - - [22/Jun/2026 15:53:06] "GET / HTTP/1.1" 200 -
バラすとこうなります。
| 部分 | 意味 |
|---|---|
127.0.0.1 |
アクセスしてきた相手。今回は自分自身 |
- - |
ユーザー情報など。今回は記録なし |
[22/Jun/2026 15:53:06] |
アクセス日時 |
"GET / HTTP/1.1" |
HTTPリクエストの内容 |
200 |
ステータスコード。成功 |
- |
レスポンスサイズなど。今回は未記録 |
これは、さっきのこのコマンドに対応してます。
curl http://localhost:8000
ローカルHTTPサーバーにアクセスして、index.html の中身を取りに行ったやつ。
流れにすると、
curlで本文を取りに行った
↓
サーバーが200で返した
↓
server.logにGETとして記録された
ということ。
自分の行動が、ちゃんとログに刻まれてる。なんか嬉しい。
13. server.log の2行目を分解する
2行目はこれ。
127.0.0.1 - - [22/Jun/2026 15:53:26] "HEAD / HTTP/1.1" 200 -
これは、こっちのコマンドに対応してます。
curl -I http://localhost:8000
ローカルHTTPサーバーへアクセスして、レスポンスヘッダーだけ取りに行ったやつ。
curl -I は本文を取らずにヘッダーだけ確認するので、ログには GET やなくて HEAD と残ってる。
ちゃんと使い分けが記録されとるの、地味に賢い。
| メソッド | 意味 | 今回のコマンド |
|---|---|---|
GET |
本文も取得する | curl http://localhost:8000 |
HEAD |
ヘッダーだけ取得する | curl -I http://localhost:8000 |
今回はどっちも 200。
"GET / HTTP/1.1" 200
"HEAD / HTTP/1.1" 200
つまり、
本文取得も成功
ヘッダー確認も成功
やっとログの顔が見えてきた。
怖い顔してると思ってたら、ただの真面目な記録係やった。ごめんな。
14. プロセスを確認する
サーバーがどのプロセスで動いてるか、ps で探します。
ps aux | grep 8000
動いてるプロセス一覧から 8000 を含む行を探す、という意味。
実行結果:
tama 293 0.0 0.1 ... python3 -m http.server 8000
tama 337 0.0 0.0 ... grep --color=auto 8000
大事なのはこの行。
python3 -m http.server 8000
Pythonの簡易HTTPサーバーが、ちゃんと生きて動いてる証拠です。
先頭付近の 293 がPID。
PID = プロセスID
動いてるプログラムを識別する番号、ってことですね。
で、もう一個の、
grep --color=auto 8000
これは検索に使った grep 自身。
最初は「え、まだ何か動いてる?」ってなりがちやけど、これは検索コマンドそのものが一覧に映り込んでるだけ。
鏡に自分が写ってるだけ、みたいなもんです。びっくりせんでええ。
15. killでHTTPサーバーを停止する
確認したPIDを使って、サーバーを止めます。
kill 293
PIDが 293 のプロセスを終了する、という意味。
実行結果:
[1]+ Terminated python3 -m http.server 8000 > server.log 2>&1
Terminated = ちゃんと終わった、ということ。
念のため、止まったか確認。
ps aux | grep 8000
8000 を含むプロセスが残ってへんか見ます。
実行結果:
tama 339 0.0 0.0 ... grep --color=auto 8000
python3 -m http.server 8000 が消えて、grep だけになってる。
つまり、サーバーはちゃんと停止できました。
kill、名前がいちいち物騒。
でも今回は自分で立てた練習用サーバーを自分で畳んだだけなので、セーフ。完全にセーフ。
16. 今回の流れを図で整理する
ここまでの流れを通しで並べるとこう。
index.html を作成
↓
python3 -m http.server 8000 でHTTPサーバー起動
↓
ss -tuln で8000番ポートのLISTENを確認
↓
curl http://localhost:8000 で本文取得
↓
curl -I http://localhost:8000 でヘッダー確認
↓
server.log でアクセス記録を確認
↓
ps aux | grep 8000 でプロセス確認
↓
kill でサーバー停止
この流れ、かなり大事そう。
立てて、生きてるか確認して、アクセスして、ログを見て、最後にちゃんと止める。
「動かして、確かめて、片付ける」までが一周。
ちょっとだけ実務っぽい。ほんまにちょっとだけ。
17. 今回使ったコマンドまとめ
| コマンド | 意味 |
|---|---|
pwd |
現在地を確認する |
python3 --version |
Python3のバージョンを確認する |
echo "..." > index.html |
index.html を作成する |
python3 -m http.server 8000 |
8000番ポートで簡易HTTPサーバーを起動する |
ss -tuln |
TCP / UDPの待ち受けポートを確認する |
grep 8000 |
8000 を含む行だけ探す |
curl http://localhost:8000 |
ローカルHTTPサーバーにアクセスする |
curl -I http://localhost:8000 |
ヘッダーだけ確認する |
cat server.log |
サーバーのアクセスログを表示する |
ps aux |
実行中のプロセスを表示する |
kill PID |
指定したPIDのプロセスを終了する |
18. 今回のMarkdownチートシート的まとめ
今回も記事を見やすくするのにMarkdownを使いました。
| Markdown記法 | 用途 |
|---|---|
# / ## / ###
|
見出し |
* |
箇条書き |
- [x] |
チェックリスト |
`command` |
インラインコード |
| ```bash | コマンド用コードブロック |
| ```text | 実行結果用コードブロック |
> |
補足・引用 |
--- |
区切り線 |
| 表 | コマンドやログの整理 |
Markdownを使うと、ただのメモでも一気に記事っぽい顔になる。
中身はまだ初心者やのに、表を挟むだけでちょっと賢そうに見える。
ありがたい話です。
19. 今回の学び
今回つかんだのはこのあたり。
ポート番号は通信先の窓口のようなもの
HTTPは基本80番、HTTPSは基本443番
開発用HTTPサーバーでは8000番などを使うことがある
ss -tuln で待ち受けポートを確認できる
LISTEN は接続待ち状態
localhost は自分自身
127.0.0.1 も自分自身
curl でHTTPアクセスを確認できる
curl -I はヘッダーだけ確認する
server.log にはHTTPサーバーへのアクセス記録が残る
GET は本文取得
HEAD はヘッダー取得
HTTPステータスコード 200 は成功
ps aux でプロセスを確認できる
kill でプロセスを停止できる
特に印象に残ったのは、ss -tuln と server.log。
ss -tuln | grep 8000 で 8000番が LISTEN してるのを見たとき、「あ、ほんまに待ち受けてるんや」って、ちょっと感動した。
あと、curl でアクセスした結果が server.log に GET や HEAD として残ってるのもおもろかった。
自分でアクセスする
↓
ログに残る
↓
ログを読む
↓
何が起きたか確認できる
これ、かなり大事そう。
ログは嘘をつかへん。
たぶん。
読み手の私が、嘘みたいに理解できてへんだけ。ぐすん。
20. 次回やること
次回はネットワーク基礎の続きとして、このへんを触りたい。
HTTP / HTTPS の違い
ステータスコードの追加確認
ポート番号の復習
DNSのもう少し詳しい仕組み
curlのオプション追加練習
ssコマンドの見方をもう少し深掘り
ここまでで curl・ping・getent hosts・ss と、通信確認っぽいコマンドがだいぶ増えてきました。
そろそろ頭の中のメモリが悲鳴あげてる。
でもまあ、地道にいきます。
まとめ
5回目は、ポート番号・localhost・HTTPサーバーを中心に学習しました。
今回できたことはこれ。
- 5回目用フォルダを作成した
- Python3のバージョンを確認した
-
index.htmlを作成した - Pythonの簡易HTTPサーバーを8000番ポートで起動した
-
ss -tuln | grep 8000で待ち受けを確認した -
curl http://localhost:8000で本文を取得した -
curl -I http://localhost:8000でヘッダーを確認した -
server.logでアクセスログを確認した -
ps aux | grep 8000でプロセスを確認した -
killでHTTPサーバーを停止した
まだまだ基礎の途中やけど、今回は「サーバーを動かして、確認して、止める」っていう一連の手触りがちゃんとあった。
今までより、少しだけインフラっぽかったです。
少しだけ。
調子には乗りません。たぶん。
次回も引き続き、ネットワーク基礎を進めていきます。