nginxでhttp2(1)

[VirtualBox]:https://www.virtualbox.org/wiki/Downloads
[Ubuntu]:http://ftp.riken.jp/Linux/ubuntu-releases/
[nginx]:http://nginx.org/
[Launching nginScript and Looking Ahead]:https://www.nginx.com/blog/launching-nginscript-and-looking-ahead/
[nginScript Documentation]:https://www.nginx.com/resources/wiki/nginScript/
[HTTP/2 and SPDY indicator]:https://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin?hl=ja

関連記事:

 * [VirtualBox+UbuntuにLEMP環境構築]
 * [nginScriptを試す(1):nginxをソースコンパイル]

[VirtualBox+UbuntuにLEMP環境構築]:http://qiita.com/dozo/items/1c21c8758121c366ba90
[nginScriptを試す(1):nginxをソースコンパイル]:http://qiita.com/dozo/items/98077bdd9cbf928cc422

実はよくわかってないHTTP/2

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪
***
------------------- ↓ 余談はここから ↓-------------------
nginScriptはさておき、
今後主流になっていくであろうhttp2に対応させてみようと思う。

SPDYの頃から概要は知っても、
提供する側でも使う側でも触れる機会がなかったので、
メリットデメリットについてそれほどわかってない。

ただ、とりあえず対応ぐらいでもメリットはありそうなので、
動かして確認ぐらいはしておこうと思う。

ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪
***
------------------- ↓ 本題はここから ↓-------------------

# [nginx]をHTTP/2対応にする

例によってインストールから始めている適宜すっ飛ばして読んで欲しい。

## [nginx]インストール

### 準備
```shell-session
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のビルドで必要)
```

#### 省略形
```shell-session
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/
ただ、デフォルトではインストールされないので、
ビルドオプションに付け加える必要がある。

```shell-session
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 ..
```
### 起動確認
```shell-session
sudo /usr/local/nginx/sbin/nginx # 起動
sudo /usr/local/nginx/sbin/nginx -s quit # 終了
```

## SSLの設定
HTTP/2はSSL必須なので証明書も設置しておく

### 証明書生成
```shell-session
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周りのコメントアウトを外す

```ini:/usr/local/nginx/conf/nginx.conf
    # 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;
        }
    }
```

### 設定を反映

```shell-session
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を有効にする。

```ini:/usr/local/nginx/conf/nginx.conf
    # HTTPS server
    #
    server {
        listen       443 ssl http2;
        ・・・
    }
```

### 設定を反映

```shell-session
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プロトコルが違うことがわかる

```text
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
```

#### 生ログ
```text
# 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]でやる
右上の稲妻マークに色がついていたら対応してるとのこと。

![nginx06.PNG](https://qiita-image-store.s3.amazonaws.com/0/40697/171dc9bd-011a-c231-3f22-fe961474955f.png)


ヾ(・ω<)ﾉ"　三三三●　ⅱⅲ コロコロ♪
***
------------------- ↓ 補足はここから ↓-------------------

## 自動起動

systemdに登録してOS起動時に[nginx]も起動するようにする。
参考: https://www.nginx.com/resources/wiki/start/topics/examples/systemd/

#### serivceファイルの登録
```ini:/lib/systemd/system/nginx.service
[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
```

#### 自動起動有効
```shell-session
$ sudo systemctl daemon-reload    # serviceファイル再読み込み
$ sudo systemctl enable nginx     # 自動起動登録
```

#### serviceコマンド
```shell-session
$ sudo service nginx start        # サービス手動起動
$ sudo service nginx stop         # サービス手動停止
$ sudo service nginx restart      # サービス再起動
```