Ubuntu Serverで基本的なWebサーバーを構築

━━━━━━━━━━━━━━━━━━━━ 【Phase 1:Apacheを動かす】 ━━━━━━━━━━━━━━━━━━━━

1. Apache HTTP Serverをインストール

Ubuntu ServerにApache HTTP Serverをインストールした。

実行: sudo apt install apache2

インストール後、Apacheサービスの状態を確認した。

確認: systemctl status apache2

Active: active (running) を確認し、Apache HTTP Serverが正常に起動していることを確認した。

2. Apacheが80番ポートで待ち受けていることを確認

実行: sudo ss -tlnp | grep ':80'

ssはSocket Statisticsの略で、通信ソケットの状態を確認するコマンド。

-t = TCP -l = LISTEN中 -n = 数値表示 -p = 使用しているプロセスを表示

結果として、apache2がTCP 80番ポートでLISTENしていることを確認した。

3. UFWでHTTP通信を許可

ブラウザからUbuntu Serverへアクセスしたところ、最初はWebページを表示できなかった。

UFWの設定を確認した。

確認: sudo ufw status

HTTP用のTCP 80番ポートを許可した。

実行: sudo ufw allow 80/tcp

その後、UFW上で80/tcpがALLOWになっていることを確認した。

4. Ubuntu ServerのローカルIPアドレスを確認

Wi-FiインターフェースのIPv4アドレスを確認した。

実行: ip -4 addr show wlp3s0

Ubuntu Serverがローカルネットワーク上でIPv4アドレスを取得していることを確認した。

5. ApacheがUbuntu Server自身から応答することを確認

Ubuntu Server上で以下を実行した。

実行: curl -I http://127.0.0.1

127.0.0.1はlocalhostで、自分自身を表すIPアドレス。

HTTP/1.1 200 OK が返り、ApacheがUbuntu Server内部では正常にHTTPレスポンスを返していることを確認した。

6. クライアントPCからUbuntu Serverまで通信できることを確認

別のPCからUbuntu ServerのローカルIPアドレスへpingを実行した。

実行: ping -c 5 サーバーのローカルIPアドレス

-c 5は5回だけpingを送る指定。

0% packet lossを確認し、クライアントPCからUbuntu Serverまでネットワーク通信が届いていることを確認した。

7. クライアントPCからHTTP通信できることを確認

クライアントPCからcurlを実行した。

実行: curl http://サーバーのローカルIPアドレス

ApacheからHTML本文が返り、クライアントPCからUbuntu Serverの80番ポートまでHTTP通信できていることを確認した。

8. ブラウザからApacheのWebページを表示

クライアントPCのブラウザから以下の形式でアクセスした。

http://サーバーのローカルIPアドレス

ApacheのWebページが表示されることを確認した。

Webページが表示される基本的な流れは以下。

ブラウザ → HTTPリクエスト → Ubuntu ServerのIPアドレス → TCP 80番ポート → Apache HTTP Server → HTMLファイル → HTTPレスポンス → ブラウザ表示

━━━━━━━━━━━━━━━━━━━━ 【Phase 2:Webページを編集する】 ━━━━━━━━━━━━━━━━━━━━

9. ApacheのDocument Rootを確認

ApacheでWebページとして公開するファイルが置かれている場所を確認した。

/var/www/html/

Apacheの標準的なDocument Rootとして使用されている。

主なApache関連ディレクトリも確認した。

/etc/apache2/ Apacheの設定ファイルを保存する場所。

/var/www/html/ Webコンテンツを保存するDocument Root。

/var/log/apache2/ Apacheのアクセスログやエラーログを保存する場所。

10. デフォルトのindex.htmlを確認

実行: ls -l /var/www/html/

Apacheの標準ページとして使用されていたindex.htmlを確認した。

さらに、ファイルの先頭20行を確認した。

実行: head -n 20 /var/www/html/index.html

headはファイルの先頭部分を表示するコマンド。 -n 20は20行表示する指定。

11. Apache標準ページをバックアップ

既存のindex.htmlを残すため、バックアップを作成した。

実行: sudo cp /var/www/html/index.html /var/www/html/index.html.bak

cpはファイルをコピーするコマンド。

12. index.htmlの内容を空にする

実行: sudo truncate -s 0 /var/www/html/index.html

truncateはファイルサイズを変更するコマンド。 -s 0はファイルサイズを0バイトにする指定。

index.htmlというファイル自体は残したまま、内容だけを空にした。

13. 自分のHTMLを書き込む

実行: echo '<h1>Hack My Ubuntu Server</h1>' | sudo tee /var/www/html/index.html

echoでHTML文字列を出力し、|(パイプ)でteeへ渡し、teeがindex.htmlへ書き込んだ。

処理の流れは以下。

echo → | → tee → /var/www/html/index.html

その後、ブラウザを更新し、自分で書き込んだHTMLがApache経由で表示されることを確認した。

