━━━━━━━━━━━━━━━━━━━━ 【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サーバーである。