@nojima (Cybozu, Inc) nginx tech talks 2016-02-08 http://eventdots.jp/event/578421
SSLセッションキャッシュを共有したいだけの人生だった@nojimaCybozu, Inc.nginx Tech Talks2016-02-09 nginx Tech Talks 1
View Slide
SSL のハンドシェイクに 265ms もかかっているとあるサイトに SSL で接続してみる2016-02-09 nginx Tech Talks 2
265ms → 138ms (だいたい半分) になった!!もう一度接続してみる2016-02-09 nginx Tech Talks 3
Why?• SSL セッションキャッシュのおかげ• SSL ハンドシェイクで共有したパラメータ (共有鍵とか) をキャッシュしておく。• 次回同じセッションIDで接続してきたクライアントに対してはパラメータの共有を省いて、いきなり TLS セッションを開始する。• 効果• ラウンドトリップが1往復分減る → レイテンシ減• サーバ側の計算が減る → スループット増※ ブラウザによっては SSL セッションチケットという別の仕組みでセッション再開できるが、IE や iOS Safari は対応していない。2016-02-09 nginx Tech Talks 4
ところがnginx の標準機能では、複数のサーバ間でセッションキャッシュを共有できない!!!2016-02-09 nginx Tech Talks 5
ClientLayer 4Load Balancernginx-1 nginx-2 nginx-3① 最初のコネクションがnginx-1 に割り振られる② nginx-1 にセッションがキャッシュされる③ 二回目のコネクションがnginx-3 に割り振られる④ キャッシュがないのでセッション再開できない!!!DC2016-02-09 nginx Tech Talks 6
というわけでnginx の SSL セッションキャッシュを共有できるようにするパッチを書いた。2016-02-09 nginx Tech Talks 7
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
nginx-1nginx-2nginx-3sessioncache① SSL接続が来る② セッションキャッシュが生成されるcache③ 非同期にセッションキャッシュを送りつけるcachecacheClient④ 再び SSL 接続が来る⑤ セッションが再開できる!sessioncacheDC2016-02-09 nginx Tech Talks 9
nginx-ssl-scache-sync-module• よかった点• パフォーマンス向上• 前述のとおり、キャッシュによってサーバのスループットが上がる。• レイテンシも減るが、日本だとあまり実感できない。• Just Works!!• サイボウズの本番環境で1年間運用。トラブルなし。• よくない点• スケールしない• nginx サーバ台数に比例してセッションを共有する通信の負荷が上がってしまう。2016-02-09 nginx Tech Talks 10
ところで H2O は?• H2O はセッションキャッシュの共有を標準でサポートしている。• しかも memcached を使う方式なのでサーバ台数が増えても大丈夫。• 自分たちが memcached を使わなかったのは、OpenSSL の制約の都合上実装できないと思っていたから。• しかし、H2O は驚きのスーパーハックで解決していた:https://github.com/h2o/h2o/issues/1182016-02-09 nginx Tech Talks 11
今日言いたかったこと誰か H2O 方式のセッションキャッシュ共有モジュールを書いてくれ!!!!(or ngx_ssl_session_fetch_by_lua に期待)2016-02-09 nginx Tech Talks 12
WE AREHIRINGサイボウズはインフラエンジニアを募集しております2016-02-09 nginx Tech Talks 13