Pro Yearly is on sale from $80 to $50! »

HTTP/2 in nginx(2016/3/11 社内勉強会)

HTTP/2 in nginx(2016/3/11 社内勉強会)

CentOS 7.2 環境で nginx をソースコードからインストールし、HTTP/2 を利用できるまで実施してみました。
追記; nginx-build のち、systemctl - TMD45'β'LOG!!! http://blog.tmd45.jp/entry/2016/08/13/120924

Fffc4f94bc7b7358b4f0a9663976a19e?s=128

Yoko TAMADA

March 11, 2016
Tweet

Transcript

  1. HTTP/2 in nginx Yoko TAMADA @tmd45 2016-03-11 feedforce Inc.

  2. 第一部:WWW 通信プロトコル基礎      〜 HTTP/1.1 を振り返る 第二部:高速化の歩み 〜 SPDY 実験 第三部:16

    年ぶりの新鋭 HTTP/2 ! 今回のお話 … は、1時間くらいかかるし、あちこちで聞き まくって飽きたのでやめました。 「やっぱり動かしてみよう」と思い立って3日、 思った以上にさっくり動いたのでそんな話と某 所で聞いた注意点など
  3. そういえば • HTTP/2 って必要なの? ◦ もはや論じる余地なし ◦ むずかしい話は端折りますけど、 HTTP/1 から

    HTTP/1.1 にしなかっ た人がいますか? ▪ いるかもしれんけど(涙) ◦ 対応時期を考える必要はあれども、 今後絶対に対応必須です!
  4. • 用意したサーバ ◦ ConoHa ▪ GMO のオール SSD クラウド VPS

    ▪ メモリ 1GB, 2 Core, SSD 50GB 底辺プラン ◦ CentOS 7.2 ◦ 作業用ユーザ作成して SSH ログイ ンしたぞ 前提
  5. • ソースコードからビルド; nginx-build • 安全な HTTPS 通信設定 • HTTP/2 の利用

    アジェンダ
  6. nginx-build

  7. • nginx-build を使おう ◦ https://github.com/cubicdaiya/nginx-build • go get するので go

    の準備から nginx をソースコードからビルドする
  8. go get nginx-build # cd /usr/local/src # wget https://storage.googleapis.com/golang/go1.6.linux- amd64.tar.gz

    # tar -C /usr/local/ -xzf go1.6.linux-amd64.tar.gz # echo "export PATH=$PATH:/usr/local/go/bin" >> /etc/profile $ mkdir ~/golang $ echo "export GOPATH=$HOME/golang" >> ~/.bashrc $ echo "export PATH=$PATH:$GOPATH/bin" >> ~/.bashrc $ go get -u github.com/cubicdaiya/nginx-build
  9. • ビルドに必要なパッケージ ◦ gcc ◦ wget, git, mercurial • HTTP

    モジュールで必要になるライブラリ ◦ pcre-devel /* 正規表現 */ ◦ zlib-devel /* gzip 圧縮 */ ◦ openssl-devel /* SSL/TLS */ yum install
  10. # mkdir ~/nginx # vi ~/nginx/configure Custom configuration #!/bin/sh ./configure

    \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --with-http_gzip_static_module \ --with-http_ssl_module \ --with-http_v2_module \
  11. # vi ~/nginx/module3rd.cfg 3rd-party module [headers-more-nginx-module] form=git url=https://github.com/openresty/headers-more-nginx-module.git rev=v0.29

  12. $ mkdir work $ nginx-build -d work [-v 1.9.12] \

    -c nginx/configure -m nginx/module3rd.cfg nginx-build: 0.7.1 Compiler: gc go1.6 2016/03/09 00:39:09 Download nginx-1.9.12..... ... 2016/03/09 00:39:29 Enter the following command for install nginx. $ cd work/nginx/1.9.12/nginx-1.9.12 $ sudo make install build & make install
  13. $ nginx -V nginx version: nginx/1.9.12 built by gcc 4.8.5

    20150623 (Red Hat 4.8.5-4) (GCC) built with OpenSSL 1.0.1e-fips 11 Feb 2013 TLS SNI support enabled configure arguments: --sbin-path=/usr/sbin/nginx --conf- path=/etc/nginx/nginx.conf --with-http_gzip_static_module -- with-http_ssl_module --with-http_v2_module --add-module=.. /headers-more-nginx-module nginx の構成確認
  14. • 問題点 ◦ CentOS 7 の systemd でサービス管理す るためのファイル nginx.service

    が生成さ れない ◦ systemctl enable nginx.service できない ◦ 自分で作る(今回はまだやってない) $ sudo nginx $ sudo nginx -s stop nginx 起動と停止
  15. HTTPS 通信設定

  16. 最低限の HTTPS 通信設定 server { listen 443 default_server ssl; server_name

    example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ... } /etc/nginx/conf.d/example.com.conf
  17. 余談; SSL 証明書 ~Let's Encrypt! • 使ってみた → 超簡単 $

    git clone https://github.com/letsencrypt/letsencrypt $ cd letsencrypt/ $ ./letsencrypt-auto --help ※ DNS 設定済み, nginx 停止中 $ ./letsencrypt-auto certonly -a standalone \ -d example.com -d www.example.com ※ TUI が起動 → メアド入力&規約同意 IMPORTANT NOTES: - Congratulations! Your certificate and chain have been saved at /etc/letsencrypt/live/example.com/fullchain.pem. Your cert will expire on 2016-06-08. To obtain a new version of the certificate in the future, simply run Let's Encrypt again.
  18. • Mozilla SSL Configuration Generator ◦ https://mozilla.github.io/server-side-tls/ssl- config-generator/ 安全な HTTPS

    通信設定
  19. 安全な HTTPS 通信設定 server { listen 443 default_server ssl; server_name

    example.net www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ssl_session_timeout 1d; ssl_session_cache shared:SSL:5m; ssl_session_tickets off; ssl_dhparam /etc/nginx/ssl/dhparam.pem; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA- CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA- AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256'; ssl_prefer_server_ciphers on; add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on; ssl_trusted_certificate /etc/letsencrypt/live/example.com/fullchain.pem; resolver 8.8.8.8 8.8.4.4 valid=300s; resolver_timeout 5s; /etc/nginx/conf.d/example.com.conf
  20. • 各ディレクティブの解説 ◦ 『nginx 実践入門』オススメ ▪ 暗号化スイート ▪ HTST ▪

    安全性と互換性のバランスについ て(ただし書籍執筆時点) 安全な HTTPS 通信設定
  21. HTTP/2

  22. HTTP/2 の有効化 server { listen 443 default_server ssl http2; server_name

    example.com www.example.com; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; ... } /etc/nginx/conf.d/example.com.conf これだけ!
  23. • nginx 1.9.5 〜(now 1.9.12) • SPDY 利用しようとすると怒られる ◦ --with-http_spdy_module

    ◦ listen 443 ssl spdy; ◦ その他 spdy_* ディレクティブが残ってる とエラー Module ngx_http_v2_module
  24. SPDY 対応ブラウザ

  25. HTTP/2 対応ブラウザ

  26. • SPDY や HTTP/2 を使わない通信を行うだけ ◦ 基本的には HTTP/1.1 プロトコルになる ◦

    HTTP/2 がだめなら SPDY/3.1 で、とはな らない(少なくとも nginx は) ◦ しかし未対応というかバグで上手く動かな いってことはあるかもね〜〜〜 未対応ブラウザってどうなるの?
  27. • アクセス解析ツールでエラーが出たという 話も ◦ 話に上がってたのは CGI ツール ◦ クローリングとか必要なサイトではツー ルでの動作確認も忘れずに

    ブラウザだけじゃないかも
  28. 便利 ツール

  29. Chrome 拡張: HTTP/2 and SPDY indicator

  30. • ソースコードからビルド; nginx-build • 安全な HTTPS 通信設定 • HTTP/2 の利用と注意点

    • 便利; HTTP/2 and SPDY indicator 今回のお話 終 ────── ⓣⓜⓓ