WEB+DB PRESS plusシリーズnginx実践入門

[表紙]nginx実践入門

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/