$30 off During Our Annual Pro Sale. View Details »

nginxによる実践的Webシステム / Practical nginx web system

Harukasan
PRO
February 08, 2016

nginxによる実践的Webシステム / Practical nginx web system

nginx実践入門出版記念 nginx tech talks
2016-02-08

Harukasan
PRO

February 08, 2016
Tweet

More Decks by Harukasan

Other Decks in Technology

Transcript

  1. Title Text
    正誤情報とサンプルでみる
    nginxによる実践的Webシステム
    MICHII Shunsuke
    nginx tech talks
    2016-02-08

    View Slide

  2. MICHII Shunsuke / harukasan
    - 2012೥ʹ৽ଔͱͯ͠ΠϯϑϥνʔϜʹ഑ଐ
    - ίϯςϯπ഑৴Λ͸͡Ίͱͯ͠αʔϏεશମͷج൫Λ୲౰
    - αʔϏεج൫͚ͩͰͳ͘σʔλղੳج൫ͷߏஙͳͲ΋
    - ٕज़ܥࡶࢽͷࣥචͳͲ΋
    2
    Infrastructure team in pixiv Inc.

    View Slide

  3. お詫びと訂正
    正誤情報は技術評論社様のサポートページに掲載頂いております
    最新版はサポートページをご確認下さい:
    http://gihyo.jp/book/2016/978-4-7741-7866-0/support
    - 報告/確認次第速やかに掲載いたします
    - 間違いやすいところを間違っていて申し訳ないです……
    3

    View Slide

  4. サンプルコードについて
    Github上のリポジトリで公開されています:
    https://github.com/wdpress/nginx_Practical_Guide
    - 基本的に動作する状態のコードです
    - ローカルでの動作確認の他、Travis CI上で書式チェックだけ行っています
    4

    View Slide

  5. 5
    第1章 nginxの概要とアーキテクチャ
    第2章 インストールと起動
    第3章 基本設定
    第4章 静的なWebサイトの構築
    第5章 安全かつ高速なHTTPSサーバの構築
    第6章 Webアプリケーションサーバの構築
    第7章 大規模コンテンツ配信サーバの構築
    第8章 Webサーバの運用とメトリクスモニタリング
    第9章 Luaによるnginxの拡張──Embed Lua into nginx
    第10章 OpenResty──nginxベースのWebアプリケーションフレームワーク
    殆どの章は

    サンプルコードがあります

    View Slide

  6. 6
    正誤情報とサンプルコードでみる
    nginx実践入門

    View Slide

  7. nginx実践入門
    7

    View Slide

  8. 8
    nginx実践入門
    nginx.orgはこの表記

    View Slide

  9. 9
    NGINX実践入門 ?
    nginx.comはこの表記

    View Slide

  10. 10
    Nginx実践入門 ?
    日本語情報に多い

    View Slide

  11. nginxなのかNGINXなのかNginxなのか
    Preferred variant is "nginx". Sometimes "NGINX" is used, too. Use of "Nginx" is discouraged as

    Igor thinks it looks ugly.
    But, actually, most of us don't really care.
    — Maxim Dounin
    - nginxかNGINXがよさそう
    - nginx.orgはnginx、nginx.comはNGINXになっている
    11

    View Slide

  12. 12
    本書に関しては小文字です

    View Slide

  13. 13
    最新版の挙動を確認して利用して下さい
    本書の動作環境と現時点の最新版
    Debian GNU/Linux 変更なし (Jessie)
    nginx 1.9.10 (1.9.5)
    OpenResty 1.9.7.3 (1.9.3.1)
    PCRE 8.38 8.37
    zlib 変更なし 1.2.8
    OpenSSL 1.0.2f 1.0.2d
    GD 変更なし 2.1.1
    Fluentd 0.12.19 0.12.16
    最新版 (執筆時)

    View Slide

  14. 14
    第2章 インスト−ルと起動
    - nginxのビルドと基本的な操作方法

    View Slide

  15. 2.1 ソースコードからのインストール
    ビルドスクリプト (build.sh)
    - Ubuntu/Debian向けビルドスクリプト

    (Debianの場合ちょっと書き換える必要あり)
    - 本書で紹介しているモジュールが組み込まれる
    15

    View Slide

  16. 2.2 パッケージからのインストール
    Debian (ch2/2.2-list2.1-sources.list)

    RHEL/CentOS (ch2/2.2-list2.2-nginx.repo)
    16
    deb http://nginx.org/packages/mainline/debian/ jessie nginx
    deb-src http://nginx.org/packages/mainline/debian/ jessie nginx
    [nginx]
    name=nginx repo
    baseurl=http://nginx.org/packages/mainline/centos/リリース番号/$basearch/
    gpgcheck=0
    enabled=1

    View Slide

  17. ビルドについて
    - 本書ではソースコードからのビルドを推奨
    - mainlineの最新版を常にアップグレードしながら利用
    - 依存するライブラリはそれほど多くない
    - OpenSSL、PCRE、zlibがあればとりあえず動く
    - image filterにはGDが別途必要
    17

    View Slide

  18. 18
    第3章 基本設定
    - HTTPサーバにおける一般的な設定
    - パフォーマンスに関する基本的な設定も含んでいる

    View Slide

  19. 本書で基本となる設定例
    19
    user www-data;
    pid run/nginx.pid;
    worker_processes 1;
    pcre_jit on;
    error_log logs/error.log;
    worker_rlimit_nofile 65535;
    events {
    worker_connections 1024;
    }
    http {
    keepalive_timeout 60s;
    sendfile on;
    tcp_nopush on;

    }
    (ch3/nginx/3.3-list3.7-nginx.conf, ch3/nginx/3.4-performance_tuning.conf)

    View Slide

  20. nginxにおける

    パフォーマンスチューニング
    - 基本的にはチューニングしなくても十分なパフォーマンスが発揮できる
    - その上でニッチケースにおいては特別なチューニングが必要なこともある
    - まずは本書で紹介しているくらいの設定を入れておき、環境に合わせて
    チューニングするのが良い
    20

    View Slide

  21. tcp_nodelayディレクティブ
    - 本書では紹介していない
    - tcp_nodelayディレクティブの値がonである時、TCP_NODELAYオプション
    の有効/無効を場合によって切り分けることで最適化する
    - BSD/darwinではTCP_NOPUSHとTCP_NODELAYを併用
    - lunuxでは排他的に利用する
    - デフォルトでonなので基本的に設定する必要はない
    21

    View Slide

  22. 22
    第4章 静的なWebサイトの構築
    - 一般的な静的ファイル配信
    - コンテンツ配信(オリジンサーバ)として使用する場合は

    7.4 オリジンサーバの構築も参考に

    View Slide

  23. server {
    root /var/www/html;
    location /images/ { # プレフィックスを指定
    root /var/www/img;
    }
    }
    locationとrootディレクティブ
    23
    http://www.example.com/images/logo.png 誤: /var/www/img/logo.png
    正: /var/www/img/images/logo.png
    リクエストURI 返されるファイルパス
    表4.1
    リスト4.2 locationディレクティブによる設定の例
    リスト4.2の設定におけるリクエストURIと返されるファイルパス
    正誤情報
    (ch4/nginx/4.1-list4.2-location_directive.conf)

    View Slide

  24. rootディレクティブの挙動
    - locationディレクティブの中に記述したとしてもrootディレクティブの

    挙動は変化しない
    - URIのパスとのマッピングをとるのではなく、ルートの位置を指定する
    24
    ファイルシステム上の絶対パスは、URIにおける絶対パスの前方にroot
    ディレクティブに指定されたパスを結合したものになります

    — 第3章 基本設定 P.45

    View Slide

  25. rootディレクティブの使い方
    - location中にあるせいで挙動がわかりづらい
    - サンプルコードとしてあんまり良くない例
    25
    (ch4/nginx/4.1-list4.2-location_directive.conf)
    server {
    root /var/www/html;
    location /images/ { # プレフィックスを指定
    root /var/www/img;
    }
    }
    リスト4.2 locationディレクティブによる設定の例

    View Slide

  26. rootディレクティブの使い方
    - rootディレクティブの記述箇所は同じサービスであれば1箇所だけにする
    - パスの書き換えにはrewriteディレクティブを用いた方が無難
    - どうしてもlocationディレクティブによって、静的ファイルパスだけを

    書き換えないといけない場合はaliasディレクティブを検討する

    (本書では未説明)
    26

    View Slide

  27. 27
    第5章
    安全かつ高速なHTTPSサーバの構築
    - HTTPS通信を提供するために推奨されている設定を紹介
    - 執筆時にはLet’s encryptがなかった……

    View Slide

  28. 常に最新の情報を参照し対策する
    - Webにおけるセキュリティ対策としては

    常に情報をアップデートし続けることが最も重要
    - 書籍を読んで設定して安心せず、常に最新の情報に目を光らせておく
    - nginxは無停止でバイナリの更新が可能
    - バイナリアップグレードの方法は8.6 無停止でのアップグレードを参照
    28

    View Slide

  29. 29
    第6章
    Webアプリケーションサーバの構築
    - PHPやRuby on Railsアプリケーションなどアプリケーションプロセス
    と同居するnginxについて

    View Slide

  30. リクエスト/レスポンス バッファリング
    PHP-FPM、Unicornのようなアプリケーションの場合、通信開始から通信終了
    までスレッドがブロックされる
    30
    ハンドシェイク
    通信終了
    リクエスト
    レスポンス
    リクエスト処理

    View Slide

  31. リクエスト/レスポンス バッファリング
    nginxによってバッファリングすることで、ブロック時間を短縮できる

    nginx—アプリケーション間はUNIXドメインソケットで通信
    31
    ハンドシェイク
    通信終了
    リクエスト
    レスポンス
    リクエスト処理
    nginx

    View Slide

  32. リクエストのバッファリング
    POSTされるサイズが大きい場合、以下のディレクティブの設定を確認:
    client_max_body_size
    client_body_buffer_size
    client_body_temp_path
    特にclient_max_body_sizeの値を超えるリクエストでは413エラーを返す
    ので注意が必要
    32
    書式6.2
    書式6.3
    書式6.4

    View Slide

  33. プロキシのタイムアウト
    nginxではプロキシに関するタイムアウトを設定できる

    proxy_connect_timeout

    proxy_send_timeout


    proxy_read_timeout
    33
    書式6.11
    書式6.12
    書式6.13
    nginx
    TCPハンドシェイク
    HTTPリクエスト
    HTTPレスポンス

    View Slide

  34. 34
    第7章

    大規模コンテンツ配信サーバの構築
    - ピクシブでの事例をより一般化した内容
    - 如何にスケールしやすいコンテンツ配信を実現するのか

    View Slide

  35. 参考資料
    pixivにおけるコンテンツ配信

    https://speakerdeck.com/harukasan/jpnap-users-meeting-2015-02
    サムネイルマスタとgo-thumber

    https://speakerdeck.com/harukasan/use-thumbnail-master-with-go-thumber
    35

    View Slide

  36. 36
    第8章

    Webサーバの運用とメトリクスモニタリング
    - Webサーバの運用にはどのような事柄が必要か
    - Fluentd/Norikraによるメトリクスモニタリングも紹介

    View Slide

  37. ログの書き出しフォーマット
    - 書き出し形式を後から変えやすいものにしておく
    - TSV、またはLTSVにしておくと後からフィールドの追加がやりやすい
    - LTSVにしておくと転送側(Fluentd)の設定をあまり変えなくて良い
    - shell scriptでちょっと処理したいときはTSVの方が便利
    37

    View Slide

  38. ログ解析基盤につなぎやすいように設計する
    - 必要なログベースではなく、必要かもしれないログはすべて送れる様に

    しておく
    - nginxをフロントサーバとして利用することで、HTTPリクエストを

    とりあえず集めることができるようになる
    38

    View Slide

  39. 39
    第9章

    Luaによるnginxの拡張
    - ngx_luaによるnginxの拡張方法について

    View Slide

  40. ngx_luaのコメント
    40
    誤:
    location / {
    default_type text/plain;
    content_by_lua ‘
    # レスポンス生成

    # レスポンスを返す
    ‘;
    }
    リスト9.4 log_by_luaディレクティブによるロギング
    正:
    location / {
    default_type text/plain;
    content_by_lua ‘
    -- レスポンス生成

    -- レスポンスを返す
    ‘;
    }
    正誤情報

    View Slide

  41. ngx_luaのコメント
    - Luaのコメントは’#’ではなく’--‘ではじめる
    - v0.9.17から推奨されているcontent_by_lua_blockでも同じ書式が推奨
    41
    location / {
    content_by_lua_block {
    -- レスポンス生成

    -- レスポンスを返す
    }
    }
    ←このブレースの中はLuaを記述

    View Slide

  42. 42
    まとめ:
    nginxによる実践的Webシステム

    View Slide

  43. nginxによる実践的Webシステム
    本書の個人的テーマ:
    - 単なるリファレンスではなく、実際にWebサービスにおいて活かせる、

    使える本にする
    - 特定の組織・システムに限定されない、より一般化した情報にする
    - なんかこのまま使えないけど、どっか使える、みたいなかんじ
    43

    View Slide

  44. 44
    第3章 基本設定
    nginx
    とりあえずnginxが動かせるようになる

    View Slide

  45. 45
    第4章 静的なWebサイトの構築
    nginx
    静的ページを配信できるようになる

    View Slide

  46. 46
    第5章 安全かつ高速なHTTPSサーバの構築
    nginx
    HTTPS
    HTTPS通信を提供できるようになる

    View Slide

  47. 47
    第6章 Webアプリケーションサーバの構築
    nginx
    HTTPS
    Application
    アプリケーションサーバ
    Webアプリケーションを動かせるようになる

    View Slide

  48. 48
    第7章 大規模コンテンツ配信サーバの構築
    nginx
    コンテンツ配信クラスタ
    HTTPS
    Application
    nginx
    nginx
    nginx
    nginx
    nginx
    nginx
    nginx
    アプリケーションサーバ
    CDN
    コンテンツ配信ができるようになる

    View Slide

  49. 49
    第8章 Webサーバの運用とメトリクスモニタリング
    nginx
    コンテンツ配信クラスタ
    HTTPS
    Application
    nginx
    nginx
    nginx
    nginx
    nginx
    nginx
    nginx
    アプリケーションサーバ
    Fluentd Norikra
    GrowthForecast
    ログ解析・運用基盤
    CDN
    メトリクス収集・分析できる

    View Slide

  50. 50
    第9, 10章 Luaによるnginxの拡張
    nginx
    コンテンツ配信クラスタ
    HTTPS
    Application
    nginx
    nginx
    nginx
    nginx
    nginx
    nginx
    nginx
    アプリケーションサーバ
    Fluentd Norikra
    GrowthForecast
    ログ解析・運用基盤
    CDN
    Lua
    Lua
    Lua
    Luaが拡張できるようになる

    View Slide

  51. nginxによる実践的Webシステム
    nginxは単なるHTTPサーバではなく、HTTPによって提供されるWebシステム
    のあらゆる部品としてnginxを利用することができる
    51
    nginx
    Application
    Application
    HTTPS

    View Slide