Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ブラウザの向こう側で「200 OK」を返すまでに何が起きているのか調べてみた #phperkaigi

akase244
March 24, 2023

ブラウザの向こう側で「200 OK」を返すまでに何が起きているのか調べてみた #phperkaigi

PHPerKaigi 2023で発表したスライドです。

akase244

March 24, 2023
Tweet

More Decks by akase244

Other Decks in Programming

Transcript

  1. 4

  2. 17 dockerコマンドを利用してビルトインwebサーバーを起動 $ docker pull php:8.2.4-cli-alpine $ docker container run

    \ --rm \ -v /tmp:/tmp \ -w /tmp \ -p 127.0.0.1:8080:8080 \ -it php:8.2.4-cli-alpine \ php -S 0.0.0.0:8080 参考: https:/ /www.php.net/manual/ja/features.commandline.webserver.php
  3. 21 curlコマンドでGETメソッドを実行 $ curl http://localhost:8080/200.php --http1.0 -v * Trying 127.0.0.1:8080...

    * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 8080 (#0) > GET /200.php HTTP/1.0 > Host: localhost:8080 > User-Agent: curl/7.68.0 > Accept: */*
  4. 22 curlコマンドでHEADメソッドを実行 $ curl http://localhost:8080/200.php --http1.0 -vI * Trying 127.0.0.1:8080...

    * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 8080 (#0) > HEAD /200.php HTTP/1.0 > Host: localhost:8080 > User-Agent: curl/7.68.0 > Accept: */* >
  5. 23 「form.php」を準備 $ cat /tmp/form.php ・ ・ <body> <form method="POST"

    action="form.php"> <input type="text" name="foo"> <input type="submit"> </form> </body> </html>
  6. 24 curlコマンドでPOSTメソッドを実行 $ curl http://localhost:8080/form.php \ --http1.0 \ -d "foo=bar"

    \ --trace-ascii - == Info: Trying 127.0.0.1:8080... == Info: TCP_NODELAY set == Info: Connected to localhost (127.0.0.1) port 8080 (#0) ・ ・
  7. 25 curlコマンドでPOSTメソッドを実行 => Send header, 155 bytes (0x9b) 0000: POST

    /form.php HTTP/1.0 0019: Host: localhost:8080 002f: User-Agent: curl/7.68.0 ・ ・ 0068: Content-Type: application/x-www-form-urlencoded 0099: => Send data, 7 bytes (0x7) 0000: foo=bar
  8. 28 400番台(クライアントエラー) $ curl http://localhost:8080/404.php --http1.0 -i HTTP/1.0 404 Not

    Found Host: localhost:8080 Date: Tue, 03 Jan 2023 10:04:48 GMT Connection: close Content-Type: text/html; charset=UTF-8 Content-Length: 540
  9. 30 400番台(クライアントエラー) <?php ・ ・ header('WWW-Authenticate: Basic Realm="Basic Auth"'); header('HTTP/1.0

    401 Unauthorized'); echo "Please Auth." . PHP_EOL; exit; ・ ・ 参考: https://www.php.net/manual/ja/features.http-auth.php
  10. 32 500番台(サーバーエラー) $ curl http://localhost:8080/503.php --http1.0 -i HTTP/1.0 503 Service

    Unavailable Host: localhost:8080 Date: Tue, 03 Jan 2023 10:08:48 GMT Connection: close X-Powered-By: PHP/8.2.0 Content-type: text/html; charset=UTF-8
  11. 34 300番台(リダイレクト) $ curl http://localhost:8080/301.php --http1.0 -i HTTP/1.0 301 Moved

    Permanently Host: localhost:8080 Date: Tue, 03 Jan 2023 10:11:18 GMT Connection: close X-Powered-By: PHP/8.2.0 Location: https://phperkaigi.jp/2023/ Content-type: text/html; charset=UTF-8
  12. 35 200番台(成功) $ curl http://localhost:8080/200.php --http1.0 -i HTTP/1.0 200 OK

    Host: localhost:8080 Date: Wed, 28 Dec 2022 08:21:16 GMT Connection: close X-Powered-By: PHP/8.2.0 Content-type: text/html; charset=UTF-8 Hello, PHP.
  13. 39 RFC 9112 : HTTP/1.1 「2.1. Message Format」 引用元: https:/

    /www.rfc-editor.org/rfc/rfc9112#name-message-format
  14. 40 告白に学ぶ HTTP Status Code - エラー編 - 引用元: https:/

    /www.slideshare.net/shinichitakahashi790/20171005-http-status-code
  15. 55 Keep-Aliveが無効な状態をcurlコマンドで確認 * Connected to phperkaigi.jp (160.16.230.152) port 443 (#0)

    ・ ・ * Closing connection 0 ・ ・ * Connected to phperkaigi.jp (160.16.230.152) port 443 (#1) ・ ・ * Closing connection 1 ・ ・ * Connected to phperkaigi.jp (160.16.230.152) port 443 (#2) ・ ・ * Closing connection 2
  16. 57 Keep-Aliveが有効な状態をcurlコマンドで確認 * Connected to phperkaigi.jp (160.16.230.152) port 443 (#0)

    ・ ・ * Connection #0 to host phperkaigi.jp left intact * Found bundle for host phperkaigi.jp: 0x564fcdd7f030 [serially] * Re-using existing connection! (#0) with host phperkaigi.jp * Connected to phperkaigi.jp (160.16.230.152) port 443 (#0) ・ ・ * Connection #0 to host phperkaigi.jp left intact * Found bundle for host phperkaigi.jp: 0x564fcdd7f030 [serially] * Re-using existing connection! (#0) with host phperkaigi.jp * Connected to phperkaigi.jp (160.16.230.152) port 443 (#0)
  17. 60 HTTPリクエストの送信からHTTPレスポンスの受信までの流れ 1. DNSルックアップ 2. 3ウェイハンドシェイクでTCPコネクション確立 3. TLSハンドシェイクでHTTPS通信確立 4. HTTPクライアントからHTTPリクエストを送信

    5. HTTPサーバーがHTTPリクエストを受信 6. HTTPサーバーからHTTPレスポンスを送信 7. HTTPクライアントがHTTPレスポンスを受信 参考: https:/ /developer.mozilla.org/ja/docs/Web/Performance/How_browsers_work
  18. 74 HOSTSファイルの戻し忘れ $ cat /etc/hosts 127.0.0.1 localhost 192.168.0.1 phperkaigi.jp 192.168.0.2

    phpcon.php.gr.jp 192.168.0.3 phpcon.fukuoka.jp 192.168.0.4 phpcon.hokkaido.jp 192.168.0.5 phpcon-sendai.net 192.168.0.6 phpcon.okinawa.jp 192.168.0.7 conference2019.laravel.jp
  19. 75 ルーターのIPアドレスにpingを実行 $ ping -c 3 192.168.0.1 PING 192.168.0.1 (192.168.0.1)

    56(84) バイトのデータ 64 バイト応答 送信元 192.168.0.1: icmp_seq=1 ttl=64 時間=0.434ミリ秒 64 バイト応答 送信元 192.168.0.1: icmp_seq=2 ttl=64 時間=0.307ミリ秒 64 バイト応答 送信元 192.168.0.1: icmp_seq=3 ttl=64 時間=0.415ミリ秒 --- 192.168.0.1 ping 統計 --- 送信パケット数 3, 受信パケット数 3, パケット損失 0%, 時間 2050ミリ秒 rtt 最小/平均/最大/mdev = 0.307/0.385/0.434/0.055ミリ秒
  20. 77 www.yahoo.co.jp のようなドメインにping、curlを実行 $ ping -c 3 www.yahoo.co.jp PING edge12.g.yimg.jp

    (183.79.250.251) 56(84) バイトのデータ 64 バイト応答 送信元 183.79.250.251 (183.79.250.251): icmp_seq=1 ttl=56 時間=21.2ミリ秒 ・ ・ $ curl -I https://www.yahoo.co.jp HTTP/2 200 server: ATS ・ ・
  21. 79 DNS、CDN、クラウド事業者の障害 • AWSの冷却システムの障害(2019年8月23日) • Cloudflareの障害(2020年7月17日) • AWSのAmazon CloudFrontの障害(2020年9月26日) •

    Fastlyの障害(2021年6月8日) • AkamaiのDNSサービス「Edge DNS」で障害(2021年7月23日) • AWSのDirect Connectの障害(2021年9月2日) • Cloudflareの障害(2022年6月21日) • Microsoft Azureの障害(2023年1月25日)
  22. 82 HTTPサーバーが起動していない $ sudo service httpd status httpd (pid 8097)

    is running... $ sudo systemctl is-active httpd.service active initスクリプトの場合 systemdの場合
  23. 83 HTTPサーバーが起動していない $ ss -ln |grep ':443 ' tcp LISTEN

    0 511 *:443 *:* $ sudo lsof -i:443 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 127021 root 7u IPv4 10913 0t0 TCP *:https (LISTEN) nginx 127023 nginx 7u IPv4 10913 0t0 TCP *:https (LISTEN)
  24. 84 HTTPサーバーの設定ファイルの書式ミス $ sudo httpd -t Syntax OK $ sudo

    nginx -t nginx: the configuration file /etc/nginx/nginx.conf syntax is ok nginx: configuration file /etc/nginx/nginx.conf test is successful Apacheの場合 Nginxの場合
  25. 85 HTTPサーバーは起動しているが レスポンスがない、レスポンスが遅い • webアプリケーションやデータベースで ◦ 処理に時間が掛かっている ◦ エラーが発生している •

    ◯◯砲やDDoS攻撃で高負荷が発生してレスポンスが返せない • 設定ミス ◦ ロードバランサーでヘルスチェックエラーが発生 ◦ ファイアウォールで意図せずブロックしていた ◦ リダイレクトループが発生 • DNSにレコードを登録していなかった / 間違って登録していた • SSL/TLSサーバ証明書の設定漏れ、有効期限切れ etc…
  26. 89 RFC 9113 : HTTP/2 「4.1. Frame Format」 引用元: https:/

    /www.rfc-editor.org/rfc/rfc9113#name-frame-format