━━━━━━━━━━━━━━━━━━━━ 【Phase 3:Linuxの権限を確認する】 ━━━━━━━━━━━━━━━━━━━━

14. Document Rootのディレクトリ権限を確認

実行: ls -ld /var/www/html/

-l = 詳細表示 -d = ディレクトリの中身ではなく、ディレクトリ自体を表示

結果として以下の形式を確認した。

drwxr-xr-x root root /var/www/html/

権限は以下の3つに分かれる。

rwx | r-x | r-x 所有者 | グループ | その他

dはディレクトリを意味する。 r = read w = write x = ディレクトリの場合は、そのディレクトリを辿る・中へアクセスする権限を意味する。

15. index.htmlファイル自体の権限を確認

実行: ls -l /var/www/html/index.html

結果として以下を確認した。

-rw-r--r-- root root index.html

先頭の-は通常ファイルを意味する。

権限は以下。

rw- | r-- | r-- 所有者 | グループ | その他

所有者rootだけが読み書き可能。 グループとその他のユーザーは読み取りのみ可能。

HTMLファイルには実行権限xは付いていない。 HTMLはApacheが読み取ってブラウザへ返すファイルであり、通常は直接実行する必要がないため。

16. 一般ユーザーとroot、sudoの関係を確認

SSHでログインしているユーザーはrootではなく一般ユーザー。

Ubuntuでは通常、普段は一般ユーザーで作業し、管理者権限が必要なときだけsudoを使う。

sudo コマンド = そのコマンドをroot権限で実行する。

rootとしてログインしている場合は、すでにroot権限を持っているため、基本的にsudoは必要ない。

━━━━━━━━━━━━━━━━━━━━ 【Phase 4:HTTP通信とログを観察する】 ━━━━━━━━━━━━━━━━━━━━

17. Apacheのアクセスログを確認

実行: sudo tail /var/log/apache2/access.log

tailはファイルの末尾を表示するコマンド。

アクセスログには、クライアントから送られたHTTPリクエストが記録されていた。

例: GET / HTTP/1.1 200 User-Agent クライアントIPアドレス アクセス日時

200はHTTP Status Codeの200 OKで、正常に処理されたことを意味する。

404は404 Not Foundで、要求されたファイルが存在しなかったことを意味する。

18. アクセスログをリアルタイムで確認

実行: sudo tail -f /var/log/apache2/access.log

-f = follow 新しいログが追加されるたびにリアルタイムで表示する。

ブラウザからWebページへアクセスすると、GET / HTTP/1.1 などのログがリアルタイムで追加されることを確認した。

終了するときはCtrl + Cを使用した。

19. curlでHTTPレスポンスヘッダーを確認

クライアントPCから以下を実行した。

実行: curl -I http://サーバーのローカルIPアドレス

-IはHTTPレスポンスヘッダーのみを取得する指定。

以下のような情報を確認した。

HTTP/1.1 200 OK Server: Apache/2.4.58 (Ubuntu) Last-Modified ETag Content-Length Content-Type: text/html

Apacheの種類やバージョン、コンテンツの種類、サイズなどがHTTPレスポンスヘッダーから確認できた。

20. curlでHTTP通信全体を確認

実行: curl -v http://サーバーのローカルIPアドレス

-v = verbose 通信内容を詳しく表示する指定。

クライアントから送信したHTTPリクエストを確認した。

GET / HTTP/1.1 Host User-Agent Accept

Apacheから返されたHTTPレスポンスも確認した。

HTTP/1.1 200 OK Server Content-Length Content-Type

最後にHTML本文も返された。

curlの表示では、

> = クライアントからサーバーへ送信した内容 < = サーバーからクライアントへ返された内容

として確認できた。

21. curlのHTTPリクエストがApacheログに残ることを確認

Ubuntu Server側で以下を実行した。

実行: sudo tail -n 5 /var/log/apache2/access.log

-n 5 = 最後の5行だけ表示する指定。

curl -Iで送ったリクエストはHEAD / HTTP/1.1として記録された。

curl -vで送ったリクエストはGET / HTTP/1.1として記録された。

User-Agentにはcurlのバージョン情報が記録されていた。

これにより、

クライアントがHTTP Requestを送信 → Apacheが受信 → ApacheがHTTP Responseを返す → Apacheがaccess.logへ記録

という一連の流れを、クライアント側とサーバー側の両方から確認した。

━━━━━━━━━━━━━━━━━━━━ 【Phase 5:完成状態を整理】 ━━━━━━━━━━━━━━━━━━━━

22. 基本的なWebサーバー構築の完了

今回の構成では、Ubuntu Server上でApache HTTP Serverを動作させ、TCP 80番ポートでHTTP通信を受け付け、Document Rootに置いたHTMLファイルを別端末のブラウザへ配信できる状態まで構築した。

また、UFW、Linuxパーミッション、Apacheアクセスログ、curlによるHTTP Request / Responseの確認まで実施した。

今回構築したものは、LAN内で動作する基本的なHTTP Webサーバーである。

一覧へ戻る