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

[表紙]nginx実践入門

紙版発売
電子版発売

A5判/304ページ

定価3,047円(本体2,770円+税10%)

ISBN 978-4-7741-7866-0

電子版

→学校・法人一括購入ご検討の皆様へ

書籍の概要

この本の概要

nginxを現場で活用するための知識を,実践的なノウハウを交えて解説した書籍です。nginxのインストール方法や基本的な設定方法からはじめ,nginxを利用した「静的コンテンツ配信サーバ」「HTTPSサーバ」「Webアプリケーションサーバ」「大規模コンテンツ配信システム」の構築方法をそれぞれ詳しく紹介しています。後半ではnginxサーバのモニタリングやログの収集,そして軽量スクリプト言語Luaでnginxを拡張する方法について解説しているので,nginxをこれから使う方はもちろん,さらに活用したい方にもお勧めです。

こんな方におすすめ

  • nginxを初めて使う/さらに使いこなしたいWeb開発者

本書に関するお知らせ

本書に関連する記事を公開しております。

この書籍に関連する記事があります!

本書に寄せて[日本語]
私は幼いころから盆栽,庭園,生け花,俳句,根付けといった伝統的な日本文化の大ファンでした。
本書に寄せて[英語]
Ever since I was very young, I have always been a big fan of traditional Japanese culture: bonsai, gardens, ikebana, haiku and netsuke.
はじめに
本書はこれからnginxを使ってみたいという方や,すでにnginxを利用しているけどもっと使いこなしたいという方に向けた実践的な入門書です。

目次

  • 本書に寄せて
  • はじめに
  • 各章の執筆者と初出一覧
  • 参考文献/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を利用したアプリケーションのテスト
  • 索引
  • 著者紹介

著者プロフィール

久保達彦(くぼたつひこ)

2009年ごろにnginxに出会い,HTTPサーバとして日常的に利用していくうちに段々のめり込んでいって,開発メーリングリストにパッチを投稿したりngx_small_lightやnginx-buildなどの関連ソフトウェアを開発したりするようになる。


道井俊介(みちいしゅんすけ)

1988年生まれ。久留米高専,九州工業大学を経て,筑波大学大学院システム情報工学研究科博士前期課程修了。2012年ピクシブ株式会社に入社。nginxを用いた画像配信クラスタやログ解析基盤の構築・運用を担当,現在は20Gbpsを超えるトラフィックを処理するまでに成長した。

普段は1児の父として子育てに追われている。