nginxソースビルドを自動化出来るnginx-buildをサクッと入れるItamaeプラグイン作った

nginxは、普通に使うだけなら各ディストリビューションで提供されているパッケージをいれれば良いんですが、サードパーティのモジュールを使いたい時とかはビルドをしなくてはならないです。非常に面倒くさいです。

そんな面倒くさいビルドを自動化してくれる`nginx-build`という神ツールがあったので、nginx-buildを導入するItamaeプラグインを作りました。Itamae使っている人は、使ってみてください。

- [zaru/itamae-plugin-recipe-nginx_build](https://github.com/zaru/itamae-plugin-recipe-nginx_build)

# nginx-buildとは

- [nginx-build](https://github.com/cubicdaiya/nginx-build)

nginx-buildはメルカリの[@cubicdaiya](https://twitter.com/cubicdaiya)さんがGoで書かれたnginxのビルドプロセスを自動化してくれるツールです。バイナリでも配布されており、Linux以外にもMacのHomebrewにも対応しています。

## 使い方

nginx-buildの使い方は非常に簡単です。バイナリをダウンロードして設置したら、すぐ使えます。

```
$ nginx-build -d work -v 1.8.0
```

これでv1.8.0のnginxがビルドされます。最後の`make install`だけは手動で行います。

```
$ cd work/1.8.0/nginx-1.8.0
$ sudo make install
```

### configureオプション

configureオプションを指定できます。

```
$ nginx-build -d work -v 1.8.0 -c configure.sh
```

```bash:configure.sh
#!/bin/sh

./configure \
  --user=nginx \
  --group=nginx \
  --sbin-path=/usr/sbin/nginx \
  --conf-path=/etc/nginx/nginx.conf \
  --pid-path=/var/run/nginx.pid \
  --with-http_ssl_module
```

### サードパーティモジュール

サードパーティモジュールも指定すると、ダウンロードから組み込みまで全部自動でやってくれます。すごすぎる。

```
$ nginx-build -d work -v 1.8.0 -m modules3rd.ini
```

```modules3rd.ini
[ngx_cache_purge]
form=git
url=https://github.com/FRiCKLE/ngx_cache_purge.git
rev=2.3
```

他にもOpenRestyとかTengineのビルドをサポートしていたりと細かいところまで手の届く素晴らしいツールです。ありがとうございます。詳しいことについては@cubicdaiyaさんの解説記事を読むと良いです。

- [nginx-buildでnginxをビルドしよう](http://qiita.com/cubicdaiya/items/a0411c190f043a85ad2f)
- [nginx-build〜nginxのビルドプロセスを自動化〜](http://tech.mercari.com/entry/2015/08/26/170000)

## Itamaeプラグイン

紹介したnginx-buildの導入をItamaeで自動化するようにプラグインがこちらです。

- [zaru/itamae-plugin-recipe-nginx_build](https://github.com/zaru/itamae-plugin-recipe-nginx_build)

### 使い方

```Gemfile
gem 'itamae-plugin-recipe-nginx_build'
```

```recipe.rb
include_recipe "nginx_build"
include_recipe "nginx_build::install"
```

これだけで、デフォルトv1.8.0のnginxがインストールされます（後述するオプションで細かく指定できます）。

#### なにをやってくれるのか

- nginxに必要なパッケージのインストール
- nginx-buildのインストール
- nginx v1.8.0の make install
- nginxの起動スクリプト設置
- nginxの起動＆自動起動設定

この5つを行います。nginxのホスト毎の設定ファイルは設置しないので、別途レシピに書く必要があります。

#### オプション

Itamaeのノードファイルで細かく指定できます。すべてオプショナルなので、指定しなかった場合は、下記の値がデフォルトで反映されます（modules / modules3rdsを除く）。

```development.yml
nginx_build:
  platform: linux ( or darwin )
  version: 0.6.4
  bin: /usr/local/bin/
  nginx_version: 1.8.0
  nginx_user: nginx
  nginx_group: nginx
  nginx_sbin: /usr/sbin/nginx
  nginx_conf: /etc/nginx/nginx.conf
  nginx_pid: /var/run/nginx.pid
  modules:
    - http_ssl_module
  modules3rds:
    -
      name: ngx_cache_purge
      form: git
      url: https://github.com/FRiCKLE/ngx_cache_purge.git
      rev: 2.3
  configure_path: /usr/local/nginx_build/configure.sh
  modules3rd_path: /usr/local/nginx_build/modules3rd.ini
```

#### 実際の使い方

必要最低限の設定ファイルしか設置されないので、サーバごとに必要な設定ファイルは別途レシピで書いてあげる感じになります。僕が実際に使っているレシピの一部を抜き出すとこんな感じになります。

```nginx/default.rb
include_recipe "nginx_build"
include_recipe "nginx_build::install"

directory "/etc/nginx/conf.d/"
template "/etc/nginx/conf.d/virtual.conf" do
  owner "root"
  group "root"
  mode "644"
  source "./#{node[:role]}/templates/etc/nginx/conf.d/virtual.conf.erb"
  notifies :restart, "service[nginx]"
end

directory "/var/log/nginx/"
template "/etc/logrotate.d/nginx" do
  source "./#{node[:role]}/templates/etc/logrotate.d/nginx.erb"
end
```

プラグインが動かない環境がたぶんあると思うので、不具合あればIssueなりプルリクなり投げていただけると助かります。