WEB+DB PRESS plus nginx実践入門
- 久保達彦,道井俊介 著
- 定価
- 3,047円(本体2,770円+税10%)
- 発売日
- 2016.1.16
- 判型
- A5
- 頁数
- 304ページ
- ISBN
- 978-4-7741-7866-0 978-4-7741-7936-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コマンドによるシグナルの送信
 
- システムサービスとして実行
 
- nginxの起動
- 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攻撃
 
 
- 接続元IPアドレスによる制限
- 4.3 リクエストの書き換え- 特定のステータスコード- エラーページの表示
- リダイレクト
 
- リクエストURIの書き換え- rewriteディレクティブへのフラグの指定
- 不必要なrewriteディレクティブ
 
- ifディレクティブとsetディレクティブによる複雑な処理- ファイルの確認
- 複雑な条件分岐
- リファラによる条件分岐
 
 
- 特定のステータスコード
- 4.4 gzip圧縮転送- 動的なgzip圧縮転送- gzip_typesディレクティブ
- gzip_min_lengthディレクティブ
- gzip_disableディレクティブ
 
- あらかじめ用意した圧縮ファイルを転送- gzip圧縮転送が無効な場合の動的な解凍処理
 
 
- 動的な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の実行環境を設定
 
- nginxの各リクエスト処理フェーズと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を利用したアプリケーションのテスト
 
- 索引
- 著者紹介
プロフィール
久保達彦
2009年ごろにnginxに出会い、HTTPサーバとして日常的に利用していくうちに段々のめり込んでいって、開発メーリングリストにパッチを投稿したりngx_small_lightやnginx-buildなどの関連ソフトウェアを開発したりするようになる。
- Twitter:@cubicdaiya
- GitHub:cubicdaiya
道井俊介
1988年生まれ。久留米高専、九州工業大学を経て、筑波大学大学院システム情報工学研究科博士前期課程修了。2012年ピクシブ株式会社に入社。nginxを用いた画像配信クラスタやログ解析基盤の構築・運用を担当、現在は20Gbpsを超えるトラフィックを処理するまでに成長した。
普段は1児の父として子育てに追われている。
- Twitter:@harukasan
- GitHub:harukasan
