passenger + nginxでオプションを指定してビルドする


[Phusion Passenger](https://www.phusionpassenger.com/)を組み込んだnginxをビルドしてくれる`passenger-install-nginx-module`ですが、ここで自動ビルドされるnginxには欲しいモジュールが組み込まれていないかも知れません。
(例えばHTTP/2(ALPN)対応など)

`passenger-install-nginx-module`はそんな時も簡単に対応できました。

## 前提条件
以下の条件で確認しています

* Phusion PassengerをGemインストール済
* passenger 5.2.2

## nginxのソースコードを準備
ビルドしたいバージョンのnginxソースコードを取得し、展開しておきます。

* https://nginx.org/en/download.html

```
# cd /usr/local/src
# curl -L -O https://nginx.org/download/nginx-1.12.2.tar.gz
# tar xofz nginx-1.12.2.tar.gz
```

### その他モジュール類のソースコードを準備
後程configure時に指定したいものがある場合もここで用意しておきます。
例えば、ALPNに対応するためにはOpenSSLのバージョンが1.0.2以上である必要がある [^supporting-http2-google-chrome-users] ため、ソースコードを取得し展開しておきます。

* https://www.openssl.org/source/

```
# cd /usr/local/src
# curl -L -O https://www.openssl.org/source/openssl-1.1.0h.tar.gz
# tar xofz openssl-1.1.0h.tar.gz
```

## `passenger-install-nginx-module`実行

対話型なんてまどろっこしいことはしたくない、そんな方は[補足](http://qiita.com/h-izumi/items/d5d49518b979ff9d4449#%E8%A3%9C%E8%B6%B3-%E9%9D%9E%E5%AF%BE%E8%A9%B1%E5%9E%8B%E3%83%93%E3%83%AB%E3%83%89)へ。

### 第2の道へ
`passenger-install-nginx-module`を実行し、`Automatically download and install Nginx?`と聞かれるまで通常通り進めます。

```
# passenger-install-nginx-module
```

省略

```
Automatically download and install Nginx?

Nginx doesn't support loadable modules such as some other web servers do,
so in order to install Nginx with Passenger support, it must be recompiled.

Do you want this installer to download, compile and install Nginx for you?

 1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 1.12.2 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

 2. No: I want to customize my Nginx installation. (for advanced users)
    Choose this if you want to compile Nginx with more third party modules
    besides Passenger, or if you need to pass additional options to Nginx's
    'configure' script. This installer will  1) ask you for the location of
    the Nginx source code,  2) run the 'configure' script according to your
    instructions, and  3) run 'make install'.

Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.

Enter your choice (1 or 2) or press Ctrl-C to abort: 
```

ここで`2`を入力して進みます。

```
Enter your choice (1 or 2) or press Ctrl-C to abort: 2
```

### ソースコードを指定
すると、次のようにnginxソースコードの場所を聞かれます。

```
Where is your Nginx source code located?

Please specify the directory: 
```

先程用意しておいた場所を入力して進みます。

```
Please specify the directory: /usr/local/src/nginx-1.12.2
```

### インストール先を指定

続いて、nginxのインストール先を聞かれます。

```
Where do you want to install Nginx to?

Please specify a prefix directory [/opt/nginx]: 
```

`/opt/nginx`で構わなければそのまま`Enter`、必要があれば場所を入力して進みます。

### configureオプション追加

そしてお待ちかね、configure時に追加したいオプションを聞いてきます。

```
Extra Nginx configure options

If you want to pass extra arguments to the Nginx 'configure' script, then
please specify them. If not, then specify nothing and press Enter.

If you specify nothing then the 'configure' script will be run as follows:

  sh ./configure --prefix='/opt/nginx' --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_addition_module --with-cc-opt=-Wno-error --with-ld-opt='' --add-module='/path/to/passenger-5.2.2/src/nginx_module'

Extra arguments to pass to configure script: 
```

ここで好きなようにオプションを指定します。
今回はHTTP/2(ALPN)対応のために`--with-openssl=`でOpenSSLのソースコードを指定しました。

```
Extra arguments to pass to configure script: --with-openssl='/usr/local/src/openssl-1.1.0h'
```

`Enter`で進むと、入力したオプションを含めた確認が表示されます。

```
Confirm configure flags

The Nginx configure script will be run as follows:

  sh ./configure --prefix='/opt/nginx' --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_addition_module --with-cc-opt=-Wno-error --with-ld-opt='' --add-module='/path/to/passenger/src/nginx_module' --with-openssl='/usr/local/src/openssl-1.1.0h'

Is this what you want? (yes/no) [default=yes]: 
```

ここで`no`を入力すると、`Extra Nginx configure options`まで戻り再度設定できるようになります。
問題なければ、`yes`あるいはそのまま`Enter`で進みます。

### ビルド
後は、ビルドが終わり以下のようなメッセージが表示されるまで待ちます。

```
Nginx with Passenger support was successfully installed.

The Nginx configuration file (/opt/nginx/conf/nginx.conf)
must contain the correct configuration options in order for Phusion Passenger
to function correctly.

This installer has already modified the configuration file for you! The
following configuration snippet was inserted:

  http {
      ...
      passenger_root /path/to/passenger;
      passenger_ruby /path/to/ruby;
      ...
  }

After you start Nginx, you are ready to deploy any number of Ruby on Rails
applications on Nginx.

Press ENTER to continue.
```

`Enter`を入力すると完了です。

```
Deploying a web application

To learn how to deploy a web app on Passenger, please follow the deployment
guide:

  https://www.phusionpassenger.com/library/deploy/nginx/deploy/

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
https://www.phusionpassenger.com

Passenger® is a registered trademark of Phusion Holding B.V.
```

## 確認

期待通りのnginxがビルドされたか確認しておきます。
インストール先の`sbin/nginx -V`を実行します。

```
# /opt/nginx/sbin/nginx -V
```

```
nginx version: nginx/1.12.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-16) (GCC)
built with OpenSSL 1.1.0h  27 Mar 2018
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_gzip_static_module --with-http_stub_status_module --with-http_addition_module --with-cc-opt=-Wno-error --with-ld-opt= --add-module=/path/to/passenger/src/nginx_module --with-openssl=/usr/local/src/openssl-1.1.0h
```

今回の例では、`built with OpenSSL`のバージョンが指定したソースコードのものとなっていること、`configure arguments:`に指定したオプションが記述されていることが確認できます。

お疲れさまでした。

## 補足) 非対話型ビルド
上記の対話型ビルド作業は、`passenger-install-nginx-module`に引数を渡すことで非対話型で済ませることもできます。

```
# passenger-install-nginx-module --help
Usage: passenger-install-nginx-module [options]

Options:
        --auto                       Automatically confirm 'Press ENTER to
                                     continue' prompts.
        --prefix=DIR                 Use the given Nginx install prefix instead
                                     of asking for it interactively.
        --auto-download              Download and install Nginx automatically,
                                     instead of asking interactively whether to
                                     download+install or to use an existing
                                     Nginx source directory.
        --nginx-source-dir=DIR       Compile and install Nginx using the given
                                     Nginx source directory, instead of
                                     interactively asking to download+install
                                     or to use an existing Nginx source
                                     directory. Conflicts with --auto-download.
        --extra-configure-flags=STRING
                                     Pass these extra flags to Nginx's
                                     'configure' script, instead of asking for
                                     it interactively. Specify 'none' if you
                                     do not want to pass additional flags but do
                                     not want this installer to ask
                                     interactively either.
        --languages NAMES            Comma-separated list of interested
                                     languages (e.g.
                                     'ruby,python,nodejs,meteor')
        --force-colors               Display colors even if stdout is not a TTY
```

今回の記事の例では、以下のように設定すると対話型と同様の結果になります。

```
passenger-install-nginx-module --auto --prefix=/opt/nginx --nginx-source-dir='/usr/local/src/nginx-1.12.2' --extra-configure-flags="--with-openssl='/usr/local/src/openssl-1.1.0h'"
```

[^supporting-http2-google-chrome-users]: [Supporting HTTP/2 for Google Chrome Users | NGINX](https://www.nginx.com/blog/supporting-http2-google-chrome-users/)