nginx実践入門
![[表紙]nginx実践入門 [表紙]nginx実践入門](/assets/images/cover/2016/9784774178660.jpg)
2016年1月16日発売
久保達彦,道井俊介 著
A5判/304ページ
定価(本体2,770円+税)
ISBN 978-4-7741-7866-0
この本の概要
nginxを現場で活用するための知識を,実践的なノウハウを交えて解説した書籍です。nginxのインストール方法や基本的な設定方法からはじめ,nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集,そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので,nginxをこれから使う方はもちろん,さらに活用したい方にもお勧めです。
こんな方におすすめ
- nginxを初めて使う/さらに使いこなしたいWeb開発者
- 本書に寄せて
- はじめに
- 各章の執筆者と初出一覧
- 参考文献/URL
- ディレクティブ書式の見方
第1章:nginxの概要とアーキテクチャ
1.1 nginxとは
- nginxの特徴
- nginxの用途
- [Column]そのほかのHTTPサーバ
1.2 nginxのアーキテクチャ
- イベント駆動とは
- HTTPサーバで発生するイベント
- I/O処理の効率化
- I/O Multiplexing
- ノンブロッキングI/O
- 非同期I/O
- nginxの実際の動作モデル
1.3 まとめ
- [Column]nginxのコミュニティ
- [Column]NGINX Plusとサポートサービス
第2章:インストールと起動
2.1 ソースコードからのインストール
- ビルド環境の構築
- ソースコードの入手
- インストール
- [Column]Mainline版とStable版の違い
- インストールしたnginxの情報を確認
- ファイルパスの指定
- 依存ライブラリを静的に組み込む
- PCREのJIT機能を利用するには
- モジュールの組込み
- サードパーティモジュールの組込み
2.2 パッケージからのインストール
- Debian GNU/Linuxの場合
- CentOSの場合
- FreeBSDの場合
2.3 nginxの起動、終了、基本的な操作
- nginxの起動
- nginxのプロセスが起動していることを確認
- 80番ポートをbindしていることを確認
- nginxの終了、設定の再読み込み
- nginxコマンドによる制御
- killコマンドによるシグナルの送信
- システムサービスとして実行
2.4 まとめ
第3章:基本設定
3.1 設定ファイルの構成
- 設定ファイルのフォーマット
- ディレクティブ
- シンプルなディレクティブ
- ブロック付きディレクティブとコンテキスト
- パラメータの書式
- 変数
- 設定のインクルード
3.2 HTTPサーバに関する設定
- HTTPコンテキストの定義
- バーチャルサーバの定義
- 使用するアドレス、ポートの指定
- ホスト名の指定
- 複数のバーチャルサーバの優先順位
- 公開するディレクトリを設定
- MIMEタイプの指定
- アクセスログの出力
- ログフォーマットの定義
- ログファイルの出力先
3.3 nginx本体の設定
- エラーログの出力設定
- error_logディレクティブ
- バーチャルサーバ別のエラーログファイル指定
- log_not_foundディレクティブ
- プロセスの動作に関する設定
- pidディレクティブ
- userディレクティブ
- worker_processesディレクティブ
- worker_rlimit_nofileディレクティブ
- eventsディレクティブ
3.4 パフォーマンスに影響する設定
- keepalive_timeoutディレクティブ
- sendfileディレクティブ
- tcp_nopushディレクティブ
- open_file_cacheディレクティブ
- worker_cpu_affinityディレクティブ
- pcre_jitディレクティブ
3.5 まとめ
第4章:静的なWebサイトの構築
4.1 静的コンテンツの公開
- 配信するファイルの指定
- locationディレクティブの優先順位
- 前方一致のディレクティブを複数書いた場合
- 前方一致を優先させる方法
- locationディレクティブのネスト
- 特定の条件で使用するファイル
- インデックスページの指定
- インデックスページの自動生成
- エラーページの指定
4.2 アクセス制限の設定
- 接続元IPアドレスによる制限
- 特定のアドレスを拒否──ブラックリスト方式
- 特定のアドレスを許可──ホワイトリスト方式
- 複雑なアクセス制限
- Basic認証による制限
- パスワードファイルの生成
- 大量リクエストの制限
- 同時コネクション数の制限
- 時間あたりリクエスト数の制限
- nginxでは対応できないDoS攻撃
4.3 リクエストの書き換え
- 特定のステータスコード
- エラーページの表示
- リダイレクト
- リクエストURIの書き換え
- rewriteディレクティブへのフラグの指定
- 不必要なrewriteディレクティブ
- ifディレクティブとsetディレクティブによる複雑な処理
- ファイルの確認
- 複雑な条件分岐
- リファラによる条件分岐
4.4 gzip圧縮転送
- 動的なgzip圧縮転送
- gzip_typesディレクティブ
- gzip_min_lengthディレクティブ
- gzip_disableディレクティブ
- あらかじめ用意した圧縮ファイルを転送
- gzip圧縮転送が無効な場合の動的な解凍処理
4.5 まとめ
第5章:安全かつ高速なHTTPSサーバの構築
5.1 なぜHTTPS通信が必要なのか
5.2 必要なモジュールと最低限の設定
- TLSの有効化
- TLS証明書と鍵ファイルの指定
5.3 安全なHTTPS通信を提供するために
- OpenSSLのバージョンを確認
- SSLv3を無効化
- 暗号化スイートを明示的に指定
- 暗号化スイートリストの指定
- サーバの暗号化スイートの設定を優先
- DHパラメータファイルを指定
- SHA-2(SHA-256)サーバ証明書を利用
5.4 TTFBの最小化によるHTTPS通信の最適化
- HTTP/2による通信の高速化
- SPDYによる通信の高速化
- TLSセッション再開による高速化
- セッションキャッシュの利用
- セッションチケットの利用
- セッションチケットを利用した状態でPFSの条件を満たすには
- OCSPステープリングによる高速化
- OCSPステープリングの設定
- OCSP問い合わせ結果をサーバで検証
- TLSセッション再開とOCSPステープリングの確認
- セッションキャッシュを確認
- バッファサイズの最適化
5.5 複数ドメインを1台のサーバで運用するには
- SNIの使用
- ワイルドカード証明書やSANオプションによる設定
- 証明書ごとに異なるIPアドレスの割り当て
5.6 まとめ
- [Column]HSTSを用いて常にHTTPS通信を使用するように指定する
第6章:Webアプリケーションサーバの構築
6.1 リバースプロキシの構築
- 負荷分散のための役割
- Webアプリケーションサーバにおけるリバースプロキシ
- リバースプロキシの設定
- プロキシ先の指定
- リクエストボディに関する設定
- リクエストボディの最大サイズ
- リクエストボディのバッファリング
- 一時ファイルの出力先
- レスポンスのバッファリングに関する設定
- バッファサイズの指定
- 一時ファイルの出力先の指定
- 一時ファイルの最大サイズを指定
- プロキシのタイムアウトに関する設定
6.2 Ruby on Railsアプリケーションサーバの構築
- UnicornのRuby on Railsアプリケーションへの組込み
- nginxの設定
- 静的ファイルの配信
- Hostヘッダと送信元情報の付与
- 起動と動作確認
6.3 PHPアプリケーションサーバの構築
- PHP-FPMの設定
- nginxの設定
- すべてのページをindex.phpで処理
- [Column]WebSocketプロキシとしてのnginx
6.4 まとめ
- [Column]rewriteとtry_filesディレクティブの挙動
第7章:大規模コンテンツ配信サーバの構築
7.1 大量のコンテンツを配信するには
- 問題点と対策のポイント
- ディスクI/O
- ネットワーク
- 問題となる負荷の特定
- 負荷削減へのアプローチ
7.2 大規模コンテンツ配信のスケールアウト
- キャッシュ
- CDNによるキャッシュ
- キャッシュ対象による有効性の違い
- ロードバランス
- L4ロードバランサ
- L7ロードバランサ
- DNSラウンドロビンによるロードバランス
7.3 nginxによるコンテンツキャッシュ
- 保存先の指定
- キーゾーンのサイズ指定
- ディレクトリ階層の指定
- キャッシュ容量の指定
- キャッシュマネージャの制御
- 有効期限の指定
- キーゾーンごとに有効期限を指定
- レスポンスヘッダに有効期限を指定
- ステータスコードごとに有効期限を指定
- キャッシュ条件の指定
- 一時ファイルの保存先指定
- キャッシュ更新負荷の削減
7.4 オリジンサーバの構築
- オリジンサーバに必要な機能
- レスポンスヘッダの追加
- ExpiresとCache-Controlヘッダの追加
- 指定するヘッダによる違い
- プライベートな情報をキャッシュさせないように注意
- 条件付きリクエストの利用
- Last-Modifiedヘッダフィールド
- ETagヘッダフィールド
- 画像サムネイルの作成
- ngx_http_image_filter_moduleの組込み
- 画像の縮小とクロップ
- バッファサイズの指定
- WebDAVによるアップロード
- ngx_http_dav_moduleの組込み
- WebDAVサーバの設定
- 使用できるメソッドの指定
- WebDAVの動作確認
7.5 ロードバランサの構築
- アップストリームサーバの指定
- リクエストの振り分け方法の指定
- コネクション数による振り分け
- クライアントのIPアドレスによる振り分け
- 指定したキーによる振り分け
- アップストリームサーバへのTCPコネクションを保持
- アップストリームのタイムアウトとエラー処理
7.6 キャッシュとロードバランスを利用したコンテンツ配信
- キャッシュサーバのスケーリング
- ネットワーク負荷の削減
7.7 まとめ
- [Column]サーバのレスポンスを確認する
第8章:Webサーバの運用とメトリクスモニタリング
8.1 nginxのステータスモニタリング
- エンドポイントの指定
- 取得できる統計情報
- Muninによるモニタリング
8.2 アクセスログの記録
- 記録する項目
- リクエストをトレースするために記録する項目
- プロキシサーバで記録する項目
- フォーマットの選択
- Apache Combined Log
- TSV
- LTSV
8.3 Fluentdによるログ収集
- ログファイルの入力
- ファイルパスとポジションファイルの指定
- ログフォーマットの指定
- LTSVフォーマットの入力
- TSV、CSVフォーマットの入力
- nginx標準フォーマットの入力
- ログの転送
- バッファの設定
- 転送先サーバの設定
8.4 Fluentd、Norikra、GrowthForecastによるメトリクスモニタリング
- Fluentdの設定
- Norikra
- Norikraへイベントを出力
- Norikraから集計結果を入力
- GrowthForecastへの出力
- Norikraにクエリを登録
8.5 ログファイルのローテーション
- ローテーション間隔の指定
- ログファイルの圧縮
- ログファイルの再オープン
8.6 無停止でのアップグレード
- ロードバランサ、DNSを利用したローリングアップグレード
- シグナルによるオンザフライアップグレード
- アップグレードの詳細
- 構文チェックの実行
- ?新しいバイナリを起動
- ?古いワーカプロセスを終了
- ?古いマスタプロセスを終了
- アップグレードの切り戻し
8.7 まとめ
第9章:Luaによるnginxの拡張──Embed Lua into nginx
9.1 ngx_lua
- LuaとLuaJIT
- 環境の準備
- Lua、LuaJITのインストール
- ngx_luaをnginxに組み込む
9.2 nginxをLuaで拡張
- nginxの各リクエスト処理フェーズとLuaが実行されるタイミング
- rewriteフェーズ
- accessフェーズ
- contentフェーズ
- logフェーズ
- 初期化フェーズ
- その他のフェーズ
- Luaの実行環境を設定
9.3 ngx_lua APIプログラミング
- Hello, World!
- HTTPステータスの設定
- ロギング
- リダイレクト
- URIのリライト
9.4 nginxの内部変数の参照
- 代入不可能な変数(定数)がある
- 既存の変数に対してだけ代入可能
- 代入できるのは文字列と数値とnilのみ
9.5 HTTPリクエストやレスポンスの操作/参照
- ヘッダの操作/参照
- クエリパラメータの操作/参照
- POSTパラメータの参照
9.6 正規表現
- ngx.reで利用可能な修飾子
9.7 データの共有
- ngx.ctx
- ngx.shared.ゾーン名
9.8 サブリクエストをノンブロッキングで処理
9.9 実践的なサンプル
9.10 まとめ
- [Column]PCREのJIT機能が有効かチェックする
第10章:OpenResty──nginxベースのWebアプリケーションフレームワーク
10.1 OpenRestyの導入
- OpenRestyを利用するメリット
- OpenRestyのダウンロード
- OpenRestyのインストール
- 付属モジュールの組込み/取り外し
- OpenRestyにバンドルされているnginxのビルドオプションを指定
10.2 OpenRestyにバンドルされているLuaモジュール
- resty-cli
- lua-cjson
- lua-resty-core
- lua-resty-string
- lua-resty-memcached
- lua-resty-redis
- lua-resty-mysql
10.3 memcached、Redis、MySQLへの接続のクローズとキープアライブ
10.4 まとめ
- [Column]OpenRestyやngx_luaを利用したアプリケーションのテスト
久保達彦(くぼたつひこ)
主にCやGoを利用したOSSの開発/メンテナンスに勤しむプログラマ。2009年ごろにnginxに出会い,HTTPサーバとして日常的に利用していくうちに段々のめり込んでいって,開発メーリングリストにパッチを投稿したりngx_small_lightやnginx-buildなどの関連ソフトウェアを開発するようになる。
普段は株式会社メルカリにてSite Reliability Engineerとして勤務。日々システムのパフォーマンス改善に取り組んでいる。
Twitter:@cubicdaiya
GitHub:@cubicdaiya
URL:http://cccis.jp/
道井俊介(みちいしゅんすけ)
1988年生まれ。久留米高専,九州工業大学を経て,筑波大学大学院システム情報工学研究科博士前期課程修了。2012年ピクシブ株式会社に入社。nginxを用いた画像配信クラスタやログ解析基盤の構築・運用を担当,現在は20Gbpsを超えるトラフィックを処理するまでに成長した。
普段は1児の父として子育てに追われている。
Twitter:@harukasan
GitHub:@harukasan
URL:http://harukasan.jp/