FreeBSD 上で Nginx の pkg を使う場合のメモ 応用編

FreeBSD上でNginxのpkgを使う場合のメモです。応用編




# nginxパッケージで対応しているモジュールを確認
nginxのportsでどのオプションが対応しているかはMakefileなどを見ればわかります
https://github.com/freebsd/freebsd-ports/tree/master/www/nginx
portsがインストールされていればmake showconfigで見れるようです
http://d.hatena.ne.jp/littlebuddha/20110524/1306224902





# nginxのhttp_image_filter_moduleを使いたい場合
nginxをpkgで管理したい場合2つの選択肢が考えられます。

## nginx-fullパッケージをインストール
この方法が1番楽ですが、http_image_filter_moduleを使いたいだけなのに
依存パッケージがたくさんインストールされてしまうのが個人的に嫌なので

```
# pkg install nginx-full
```
ちなみにhttp_image_filter_moduleはdynamicモジュールなので設定ファイルに下記の追記が必要です

```
load_module /usr/local/libexec/nginx/ngx_http_image_filter_module.so;
```

## portsを使ってnginxをインストール
個人的にはこの方法を利用しています
依存パッケージがたくさんあるなどの理由からnginx-fullはちょっと...という場合は
portsから自分でビルドすると自分用のnginxをインストールすることができます

portsが展開されていない場合はダウンロードする必要があります

```
# portsnap fetch && portsnap extract
```

nginxのディレクトリに移動してmakeします

```
# cd /usr/ports/www/nginx/
# make install clean
```

初めてmakeする時は下記のような画面でオプションを選択できるので
HTTP_IMAGE_FILTER を[x]にしてOKして進めると
http_image_filter_module 付きのnginxがインストールされます
![nginx options](https://qiita-image-store.s3.amazonaws.com/0/153252/0010ba8c-2694-2431-d929-d2363b7b990c.png)
※依存関係にあるパッケージもportsからのインストールになるので注意

オプションのダイアログが面倒な場合は下記でOK（依存パッケージも全部ダイアログ無しになる）

```
# make OPTIONS_FILE_SET+=HTTP_IMAGE_FILTER BATCH=yes install clean
```





# portsでインストールしたnginxを他ホストでも使いたい場合
カスタムしてインストールしたnginxパッケージを複数台のホストに入れる場合、
毎回portsでビルドをするのは面倒なのでビルドしたホストでpkgを作成し
ファイルからインストールさせることができます

```
# pkg create nginx
```

pkg createするとnginx-1.14.2,2.txzがカレントディレクトリに生成されるので
他ホストでpkg addするとインストールできます(指定するファイルはHTTP経由でも大丈夫)

```
# pkg add nginx-1.14.2,2.txz
```
※ファイルからのインストールはコマンドがinstallではなくaddになるので注意
これでサーバが複数台あっても楽勝です




# portsに登録されていないモジュールを使いたい場合
portsのnginxに登録されてない[モジュール(例えばnginx-http-concat)](https://github.com/alibaba/nginx-http-concat)を使いたい場合は
portsを修正してインストールします(nginxをpkgで管理したいため)


## portsの修正方法その1
力技で無理やり組み込むパターンです
gitでnginx-http-concatのソースをダウンロードし、
configureの引数を追加するためのMakefile.localを作成してmake installするだけです
http://q.hatena.ne.jp/1144785941

```
# cd /tmp; git clone https://github.com/alibaba/nginx-http-concat
# cd /usr/ports/www/nginx
# echo 'CONFIGURE_ARGS+=--add-module=/tmp/nginx-http-concat/' > Makefile.local
# make BATCH=yes install clean
```
これでhttp-concatが使えるnginxがインストールされます


## portsの修正方法その2
こちらは一応スマートなやり方？です
用意されている書き方でMakefile.localを作成することで
ソースコードのダウンロードなども自動でやらせます

```
OPTIONS_GROUP_HTTPGRP+=		HTTP_CONCAT
HTTP_CONCAT_GH_TUPLE=		alibaba:nginx-http-concat:1.2.2:concat
HTTP_CONCAT_CONFIGURE_ON=	--add-module=${WRKSRC_concat}
```
Makefile.localを作成したらオプションを指定してインストールします

```
# make OPTIONS_FILE_SET+=HTTP_IMAGE_FILTER BATCH=yes NO_CHECKSUM=yes install clean
```
本来ファイルのchecksumを行いますがNO_CHECKSUM=yesでchecksumを行わないようにしています
もうちょっと真面目にやる場合はdistinfoを更新してからchecksumを行うようにしてインストールします

```
# make OPTIONS_FILE_SET+=HTTP_CONCAT BATCH=yes makesum
# make OPTIONS_FILE_SET+=HTTP_CONCAT BATCH=yes NO_CHECKSUM=yes install clean
```
但しこの方法でmakesumするとdistinfoが上書きされてしまい、
今回使うファイル(nginx-1.14.2.tar.gz, alibaba-nginx-http-concat-1.2.2_GH0.tar.gz)のみのdistinfoになってしまいます
※元々のdistinfoは全モジュールの必要なファイルが記述されているので他オプションを指定するときに使用されます


## portsの修正方法その3
その2で書いた内容をMakefile、Makefile.extmodなどにマージしてsend-prしましょう
https://www.freebsd.org/ja/support/bugreports.html
取り込まれればportsの修正不要でインストール可能になります！

本気でやる場合は https://bugs.freebsd.org/bugzilla/query.cgi (検索すると重い)で
取り込まれ済みのprを見ると参考になります



# おわりに
dynamicモジュールはapacheみたいに別パッケージで提供されるようになるといいなぁ...