狠狠撸

狠狠撸Share a Scribd company logo
HTTP/2 in nginx
Yoko TAMADA @tmd45
2016-03-11 feedforce Inc.
第一部:WWW 通信プロトコル基礎
     ? HTTP/1.1 を振り返る
第二部:高速化の歩み ? SPDY 実験
第三部:16 年ぶりの新鋭 HTTP/2 !
今回のお話
… は、1時間くらいかかるし、あちこちで聞き
まくって飽きたのでやめました。
「やっぱり動かしてみよう」と思い立って3日、
思った以上にさっくり動いたのでそんな話と某
所で聞いた注意点など
そういえば
● HTTP/2 って必要なの?
○ もはや論じる余地なし
○ むずかしい話は端折りますけど、
HTTP/1 から HTTP/1.1 にしなかっ
た人がいますか?
■ いるかもしれんけど(涙)
○ 対応時期を考える必要はあれども、
今後絶対に対応必須です!
● 用意したサーバ
○ ConoHa
■ GMO のオール SSD クラウド VPS
■ メモリ 1GB, 2 Core, SSD 50GB 底辺プラン
○ CentOS 7.2
○ 作業用ユーザ作成して SSH ログイ
ンしたぞ
前提
● ソースコードからビルド; nginx-build
● 安全な HTTPS 通信設定
● HTTP/2 の利用
アジェンダ
nginx-build
● nginx-build を使おう
○ https://github.com/cubicdaiya/nginx-build
● go get するので go の準備から
nginx をソースコードからビルドする
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
● ビルドに必要なパッケージ
○ gcc
○ wget, git, mercurial
● HTTP モジュールで必要になるライブラリ
○ pcre-devel /* 正規表現 */
○ zlib-devel /* gzip 圧縮 */
○ openssl-devel /* SSL/TLS */
yum install
# 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
# 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
$ 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
$ 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 の構成確認
● 問題点
○ CentOS 7 の systemd でサービス管理す
るためのファイル nginx.service が生成さ
れない
○ systemctl enable nginx.service できない
○ 自分で作る(今回はまだやってない)
$ sudo nginx
$ sudo nginx -s stop
nginx 起動と停止
HTTPS 通信設定
最低限の 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
余談; 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.
● Mozilla SSL Configuration Generator
○ https://mozilla.github.io/server-side-tls/ssl-
config-generator/
安全な HTTPS 通信設定
安全な 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
● 各ディレクティブの解説
○ 『nginx 実践入門』オススメ
■ 暗号化スイート
■ HSTS
■ 安全性と互換性のバランスについ
て(ただし書籍執筆時点)
安全な HTTPS 通信設定
HTTP/2
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
これだけ!
● nginx 1.9.5 ?(now 1.9.12)
● SPDY 利用しようとすると怒られる
○ --with-http_spdy_module
○ listen 443 ssl spdy;
○ その他 spdy_* ディレクティブが残ってる
とエラー
Module ngx_http_v2_module
SPDY 対応ブラウザ
HTTP/2 対応ブラウザ
● SPDY や HTTP/2 を使わない通信を行うだけ
○ 基本的には HTTP/1.1 プロトコルになる
○ HTTP/2 がだめなら SPDY/3.1 で、とはな
らない(少なくとも nginx は)
○ しかし未対応というかバグで上手く動かな
いってことはあるかもね???
未対応ブラウザってどうなるの?
● アクセス解析ツールでエラーが出たという
話も
○ 話に上がってたのは CGI ツール
○ クローリングとか必要なサイトではツー
ルでの動作確認も忘れずに
ブラウザだけじゃないかも
便利
ツール
Chrome 拡張:
HTTP/2 and SPDY indicator
● ソースコードからビルド; nginx-build
● 安全な HTTPS 通信設定
● HTTP/2 の利用と注意点
● 便利; HTTP/2 and SPDY indicator
今回のお話
終──────
???

More Related Content

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

  • 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 の利用 アジェンダ
  • 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 起動と停止
  • 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 実践入門』オススメ ■ 暗号化スイート ■ HSTS ■ 安全性と互換性のバランスについ て(ただし書籍執筆時点) 安全な HTTPS 通信設定
  • 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
  • 26. ● SPDY や HTTP/2 を使わない通信を行うだけ ○ 基本的には HTTP/1.1 プロトコルになる ○ HTTP/2 がだめなら SPDY/3.1 で、とはな らない(少なくとも nginx は) ○ しかし未対応というかバグで上手く動かな いってことはあるかもね??? 未対応ブラウザってどうなるの?
  • 27. ● アクセス解析ツールでエラーが出たという 話も ○ 話に上がってたのは CGI ツール ○ クローリングとか必要なサイトではツー ルでの動作確認も忘れずに ブラウザだけじゃないかも
  • 29. Chrome 拡張: HTTP/2 and SPDY indicator
  • 30. ● ソースコードからビルド; nginx-build ● 安全な HTTPS 通信設定 ● HTTP/2 の利用と注意点 ● 便利; HTTP/2 and SPDY indicator 今回のお話 終────── ???