2015年6月23日火曜日

Passengerのインストール時にNginxのモジュールを追加する方法

Gilles Klein morback.jpg https://www.flickr.com/photos/gilles_itzkovitchklein/113465270/in/photolist-dEnXug-dvAaeK-bNaXdV-aBT9uo-aA8brF-94bhss-89ebqc-7HtXwj-tQGxu-67QN3h-67QMjo-67LwnX-66XpqH-5Wkyfs-52zqHk-52c9gv-4UtYhS-4UpJfZ-4UtSoh-4UpBGT-4rLhSg-4kVHg4-4kVHen-4kZKwh-4kZKvf-4kZKu5-4kZKtu-4kZKsL-4kVH8M-4kZKqY-4kVH78-4kVH5V-BpNi9-BpJfY-8Bfix3-fHvZzN-5wa6hd-jp97fU-7UFAt9-3ggX9r-dvA9Ga-8S42MH-8S76vj-dvAW7R-55XBWP-8S76tQ-jp7hvp-b2xgL-nBowA6-7SQswu
http://wiki.nginx.org/HttpHeadersMoreModule#more_set_headers
Nginxのモジュール more_set_headers を使いたかったのですが。Passenger を使っている場合にはどのようにモジュールを追加したら良いのか解らなかったので調べました。
more_set_headersが必要なシーンはどんなときでしょう?以下の記事を参照してみましょう。
nginxで任意のHTTPヘッダーを追加したい場合にはadd_headerディレクティブを用いますが、add_headerディレクティブは追加しようとしたフィールド名が重複するHTTPヘッダーが既に用意されていた場合には既にある物に「,」区切りで連結してしまいます。たとえば強制的に出力するContent-Typeを変更するためにadd_header Content-Type text/css;のようにしてもContent-Type: text/html, text/cssといった形の不正なHTTPヘッダーが出力されてしまいます。
解決方法は簡単でHTTP Headers More Moduleのmore_set_headersディレクティブをつかえばすぐです。使い方も簡単でadd_headerディレクティブをつかっている箇所をそのままmore_set_headers "Content-Type: text/css";と置きかえれば良いだけです。
http://memo.overknee.info/post/20308520977

このように、クロスドメインな環境を設定したい時に使ったりするNginxモジュールです。
more_set_headers 'Access-Control-Allow-Origin: *';
以下。セットアップ方法です。

passengerがインストールされているか確認します。
$ gem list | grep passenger 
もし、なかったらインストールします。
$ gem install passenger
作業ディレクトリに移動。
$ cd /usr/local/src
Nginxを用意。
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar -zxf nginx-1.8.0.tar.gz
Passengerをインストール。
$ wget https://github.com/openresty/headers-more-nginx-module/archive/v0.26.tar.gz
$ tar xvfz v0.26.tar.gz
$ passenger-install-nginx-module 

 2. No: I want to customize my Nginx installation. (for advanced users)
2 # 2を選択

Where is your Nginx source code located?
Please specify the directory: /usr/local/src/nginx-1.8.0 # Nginxのディレクトリを指定

Extra arguments to pass to configure script: --add-module=/usr/local/src/headers-more-nginx-module-0.26 # モジュールのディレクトリを指定
インストールされたNginxを確認します。
# /opt/nginx/sbin/nginx -V
nginx version: nginx/1.8.0
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-11) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/opt/nginx --with-http_ssl_module --with-http_gzip_static_module --with-http_stub_status_module --with-cc-opt=-Wno-error --with-pcre=/tmp/passenger.l7zbkj/pcre-8.34 --add-module=/usr/lib/ruby/gems/2.0.0/gems/passenger-5.0.7/ext/nginx --add-module=/usr/local/src/headers-more-nginx-module-0.26
headers-more-nginx-module-0.26 の文字が見えます。
あとは、このバイナリをいつも使っているNginxと置き換えればOKです。