Skip to content

Commit 25bcd21

Browse files
authored
FY2025: Apache/Nginx 研修の更新 (#195)
* Apache/Nginx 2025: 座学部分の更新 - 調査結果のリンクを最新のものに更新 - 古くなっている言い回しを微調整 * Apache/Nginx 2025: curl 対応 - 足元でない場合などブラウザでアクセスしづらい環境もあるため、curl で確認できるようにする * Apache/Nginx 2025: telnetでHTTPを直接喋る課題の追加
1 parent ac70afa commit 25bcd21

1 file changed

Lines changed: 137 additions & 17 deletions

File tree

src/web-server/apache_nginx/README.md

Lines changed: 137 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ Building dependency tree... Done
4646
Reading state information... Done
4747
10 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
5050
Reading package lists... Done
5151
Building dependency tree... Done
5252
Reading 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
138139
root@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
154174
root@a0da070e286f:/# mv /var/www/html/index.html /var/www/html/_index.html
155175
root@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
168190
root@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など他のディストリビューションでは、これらのコマ
258282
root@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+
それでは、確認です
353393
site-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

357406
Webサーバを多段で使う目的の一つとして、キャッシュを行う、というのもあります。
@@ -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

Comments
 (0)