自作LinuxでWebサーバーを起動する
連載ナビ
この連載は「Linuxを使えるようになる」ではなく、「Linuxがどう動いているのか」を理解するための実践シリーズです。
今回は Linuxを理解する 〜 LFSで学ぶLinux内部構造 〜 の Part 7 / 第2回として、仕組みのつながりを意識しながら学びます。
- 前回: nginxをソースからビルドする
- 次回: なし(シリーズ最終回)
シリーズの最終到達点です。
自作Linux上でnginxを起動し、HTTP応答を確認します。
なぜこの確認が重要か
「nginxが起動した」だけでは、実運用では不十分です。
最低でも次の3点を分けて確認できると、障害対応が速くなります。
1. プロセスは起動しているか(systemd / PID)
2. ソケットは待ち受けしているか(TCP 80)
3. アプリとして応答しているか(HTTPヘッダ・ステータス)
この3段階で確認すると、
「起動失敗」「ポート競合」「アプリ設定ミス」を切り分けやすくなります。
図解テキスト
boot complete
-> systemd
-> nginx service
-> listen :80
-> curl/browser response
この回で実行するコマンド
上から順番に実行すれば、この回の内容を体験できます。
まずはそのままコピペして実行し、次に1行ずつ意味を確認してください。
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx
ss -ltnp | grep :80
curl -i http://127.0.0.1
ハンズオン手順
1. ターミナルを開いて、上のコマンドを1行ずつ実行する
2. 出力結果を見て、分かったことを1行メモする
3. エラーが出たら、そのエラーメッセージをそのまま残す
4. 各コマンドが何を確認するためのものかを説明してみる
追加で見るべき観点
### 1. systemd 管理下での状態確認
systemctl status nginx --no-pager
systemctl is-enabled nginx
active (running)ならプロセスは生存enabledなら再起動後も自動起動
### 2. エラー時のログ確認
journalctl -u nginx -b --no-pager | tail -n 50
tail -n 50 /usr/local/nginx/logs/error.log
- systemd 側で失敗しているか
- nginx 自身の設定/権限エラーか
### 3. 設定の整合性確認
/usr/local/nginx/sbin/nginx -t
cat /usr/local/nginx/conf/nginx.conf | sed -n '1,200p'
syntax is ok/test is successfulを確認listen 80;とrootの設定が意図通りかを確認
典型トラブルと対処
### bind() failed (98: Address already in use)
- 原因: 既に別プロセスが80番ポートを使用
- 対処:
ss -ltnp | grep :80
競合プロセスを停止してから nginx を再起動します。
### Permission denied
- 原因: 証明書/ログ/ドキュメントルートの権限不足
- 対処: nginx 実行ユーザーの読み書き権限を見直す
### curl で接続できない
- 原因候補: ファイアウォール、listen設定、起動失敗
- 対処順:
1. systemctl status nginx
2. ss -ltnp | grep :80
3. curl -v http://127.0.0.1
図解: リクエスト処理の最小経路
Browser / curl
-> TCP :80
-> nginx master
-> nginx worker
-> document root (index.html)
-> HTTP 200 response
この経路のどこで止まっているかを意識すると、
ログとコマンド結果を結びつけて診断できます。
チェックポイント
- コマンドが最後まで実行できた
- 出力の中で重要な値を1つ説明できる
- 次の回に進む前に、分からない単語を1つ調べた
今回理解できたこと
- Linux内部の各要素が1つのサービス起動に集約される
- ブラックボックスを減らすと自力で原因を追える
- 起動確認は「プロセス・ポート・HTTP応答」の3層で見ると再現性が上がる