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

SSLセッションキャッシュを共有したいだけの人生だった

Yusuke Nojima
February 08, 2016

 SSLセッションキャッシュを共有したいだけの人生だった

@nojima (Cybozu, Inc)
nginx tech talks
2016-02-08
http://eventdots.jp/event/578421

Yusuke Nojima

February 08, 2016
Tweet

More Decks by Yusuke Nojima

Other Decks in Technology

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  6. 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

    View Slide

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

    View Slide

  8. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide