関連記事:
実はよくわかってないHTTP/2
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪
------------------- ↓ 余談はここから ↓-------------------
nginScriptはさておき、
今後主流になっていくであろうhttp2に対応させてみようと思う。
SPDYの頃から概要は知っても、
提供する側でも使う側でも触れる機会がなかったので、
メリットデメリットについてそれほどわかってない。
ただ、とりあえず対応ぐらいでもメリットはありそうなので、
動かして確認ぐらいはしておこうと思う。
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪
------------------- ↓ 本題はここから ↓-------------------
nginxをHTTP/2対応にする
例によってインストールから始めている適宜すっ飛ばして読んで欲しい。
nginxインストール
準備
sudo apt-get install build-essential # ビルド全般ツール
sudo apt-get install zlib1g-dev # zlibライブラリ(nginxのビルドで必要)
sudo apt-get install libssl-dev # SSLライブラリ(nginxのビルドで必要)
sudo apt-get install libpcre3-dev # PCREライブラリ(nginxのビルドで必要)
省略形
sudo apt-get install build-essential zlib1g-dev libssl-dev libpcre3-dev
ビルド
nginxの1.9.5でHTTP/2をサポートするというアナウンスがされた。
https://www.nginx.com/blog/http2-r7/
ただ、デフォルトではインストールされないので、
ビルドオプションに付け加える必要がある。
wget http://nginx.org/download/nginx-1.9.5.tar.gz
tar xvfz nginx-1.9.5.tar.gz
cd nginx-1.9.5
./configure --pid-path=/run/nginx.pid --user=www-data --group=www-data --with-http_ssl_module --with-http_v2_module
make
sudo make install
cd ..
起動確認
sudo /usr/local/nginx/sbin/nginx # 起動
sudo /usr/local/nginx/sbin/nginx -s quit # 終了
SSLの設定
HTTP/2はSSL必須なので証明書も設置しておく
証明書生成
openssl req -new -nodes -keyout cert.key -out cert.csr -subj "/C=JP/ST=/L=/O=/CN=www.ext.com"
openssl x509 -in cert.csr -out cert.pem -req -signkey cert.key -days 3650
sudo mv cert.* /usr/local/nginx/conf/
設定ファイル調整
SSL周りのコメントアウトを外す
# HTTPS server
#
server {
listen 443 ssl;
server_name localhost;
ssl_certificate cert.pem;
ssl_certificate_key cert.key;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5; # ←ちょっと変えてます
ssl_prefer_server_ciphers on;
location / {
root html;
index index.html index.htm;
}
}
設定を反映
sudo /usr/local/nginx/sbin/nginx -t # 設定変更確認
sudo /usr/local/nginx/sbin/nginx -s quit # 終了
sudo /usr/local/nginx/sbin/nginx # 起動
HTTP/2有効化
起動ができたので設定を調整してHTTP/2を有効にする。
# HTTPS server
#
server {
listen 443 ssl http2;
・・・
}
設定を反映
sudo /usr/local/nginx/sbin/nginx -t # 設定変更確認
sudo /usr/local/nginx/sbin/nginx -s quit # 終了
sudo /usr/local/nginx/sbin/nginx # 起動
http2の確認
アクセスログで確認
ChromeとIEで同じURLにアクセスするとログに記録されるHTTPプロトコルが違うことがわかる
192.168.56.1 - - [01/Oct/2015:12:42:53 +0900] "GET /index.html HTTP/1.1" ← IE
192.168.56.1 - - [01/Oct/2015:12:40:53 +0900] "GET /index.html HTTP/2.0" ← Chrome
生ログ
# IEからのアクセス
192.168.56.1 - - [01/Oct/2015:12:42:53 +0900] "GET /index.html HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"
# Chromeからのアクセス
192.168.56.1 - - [01/Oct/2015:12:40:53 +0900] "GET /index.html HTTP/2.0" 200 755 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 Kinza/2.6.0"
chromeプラグインで確認
対応確認はChromeの拡張機能HTTP/2 and SPDY indicatorでやる
右上の稲妻マークに色がついていたら対応してるとのこと。
ヾ(・ω<)ノ" 三三三● ⅱⅲ コロコロ♪
------------------- ↓ 補足はここから ↓-------------------
自動起動
systemdに登録してOS起動時にnginxも起動するようにする。
参考: https://www.nginx.com/resources/wiki/start/topics/examples/systemd/
serivceファイルの登録
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
自動起動有効
$ sudo systemctl daemon-reload # serviceファイル再読み込み
$ sudo systemctl enable nginx # 自動起動登録
serviceコマンド
$ sudo service nginx start # サービス手動起動
$ sudo service nginx stop # サービス手動停止
$ sudo service nginx restart # サービス再起動