@@ -46,7 +46,7 @@ Building dependency tree... Done
4646Reading state information... Done
474710 packages can be upgraded. Run 'apt list --upgradable' to see them.
4848
49- root@a0da070e286f:/# apt install -y apache2 apache2-dev nginx neovim
49+ root@a0da070e286f:/# apt install -y apache2 apache2-dev nginx telnet neovim
5050Reading package lists... Done
5151Building dependency tree... Done
5252Reading state information... Done
@@ -101,6 +101,7 @@ Webサーバのシンプルな機能は前述の通りですが、実際には
101101- nginx
102102
103103あたりでしょうか。Linuxサーバー上で動かすのであればほぼApacheとnginxの2択になると思います。
104+ (参考: [ June 2025 Web Server Survey] ( https://www.netcraft.com/blog/june-2025-web-server-survey/ ) )
104105
105106また最近ではenvoyやtraefikなど、クラウドやKubernetesという文脈ではプロキシ機能に特化したソフトウェアが使われることも多くなりました。
106107
@@ -110,12 +111,11 @@ Webサーバのシンプルな機能は前述の通りですが、実際には
110111
111112「Apache HTTP Server」はnginxと並んで2大勢力を誇っているWebサーバソフトウェアのひとつです。 CentOSではhttpdという名前になっていたり、単にApacheと呼ばれます。
112113
113- 「Apache HTTP Server」は「Apacheソフトウェア財団」によって管理されるOSSで、20年以上の歴史を持ちます。 世界的にもっとも普及したWebサーバで、LAMP(Linux, Apache, MySQL, PHP)環境のひとつにも挙げられ、nginxと並んで2大勢力を誇ります。
114- (参考: [ June 2024 Web Server Survey] ( https://www.netcraft.com/blog/june-2024-web-server-survey/ ) )
114+ 「Apache HTTP Server」は「Apacheソフトウェア財団」によって管理されるOSSで、20年以上の歴史を持ちます。 世界的にもっとも普及したWebサーバで、Webサイトの定番OSS構成としてLAMP(Linux, Apache, MySQL, PHP)があげられる時期もあり、nginxと並んで2大勢力を誇っていました。
115115
116116正式名称は「Apache HTTP Server」ですが、歴史的経緯などからCentOSではhttpdという名前になっていたり、単にApacheと呼ばれたりします。
117117
118- 以前は大量のリクエストを受けた際にプロセスをforkできず、リクエストを捌き切れなくなる(いわゆるC10K問題)ことが問題視されました。 その際nginxをはじめとして新しいWebサーバーソフトウェアが登場しましたが、Apache自体もworkerやevent MPMといった新しい仕組みを導入し、動作も安定していることからいまだに高いシェアを占めています 。
118+ 以前は大量のリクエストを受けた際にプロセスをforkできず、リクエストを捌き切れなくなる(いわゆるC10K問題)ことが問題視されました。 その際nginxをはじめとして新しいWebサーバーソフトウェアが登場しましたが、Apache自体もworkerやevent MPMといった新しい仕組みを導入し、多機能で動作も安定していることからいまだに高いシェアを占めています 。
119119
120120### nginx
121121
@@ -132,13 +132,33 @@ nginxは2004年頃、当時のWebサーバーが抱えていたパフォーマ
132132
133133### HTMLファイルの配信(check1)
134134
135- まずはApacheを起動しましょう。
135+ まずはApacheを起動してデフォルトのページを見てみましょう。
136+ ページの確認には、CLIでの定番であるcurlコマンドを使ってみるのがよいでしょう
136137
137138``` shell-session
138139root@a0da070e286f:/# service apache2 start
140+ root@a0da070e286f:/# curl http://localhost
141+
142+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
143+ <html xmlns="http://www.w3.org/1999/xhtml">
144+ <head>
145+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
146+ <title>Apache2 Debian Default Page: It works</title>
147+ <style type="text/css" media="screen">
148+
149+ (中略)
150+
151+ </div>
152+ </div>
153+ <div class="validator">
154+ </div>
155+ </body>
156+ </html>
139157```
140158
141- ブラウザを開いて[ localhost:8080] ( http://localhost:8080 ) にアクセスしてみてください。以下のような画面が表示されれば成功です。
159+ docker を手元で動かしている環境の場合は、ブラウザで開いて[ localhost:8080] ( http://localhost:8080 ) にアクセスしてみることでも確認可能です。
160+ コンテナの中からは80番ポート、外からは8080番ポートからアクセスできるように設定されています。
161+ 以下のような画面が表示されれば成功です。
142162
143163![ apache-start] ( ./image/apache-start.png )
144164
@@ -153,23 +173,27 @@ Document RootはApacheが静的ファイルを配信するためのroot director
153173``` shell-session
154174root@a0da070e286f:/# mv /var/www/html/index.html /var/www/html/_index.html
155175root@a0da070e286f:/# echo 'Hello Bootcamp!!' > /var/www/html/index.html
176+ root@a0da070e286f:/# curl http://localhost
177+ Hello Bootcamp!!
156178```
157179
158- 再び ` http://localhost:8080/ ` を開くと ` Hello Bootcamp!! ` が表示されるのを確認してください 。
180+ ` Hello Bootcamp!! ` が帰ってくるのを確認してください 。
159181
160182::: tip
161- ` http://localhost:8080 / ` のようにファイル名を指定せずディレクトリ(この場合はルートディレクトリ)を指定した場合、Apacheは` index.html ` を返すようにデフォルトで設定されています。
183+ ` http://localhost/ ` のようにファイル名を指定せずディレクトリ(この場合はルートディレクトリ)を指定した場合、Apacheは` index.html ` を返すようにデフォルトで設定されています。
162184この設定は変更できます。
163185:::
164186
165- Document Root配下にディレクトリを作成するとブラウザからも同様にアクセスできます 。
187+ Document Root配下にディレクトリを作成すると対応するパスを指定することで同様にアクセスできます 。
166188
167189``` shell-session
168190root@a0da070e286f:/# mkdir /var/www/html/hoge
169- root@a0da070e286f:/# echo 'Hello HUGA!!' > /var/www/html/hoge/huga.txt
191+ root@a0da070e286f:/# echo 'Hello FUGA!!' > /var/www/html/hoge/fuga.txt
192+ root@a0da070e286f:/# curl http://localhost/hoge/fuga.txt
193+ Hello FUGA!!
170194```
171195
172- ` http://localhost:8080/hoge/huga .txt ` にアクセスすると追加したファイルが表示されます。
196+ ブラウザからの場合は、 ` http://localhost:8080/hoge/fuga .txt ` にアクセスすると追加したファイルが表示されます。
173197
174198アクセスログも確認してみましょう。
175199
@@ -258,7 +282,16 @@ CentOSなど他のディストリビューションでは、これらのコマ
258282root@a0da070e286f:/# service apache2 reload
259283```
260284
261- ` localhost:8080 ` と` localhost:8082 ` にアクセスしてみてください。意図通りの挙動になっているでしょうか。
285+ それでは、アクセスしてみましょう。意図通りの挙動になっているでしょうか。
286+
287+ ``` sh
288+ root@a0da070e286f:/# curl http://localhost:80
289+ This is site 80!
290+ root@a0da070e286f:/# curl http://localhost:82
291+ This is site 82!
292+ ```
293+
294+ ブラウザからの場合は、` localhost:8080 ` と` localhost:8082 ` にアクセスしてみてください。
262295
263296| ![ site-80] ( ./image/site-80.png ) |
264297| ------------------------------- |
@@ -302,7 +335,14 @@ root@a0da070e286f:/# service nginx start
302335[ ok ] Starting nginx: nginx.
303336```
304337
305- [ localhost:8088] ( http://localhost:8088 ) にアクセスしてみてください。さっき作った` Hello Bootcamp!! ` のHTMLが見えていれば成功です。
338+ それではアクセスしてみましょう。さっき作った` Hello Bootcamp!! ` のHTMLが見えていれば成功です。
339+
340+ ``` sh
341+ root@a0da070e286f:/# curl http://localhost:88
342+ Hello Bootcamp!!
343+ ```
344+
345+ ブラウザからの場合は、[ localhost:8088] ( http://localhost:8088 ) にアクセスしてみてください。
306346
307347![ nginx_html] ( ./image/nginx_html.png )
308348
@@ -349,9 +389,18 @@ root@a0da070e286f:/# service nginx restart
349389[ ok ] Restarting nginx: nginx.
350390```
351391
352- [ http://localhost:8089/ ] ( http://localhost:8089/ ) にアクセスしてみてください 。
392+ それでは、確認です 。
353393site-80とsite-82がランダムで表示されたでしょうか。
354394
395+ ``` sh
396+ root@a0da070e286f:/# curl http://localhost:89
397+ This is site 80!
398+ root@a0da070e286f:/# curl http://localhost:89
399+ This is site 82!
400+ ```
401+
402+ ブラウザからの場合は、[ http://localhost:8089/ ] ( http://localhost:8089/ ) にアクセスしてみてください。
403+
355404### コンテンツをキャッシュしてみる(check5)
356405
357406Webサーバを多段で使う目的の一つとして、キャッシュを行う、というのもあります。
@@ -406,16 +455,87 @@ root@a0da070e286f:/# service nginx restart
406455[ ok ] Restarting nginx: nginx.
407456```
408457
409- [ http://localhost:8089/ ] ( http://localhost:8089/ ) にアクセスしてみてください。
410- ブラウザの開発者モードなどでヘッダを覗いてみると、X-Nginx-CacheにMISS、あるいはHITが入っています。
458+ それでは、確認です。
459+ キャッシュの状態については、デフォルトではレスポンスヘッダにX-Nginx-Cacheの形で付与されます。
460+ curl に-vオプションをつけてみて、ヘッダを確認してみましょう
461+
462+ ブラウザの場合は、開発者モードなどでヘッダを覗くことができます(通常、F12で開発者モードを起動できます)。
463+
464+ ``` sh
465+ root@a0da070e286f:/# curl -v http://localhost:89
466+ * Trying 127.0.0.1:89...
467+ * Connected to localhost (127.0.0.1) port 89 (# 0)
468+ > GET / HTTP/1.1
469+ > Host: localhost:89
470+ > User-Agent: curl/7.88.1
471+ > Accept: * /*
472+ >
473+ < HTTP/1.1 200 OK
474+ < Server: nginx/1.22.1
475+ < Date: Tue, 29 Jul 2025 11:29:33 GMT
476+ < Content-Type: text/html
477+ < Content-Length: 17
478+ < Connection: keep-alive
479+ < Last-Modified: Tue, 29 Jul 2025 11:27:56 GMT
480+ < ETag: " 11-63b0fb32120e5"
481+ < X-Nginx-Cache: HIT
482+ < Accept-Ranges: bytes
483+ <
484+ This is site 80!
485+ ` ` `
486+
487+ X-Nginx-CacheにMISS、あるいはHITが入っていることが確認できましたでしょうか。
411488今回、わざとキャッシュの保持期間を1分と短くしていますが、2分ほど待った後で改めてアクセスしてみると、MISSが入っているものが観測できるかと思います。
412489
413490キャッシュが利用できた場合、裏のapacheへのアクセスも省略されたことをログから確認できるはずです。
414491
415492キャッシュの実体はこの設定だと/var/cache/nginx 下に置かれます。
416- catしてみてどういうものがキャッシュされているのかも見てみましょう 。
493+ catしてみてどういうものがキャッシュされているのかも見てみるとよいでしょう 。
417494
418495# # 追加課題(時間の余った人用)
496+ # ## HTTP を直接喋ってみる
497+ HTTPは割とシンプルなテキストプロトコルなので、比較的簡単に直接やり取りを行えます。
498+ 直接やり取りをするには、telnetを使うのがよいでしょう。
499+
500+ ` ` ` shell-session
501+ root@a0da070e286f:/# telnet 127.0.0.1 80
502+ Trying 127.0.0.1...
503+ Connected to 127.0.0.1.
504+ Escape character is ' ^]' .
505+ === ここから入力 ===
506+ GET / HTTP/1.0
507+ User-Agent: hogehoge
508+ (Enterを2回)
509+ === ここまで入力 ===
510+ HTTP/1.1 200 OK
511+ Date: Tue, 29 Jul 2025 10:45:22 GMT
512+ Server: Apache/2.4.62 (Debian)
513+ Last-Modified: Tue, 29 Jul 2025 10:31:40 GMT
514+ ETag: " 11-63b0ee9e7ab92"
515+ Accept-Ranges: bytes
516+ Content-Length: 17
517+ Connection: close
518+ Content-Type: text/html
519+
520+ Hello Bootcamp!!
521+ Connection closed by foreign host.
522+ ` ` `
523+
524+ 入力したのは、リクエスト行とヘッダ。ヘッダフィールドには複数行入れられますが、その終了は空行をもって宣言するため、2回改行を入れました。
525+ 今回は、HTTP1.0のGETのため、リクエストボディは省略されすぐさまレスポンスが返ってきます。
526+
527+ アクセスログを見てみると、User-Agent が確かに渡されたことも確認できます。
528+
529+ ` ` ` sh
530+ root@a0da070e286f:/# tail /var/log/apache2/access.log
531+ 127.0.0.1 - - [29/Jul/2025:10:45:22 +0000] " GET / HTTP/1.0" 200 263 " -" " hogehoge"
532+ ` ` `
533+
534+ User-Agentの値を変えてみるとログの記録も変わります。
535+ リクエストヘッダは簡単に捏造できるものであることは覚えておきましょう。
536+ Webサーバ任せで静的なファイルを配信する分には、捏造されたヘッダで悪影響を及ぼすことはWebサーバ側で対策されているのでまずないですが、
537+ CGIやアプリサーバなどでヘッダ情報を利用する場合は十分に気を付ける必要があります。
538+
419539# ## サーバ側でキャッシュを制御してみる
420540
421541本編では、nginxに施した設定に従ってキャッシュを行っていました。
0 commit comments