nginx 1.9.5 + ngx_pagespeed on Ubuntu 14.04 の導入とHTTP/2の設定

# About

Ubuntu 14.04 の環境に、nginx + ngx_pagespeed な環境を構築した時の作業メモです。

先日、nginxのMainline版である[1.9.5がリリースされました](https://www.nginx.com/blog/nginx-1-9-5/)が、HTTP/2対応が取り込まれたということで、これを機に自鯖(今はSPDY)をHTTP/2デビューさせます！

ちなみに、バックエンドで動かしているphp-fpm(FastCGI)はHTTP/2を喋らないぞ？？？、と心配になりましたが、結論としては心配無用でした。

[公式の解説](https://www.nginx.com/blog/early-alpha-patch-http2/)によると、NginxはHTTP/2のGatewayとして機能し、バックエンドとはHTTP/1.1に変換して喋るようになっているようです。

> NGINX acts as an “HTTP/2 gateway” to ease the transition to the new protocol. On the front end, NGINX talks HTTP/2 to client web browsers that support it, and on the back end it talks HTTP/1.x (or FastCGI, uwsgi, SCGI) just as before. In between, NGINX translates between HTTP/2 and HTTP/1.x (or FastCGI, etc). This means that servers and applications proxied by NGINX will be unaffected by the move to HTTP/2, and don’t really even need to know that their clients are using HTTP/2. 


# 前提

* OS: Ubuntu 14.04 LTS
* 追加モジュール
   * [ngx_pagespeed](https://github.com/pagespeed/ngx_pagespeed)
* TLSは対応済みとする

なお、追加モジュール無しで純粋にnginxだけ入れるのであれば、Mainline版のapt sourceが用意されているので、apt経由でインストールするのが楽です([参考](http://nginx.org/en/linux_packages.html))が、今回はngx_pagespeedモジュールを導入するので、ソースからコンパイルしてdebパッケージを構築する方法を採用します。


# 作業ログ

## Nginxのソースと依存パッケージを取得する

先ほどaptは使わないと述べましたが、ソースと依存パッケージの取得だけaptを利用します。
`/etc/apt/sources.list`を編集します。

```:/etc/apt/sources.list
# nginx mainline
deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
```

ソースを取得し、依存パッケージをインストールします。

```sh
$ sudo mkdir /opt/nginx
$ cd /opt/nginx
$ sudo apt-get update
$ sudo apt-get build-dep nginx
$ sudo apt-get source nginx
$ ls -1p
nginx-1.9.5/
nginx_1.9.5-1~trusty.debian.tar.gz
nginx_1.9.5-1~trusty.dsc
nginx_1.9.5.orig.tar.gz
```

今後間違って`apt-get install nginx`としてしまわないようにするため、
`/etc/apt/sources.list`から先ほど追加した定義を外しておきます。

```:/etc/apt/sources.list
# nginx mainline
# deb http://nginx.org/packages/mainline/ubuntu/ trusty nginx
# deb-src http://nginx.org/packages/mainline/ubuntu/ trusty nginx
```

## ngx_pagespeedモジュールのソースと依存パッケージを取得する

ngx_pagespeedモジュールの導入に必要な依存パッケージをインストールします。

```sh
$ sudo apt-get install build-essential zlib1g-dev libpcre3 libpcre3-dev unzip
```

ngx_pagespeedモジュールのソースを取得します。

```sh
$ sudo mkdir -p /opt/ngx_pagespeed
$ sudo wget https://github.com/pagespeed/ngx_pagespeed/archive/release-1.9.32.6-beta.zip
$ sudo unzip release-1.9.32.6-beta.zip
$ cd ngx_pagespeed-release-1.9.32.6-beta
$ sudo wget https://dl.google.com/dl/page-speed/psol/1.9.32.6.tar.gz
$ sudo tar -xzvf 1.9.32.6.tar.gz
```


## Nginxのビルド設定を編集する

Nginxのコンパイル時にngx_pagespeedをモジュールとして追加するように設定します。
`/opt/nginx/nginx-1.9.5/debian/rules`を編集して、ngx_pagespeedを追加します。


```:/opt/nginx/nginx-1.9.5/debian/rules
override_dh_auto_build:
        ...
        --with-ipv6 \
        # 追加
        --add-module=/opt/ngx_pagespeed/ngx_pagespeed-release-1.9.32.6-beta
...

configure_debug:
        ...
        --with-debug \
        # 追加
        --add-module=/opt/ngx_pagespeed/ngx_pagespeed-release-1.9.32.6-beta
...
```

## コンパイル

```sh
$ cd /opt/nginx/nginx-1.9.5
$ sudo dpkg-buildpackage -b
```

コンパイル成功後、`/opt/nginx`にdebファイルが生成されていることが分かります。
なお、インストールすべきdebファイルは`nginx_1.9.5-1~trusty_amd64.deb`です。

```sh
$ cd /opt/nginx
$ ls -1p
nginx-1.9.5/
nginx-dbg_1.9.5-1~trusty_amd64.deb
nginx-debug_1.9.5-1~trusty_amd64.deb
nginx_1.9.5-1~trusty.debian.tar.gz
nginx_1.9.5-1~trusty.dsc
nginx_1.9.5-1~trusty_amd64.changes
nginx_1.9.5-1~trusty_amd64.deb
nginx_1.9.5.orig.tar.gz
```

## インストール

念のため、設定ファイルのバックアップを取った上で、旧バージョンのdebファイルも用意して、すぐに戻せるようにしておきます。

```sh
$ cd /opt/nginx
$ sudo service nginx stop
$ sudo dpkg -i nginx_1.9.5-1~trusty_amd64.deb
$ sudo service nginx start
```

正常に起動できたら、改めてHTTP/2を有効にして、nginxを再起動します。

```:/etc/nginx/conf.d/default_ssl.conf
server {
    ...
    listen       443 ssl http2;
    listen       [::]:443 ssl http2;
    ...
}
```

```sh
$ sudo service nginx restart
```

[HTTP/2 and SPDY indicator](https://chrome.google.com/webstore/detail/http2-and-spdy-indicator/mpbpobfflnpcgagjijhmgnchggcjblin?hl=ja)などで、HTTP/2が有効になっているか確認できます。

# 参考

* [Compiling Third-Party Modules Into Nginx](https://serversforhackers.com/compiling-third-party-modules-into-nginx)
* [Build ngx_pagespeed From Source](https://developers.google.com/speed/pagespeed/module/build_ngx_pagespeed_from_source)