2016年2月8日、エンジニアのためのイベント&コミュニティスペース「dots.」にて、「『nginx実践入門』出版記念!執筆者らが語る nginx Tech Talks」が開催されました。
同イベントは『nginx実践入門』の出版を記念して開催されたもので、執筆陣による制作秘話のほか、nginxを現場で活用しているエンジニアによるさまざまな講演が行われました。以下に同イベントの模様をレポートします。講演の資料は公開されており、本記事でも紹介していますので、詳しく知りたい方は参照してください。
nginx実践入門 メイキング - @cubicdaiya
まずは、書籍の執筆者の一人である久保達彦氏(@cubicdaiya)による講演です。メルカリでプリンシパルエンジニアとして活躍されています。書籍執筆にまつわるエピソードと、書籍では紹介できなかった内容などについてです。
本書の執筆がスタートしたのが2013年の11月で、発売が2016年の1月。約2年かかったとのことです。その間に、いくつかの内容の変更がありました。
削除された章としては、当初は「ハイパフォーマンスnginx」と題されたチューニングに関する章があったのですが、他の章を用途ごとにまとめているのでこの章のみ浮いてしまっている状態だったとのことです。そのため、他の章の該当する部分に分散する形にし、章自体は削除することになりました。また、拡張モジュールの作り方を解説する章も検討していましたが、しっかり解説すると1冊の本になってしまうレベルであること、内容が入門ではないことなどにより削除されました。代わりに、OpenRestyというnginxをLuaで拡張できるフレームワークの解説を入れることになったそうです。
一方途中で追加された章として、「安全かつ高速なHTTPSサーバの構築」があります。当初は他の章の一部だったのですが、HTTPSの重要性の高まりや2014年ごろから相次いだOpenSSLの脆弱性の報告などから内容が増え、最終的に1つの章を丸々使って解説する形になったそうです。
執筆後期には、HTTP/2に対応したnginx 1.9.5がリリースされ、それへの対応に追われたとのことです。
その他、本書で取り上げられなかったメールプロキシ、L4ロードバランサとしての使い方や、ngx_luaの最新のディレクティブについての補足がありました。
正誤情報とサンプルコードでみるnginxの使い方 - @harukasan
次は、もう一人の執筆者である道井俊介氏(@harukasan)による講演が行われました。道井氏は、pixivでサービス全体の基盤や、データ解析基盤などの構築を行っています。現時点で判明している正誤情報と、本書で取り上げているサンプルコードからnginxの使い方を見ていきました。
まず本書のサポートページを紹介し、間違いに関してのお詫びがありました。サンプルコードについてはGitHubのリポジトリで公開しています。ここにあるシェルスクリプトを使うと本書の動作環境に揃えられて便利とのことです。
パフォーマンスチューニングに関しては、基本的には行わなくても十分パフォーマンス出るので、本書のとおりにやって必要になったらチューニングについて考える形をお勧めするそうです。
tcp_nodelayディレクティブを取り上げていないという読者の方のご指摘があり、それへの回答として、こちらはデフォルトでオンになっていて、かつnginxのコード内でオン/オフを繰り返しているのでいじる必要はないのであえて書かなかったとのことです。
4章「静的なWebサイトの構築」ではrootディレクティブの使い方についての間違いがあったのですが、こちらはわかりにくい書き方をしてしまったのが原因とのことで、本来運用するときはrootディレクティブの記述は1ヵ所だけにするのを推奨していました。
5章「HTTPSサーバの構築」の補足として、この部分は頻繁に設定を更新する必要があるので、本書でも補足しているとおり書籍で紹介している設定の内容をそのまま利用するのではなく、常に最新の状況を確認してほしいとのことでした。nginxには無停止でバイナリの更新が可能なので、常にアップデートするべきとのことです。
最後に、本書を執筆する際に、「実際のWebサービスにおいて活かせる、使える本にしたい」ということを意識したそうです。そのため、解説が特定のシステムに依存しないように配慮し、一般化して解説しているので、多くの方に参考にしていただきたいとのことでした。
スライドにある、章ごとにできるようになることを解説した図がわかりやすいので参考にしてください。
Advanced nginx in Mercari - @kazeburo
長野雅広氏(@kazeburo)は、自身が勤めるメルカリでの活用方法を紹介しました。
HTTPSで1分間に120万リクエストあるメルカリでは、L7ロードバランサやログ分析基盤のフロントエンドなどにnginxを活用しているとのことです。また、nginxのアップストリームサーバの動的制御のためにngx_dynamic_upstreamという拡張モジュールを開発して利用するといった取り組みも行われています。
講演ではnginxの継続的なアップデートとTLS関連の最適化について詳しく触れました。
nginxは脆弱性への対策のためにも継続的にアップデートをするのが不可欠です。アップデートの際は久保氏作のnginx-buildで自動化しているとのことです。
TLS関連の最適化では「PFS」(Perfect Forward Secrecy)と「TTFB」(Time To First Byte)が重要とのことです。
PFSは「これまでのすべての暗号化された通信を記録しておき、あとからある期間の鍵を盗むことができたとしても一定期間の通信しか復号できず、それ以前またはそれ以後に記録した通信は復号できない暗号化通信の性質」(『nginx実践入門』p.102より)です。これを実現するためには、絶えずMozilla Wikiなどで最新の情報を確認し、プロダクション環境に投入する前にテストを行うのが良いとのことです。
TTFBは、最初の1バイトが到着するまでの時間のことで、サイトの高速化を考える際に非常に重要な指標です。TTFBを改善するためには、TLSセッションキャッシュ、TLSセッションチケット、OCSPステープリング、TLSのレコードサイズの設定が重要で、注意点などの解説がありました。
ngx_mruby 実践入門 - GMO ペパボ 柴田博志
GMOペパボに勤務する柴田博志氏(@hsbt)は、mrubyを使ってnginxを制御できるエクステンションであるngx_mrubyに関しての講演を行いました。9章「Luaによるnginxの拡張」に登場するサンプルコードをすべてngx_mrubyを用いたものに書き換え、重要な点について解説するという面白いものでした。mrubyはH2OなどHTTP/2に対応しているHTTPサーバでも利用できるので応用範囲が広いとのことです。
9章ほとんどのサンプルコードをngx_mrubyを使って書き換えられており、足りない機能はパッチを作成してngx_mruby本体にPull Requestして取り込まれているそうです。書き換えたコードはGitHubのリポジトリでも公開されています。
consul-templateでnginxL7ロードバランサー自動フェイルセーフ @sion_cojp
ここからの講演はライトニングトーク形式で行われました。
リブセンスの湖山翔平氏(@sion_cojp)は、ロードバランサをApacheからnginxに移行した際、同時にアプリケーションサーバをワンクリックでメンテナンスモードにしたり、サーバ構築時に自動で追加されるようにしたいと考えたそうです。それをConsulを使って実現するデモを行いました。Qiitaの「consulとconsul-templateでAPサーバの自動切り替え」に詳しく書いているそうなので、そちらを参照してください。
Practical nginx lua in Kayac @fujiwara
藤原俊一郎氏(@fujiwara)は、カヤックでのnginxの利用事例を紹介しました。事例の一つとして紹介されたFluentdへのログの送信は、他の言語との比較検討の結果ngx_luaを利用してLuaで書き、高いパフォーマンスを実現できたそうです。
nginx limit_req_zoneを本番環境にあとちょっとで導入出来た話 @maaaato
gumiの中野雅之氏(@maaaato)は、秒間に許可するリクエスト数を制限するlimit_reqについて講演しました。
重いAPIへの対策として選択したのがこのlimit_reqを利用する方法で、いろいろと躓いた点はあったものの無事テストまで完了したものの、タイトルにあるとおり諸事情で本番環境への導入は見送られたそうです。
nginx luaでJSON-RPC batch requestを実装して地雷踏んだ話 @mosa_siru
Gunosyに勤める榎本悠介氏(@mosa_siru)は、nginxでJSON-RPCによる通信を実現する方法について解説しました。
リクエストもレスポンスも非常にシンプルな形で表現でき、さらにBatch Requestを使うと複数のリクエストを一気に送り、一気にレスポンスが得られて効率的な通信が実現できます。
しかし、JSON-RPCの既存フレームワークは、Batch Requestを直列で処理するため効率的ではありません。そこで、Batch Requestをnginxのレイヤーで並列にノンブロッキングで実装できるライブラリを作成したそうです。さらに、lua nginx利用時に一部注意点があるそうなので、詳しくはスライドを参照してください。
SSLセッションキャッシュを共有したいだけの人生だった @nojima
サイボウズの野島裕輔氏(@nojima)は、SSLセッションキャッシュの共有に関しての講演を行いました。SSL通信時の負荷軽減に非常に効果があるのですが、複数のサーバ間で共有できないという問題点があります。これを可能にするパッチを作成したとのことです。こちらはサイボウズに本番環境でも利用していてトラブルもないとのことでした。
ngx_http_groonga - 全文検索nginx @ktou
最後は、クリアコードの須藤功平氏(@ktou)による講演です。HTTPサーバー、メールプロキシサーバー、リバースプロキシなどいろいろな役割を果たせるnginxに全文検索エンジンの機能を持たせるngx_http_groongaを紹介しました。
マルチプロセスでスケールする、I/O多重化などnginxの良さを活かし、かつGroongaの能力により高いスループット、スケーラビリティを実現していました。
まとめ
どの講演も現場でnginxを活用しているエンジニアによるもので、非常に濃く、盛りだくさんの内容でした。イベント後の懇親会でもエンジニア同士濃い交流が行われていました。