HTTP/2でも初めてみます?
今回はちゃんと初心者向け
自己紹介
• 川上 けんと
• コンピュータ部 副部長
• Web班 班長
• 趣味
• Emacs
• openSUSE
• Networkとかとか
• Twitter?知らない子ですね....
• http://techack.net
前回、初心者に知識を求めすぎ
るとか言われたので知識が無い
人に知識を詰め込みます
HTTP/2って知ってます?
HTTP/2
• 2015年2月17日に仕様が決定され、2015年5月にRFC7540とし
て文書化されたHTTPの新仕様
• Googleが開発していたSPDYを開発した事により、Network-
FriendlyなHTTP Upgradeが考え出されはじめた
• そのためSPDYの仕様をそのままコピーした最初のドラフトから議論が初
まった
• HTTP1.1で動いているサービスはそのまま動く事を目標に作られた
HTTP1.1とHTTP/2の違い
ストリーム処理による多重化
HTTP1.1
サバネコClient
リクエスト1
リクエスト2
レスポンス1
レスポンス2
HTTP1.1
パイプライン
サバネコClient
$1
$2
$3
$1
$2
$3
HTTP/2
サバネコClient
$1
$2
$3
$3
$1
$2
HTTP/2
サバネコClient
$1
$2
$3
$3
$1
$2
サーバ側が
返答する順番を選べる
HTTP1.1とHTTP/2の違い
バイナリ化
HTTP/2フレーム
Length : ペイロードのオクテット数
Type : フレームの種類、データフレームやヘッダーフレームなどを指す
Flags : ストリームの終了やらのフラグ
Stream Identifier : 31bitのストリームのID
R : 未定義
Frame Payload : タイプによって決められたデータ形式のデータの領域
フレームタイプ
Type Name Summary Binary
DATA ストリームに関連する任意の可変長オクテット列。 0x0
HEADERS 名前-値のペアを転送する。ストリームの開始に仕様される。 0x1
PRIORITY 送信者からストリームの優先度を指定する。 0x2
RST_STREAM ストリームの即時終了を表す 0x3
SETTINGS エンドポイントの通信方式に影響を与える設定など。 0x4
PUSH_PROMISE サーバにプッシュを行う。 0x5
PING 死活監視やら遅延の測定やらを行う。 0x6
GOAWAY コネクションの終了の開始 0x7
WINDOW_UPDATE フロー制御の指標などを設定する 0x8
CONTINUATION HEADERSやPUSH_PROMISEで足りなかった時に追加で使用される。 0x9
基本的な通信に必要なフレーム
DATA HTTP1.1などで言うBody部
Pad Length? : Paddingの長さ
Data : アプリケーションのデータ、流さはHTTP/2のフレームのLengthから他の流さを引いた長さ
Padding : アプリケーションに意味の無いデータ。フレームサイズを良い感じの長さにしたい時に使う
HEADERS HTTP1.1でいうHeader,HPACK形式で圧縮済
Pad Length? : Paddingの長さ
E , Stream Dependency? , Weight? : ストリー ムの優先度
Header Block Pragment : HPACKにより圧縮されたHTTPのHeader
SETTINGS
Identifier : 設定の種類を表す
SETTINGを受けとるとACKを返答するのもSETTINGフレームを用いる
設定内容:
ヘッダ圧縮に使用するテーブルサイズや、
サーバからpushを受けとるかどうか
同時にアクティブになってよいストリームの数、
バッファのサイズ、
Gzipの使用などの設定を行う
GOAWAY フレームの最後を表す
Last-Stream-ID:処理中の最終ストリームのID
Error Code:エラー情報
簡単なHTTP/2の要求の流れ
Client Server
コネクションの要求
Setting
Setting Ack
Setting
Setting Ack
Headers
Headers
DATA
GOAWAY
バイナリフレーム
GET /index.html HTTP/1.1
Host: www.google.com
Content-Type: text/html
Content-Length:314
{データ}
HTTP1.1 リクエスト
HEADERS
:method GET
:scheme http
:authority www.google.com
:path /index.html
:content-type text/html
:content-length 314
DATA
{データ}
HTTP/2フレーム
HTTP/2の良い所ってなに?
HTTP/2のよくある疑問
• HTTP/2ってバイナリだし早いんだよね?
• バイナリだから早いって事はない、なんか、最近、HTTP1.1の高速なパーサとか出てるし
やり方しだいじゃない?
• ダウンロードは早くなるの?
• 別にHTTP1.1でaimage.example.comとかでバラバラなサーバに置いてコネクション
数の上限とか突破してるしべつにそんな早くなる事は無いよ!ってか、この方法が
HTTP/2では使えなくなるよ!
• HTTP1.1だとブラウザさんが無理矢理複数コネクション張りに行ったりするしね!!
• じゃぁ実際、何が良いの?
• HTTP/2を使うだけでレンダリングの開始までの速度が上るよ!
• HTTP/2では優先度設定があるからHTMLとCSSとかを先にダウンロードするようにすれ
ばレンダリング開始が早くなるよね!!
HTTP/2のよくある疑問
• HTTP/2にしたら管理コストが上るんじゃないの?
• HTTPSを使うのと変らないくらい、今年度中にはApacheもNginxもHTTP/2に
対応すると言ってるのでアップデートするだけで対応出来るはず
• HTTP/2にするとセキュリティがあっぷしたりするの?
• HTTP1.1で発生する脆弱性は基本動作すると思った方が良い、
• HTTP Headerインジェクションは減るかもしれないけど、HTTP/2によるリバース
プロシキなどだとそこも追加してヘッダ圧縮されるかもしれないので実装による
• telnetで確認出来ないんだけど!!
• そういうものです諦めて
とりあえず使って設定すれば
表示開始が早くなるよ!!
って事でHTTP/2を使ってみよう
h2o
• HTTP/2に対応したWebサーバ
• 高品質かつ便利なHTTPサーバを実装する事を目標にしてるらしい
• Nginxより早いらしい
• DeNAが開発してるらしい
• GitHubでソースコードが読める
• https://github.com/h2o/h2o
• 設定ファイルがYAML
• リバースプロキシや、mruby対応など今時な機能もある
h2oを使ってみよう
• 最新リリースをとってこよう
• https://github.com/h2o/h2o/releases
• 依存関係のインストール
• $ sudo zypper install cmake
• $ sudo zypper install libyaml
h2oを使ってみよう
• h2oの解答
• $ unzip h2o-1.4.2.zip
• h2oのビルド
• $ cmake .
• $ make h2o
h2oを使ってみよう
• h2oの実行
• $ ./h2o –c ./examples/h2o/h2o.conf
• Demo
まとめ
• HTTP/2を使うのにそんな気構える必要とかないよ!
• HTTP1.1で動いてるサービスならWebサーバをアップデートするだけでそのうち勝
手に対応されるはず
• HTTP/2を今使うならh2oがお勧め
• 現在はまだ完全にチューニングしたNgnixよりは遅いらしいが、普通に早いWeb
サーバ
• 現状で安定板としてHTTP/2に対応している数少ないWebサーバ
• HTTP/2怖くないよ!
TLSを使うのにお金がかかるしHTTP/2とか使えない
• オレオレ証明書を作る
• $ openssl genrsa 2048 > server.key
• $ openssl req -new -key server.key > server.csr
• $ openssl x509 -days 3650 -req -signkey server.key <
server.csr > server.crt
• これで10年間有効なオレオレ証明書が作れる
• 適切な位置にこれを配置すれば暗号化するという目的は完了出きる
TLSを使うのにお金がかかるしHTTP/2とか使えない
• 9月まで待てば無料で証明書が発行出来るサービスが開始される
• Let's Encrypt
• https://letsencrypt.org
• Mozillaや、CISCO、Akamaiなどが運営する予定の証明書発行サー
ビス
• NSAのプリズム計画あたりでネットの監視が問題になって作ろうとなった
サービス
• 9月の中旬あたりに開始されるらしい

HTTP/2でも初めてみます?