Slide 1

Slide 1 text

SSLセッションキャッシュを 共有したいだけの人生だった @nojima Cybozu, Inc. nginx Tech Talks 2016-02-09 nginx Tech Talks 1

Slide 2

Slide 2 text

SSL のハンドシェイクに 265ms もかかっている とあるサイトに SSL で接続してみる 2016-02-09 nginx Tech Talks 2

Slide 3

Slide 3 text

265ms → 138ms (だいたい半分) になった!! もう一度接続してみる 2016-02-09 nginx Tech Talks 3

Slide 4

Slide 4 text

Why? • SSL セッションキャッシュのおかげ • SSL ハンドシェイクで共有したパラメータ (共有鍵とか) をキャッシュ しておく。 • 次回同じセッションIDで接続してきたクライアントに対しては パラメータの共有を省いて、いきなり TLS セッションを開始する。 • 効果 • ラウンドトリップが1往復分減る → レイテンシ減 • サーバ側の計算が減る → スループット増 ※ ブラウザによっては SSL セッションチケットという別の仕組みでセッション再開できるが、 IE や iOS Safari は対応していない。 2016-02-09 nginx Tech Talks 4

Slide 5

Slide 5 text

ところが nginx の標準機能では、 複数のサーバ間でセッションキャッシュを 共有できない!!! 2016-02-09 nginx Tech Talks 5

Slide 6

Slide 6 text

Client Layer 4 Load Balancer nginx-1 nginx-2 nginx-3 ① 最初のコネクションが nginx-1 に割り振られる ② nginx-1 にセッションがキャッシュされる ③ 二回目のコネクションが nginx-3 に割り振られる ④ キャッシュがないので セッション再開できない!!! DC 2016-02-09 nginx Tech Talks 6

Slide 7

Slide 7 text

というわけで nginx の SSL セッションキャッシュを 共有できるようにするパッチを書いた。 2016-02-09 nginx Tech Talks 7

Slide 8

Slide 8 text

nginx-ssl-scache-sync-module • nginx が SSL セッションキャッシュを保存する処理にフック して、別のサーバの nginx に対してセッションキャッシュを 送り付ける仕組み。 • サイボウズの本番環境で使うために作った。 • 以下の URL で公開中 • https://gist.github.com/nojima/daac8c5710a2766bd638 • 1.9.10 より新しい nginx には当たらないので注意。多分そのうち直し ます。 2016-02-09 nginx Tech Talks 8

Slide 9

Slide 9 text

nginx-1 nginx-2 nginx-3 session cache ① SSL接続 が来る ② セッション キャッシュ が生成される cache ③ 非同期に セッション キャッシュを 送りつける cache cache Client ④ 再び SSL 接続が来る ⑤ セッションが再開できる! session cache DC 2016-02-09 nginx Tech Talks 9

Slide 10

Slide 10 text

nginx-ssl-scache-sync-module • よかった点 • パフォーマンス向上 • 前述のとおり、キャッシュによってサーバのスループットが上がる。 • レイテンシも減るが、日本だとあまり実感できない。 • Just Works!! • サイボウズの本番環境で1年間運用。トラブルなし。 • よくない点 • スケールしない • nginx サーバ台数に比例してセッションを共有する通信の負荷が上がってしまう。 2016-02-09 nginx Tech Talks 10

Slide 11

Slide 11 text

ところで H2O は? • H2O はセッションキャッシュの共有を標準でサポートしている。 • しかも memcached を使う方式なのでサーバ台数が増えても 大丈夫。 • 自分たちが memcached を使わなかったのは、OpenSSL の制約の都合 上実装できないと思っていたから。 • しかし、H2O は驚きのスーパーハックで解決していた: https://github.com/h2o/h2o/issues/118 2016-02-09 nginx Tech Talks 11

Slide 12

Slide 12 text

今日言いたかったこと 誰か H2O 方式のセッションキャッシュ 共有モジュールを書いてくれ!!!! (or ngx_ssl_session_fetch_by_lua に期待) 2016-02-09 nginx Tech Talks 12

Slide 13

Slide 13 text

WE ARE HIRING サイボウズはインフラエンジニアを 募集しております 2016-02-09 nginx Tech Talks 13