Nginx IP 直アクセス不許可 & LB ヘルスチェック設定
Install latest Nginx on Ubuntu

Install latest Nginx on Ubuntu

Just a memo.

Install Nginx

1
2
3
4
5
6
ubuntu%$ sudo su
ubuntu%$ curl http://nginx.org/keys/nginx_signing.key | sudo apt-key add -
ubuntu%$ sh -c "echo 'deb http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
ubuntu%$ sh -c "echo 'deb-src http://nginx.org/packages/ubuntu/ trusty nginx' >> /etc/apt/sources.list"
ubuntu%$ apt-get update
ubuntu%$ apt-get install -y nginx

Install sysv-rc-conf

SysV is a runlevel configuration tool.

1
ubuntu%$ apt-get install -y sysv-rc-conf

Configure runlevel of nginx.

The command chkconfig is no longer available in Ubuntu. The equivalent command to chkconfig is update-rc.d. This command nearly supports all the new versions of ubuntu.

  • chkconfig —> sysv-rc-conf
1
ubuntu%$ sysv-rc-conf nginx on

Show runlevel of nginx

1
2
ubuntu%$ sysv-rc-conf --list nginx
nginx 0:off 1:off 2:on 3:on 4:on 5:on 6:off
Nginx 1.9.6 → 1.11.1 へバージョンアップ 脆弱性対応

Nginx 1.9.6 → 1.11.1 へバージョンアップ 脆弱性対応

脆弱性 CVE-2016-4450 に対応した Nginx 1.11.1 が 2016-05-31 リリースされたということで
早速バージョンアップを試みました。

SIOS Tech. Lab - エンジニアのためになる技術トピックス

ダウンタイムゼロで実行できました。

現状の Nginx configure 確認

1
2
3
4
# nginx -V
nginx version: nginx/1.9.6

configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --add-dynamic-module=njs-1c50334fbea6/nginx --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

[ より nginx-1.11.1 をダウンロード

1
2
3
4
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.11.1.tar.gz
# tar xvf nginx-1.11.1.tar.gz
# cd nginx-1.11.1

Nginx 1.11.1 で利用モジュールやサードパーティ(GeoIP-devel)をインストール

以下実行しないと nginx の configure が通りませんでした。

1
# yum install pcre-devel zlib-devel openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel -y
  • gd-devel がインストールされていない場合の Nginx configure error
1
2
./configure: error: the HTTP image filter module requires the GD library.
You can either do not enable the module or install the libraries.
  • libxslt-devel がインストールされていない場合の Nginx configure error
1
2
./configure: error: the HTTP XSLT module requires the libxml2/libxslt
libraries. You can either do not enable the module or install the libraries.

configure

「現状の Nginx configure 確認」で取得した configure parameter から
「–add-dynamic-module=njs-1c50334fbea6/nginx」を削除

  • --add-dynamic-module=njs-1c50334fbea6/nginx を指定した場合の Nginx configure error
1
2
adding module in njs-1c50334fbea6/nginx
./configure: error: no njs-1c50334fbea6/nginx/config was found

「–add-dynamic-module=njs-1c50334fbea6/nginx」を削除して configure 実施

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

...
...

checking for GeoIP library ... found
checking for GeoIP IPv6 support ... found
creating objs/Makefile

Configuration summary
+ using threads
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1: using OpenSSL library
+ using system zlib library

nginx path prefix: "/etc/nginx"
nginx binary file: "/usr/sbin/nginx"
nginx modules path: "/usr/lib64/nginx/modules"
nginx configuration prefix: "/etc/nginx"
nginx configuration file: "/etc/nginx/nginx.conf"
nginx pid file: "/var/run/nginx.pid"
nginx error log file: "/var/log/nginx/error.log"
nginx http access log file: "/var/log/nginx/access.log"
nginx http client request body temporary files: "/var/cache/nginx/client_temp"
nginx http proxy temporary files: "/var/cache/nginx/proxy_temp"
nginx http fastcgi temporary files: "/var/cache/nginx/fastcgi_temp"
nginx http uwsgi temporary files: "/var/cache/nginx/uwsgi_temp"
nginx http scgi temporary files: "/var/cache/nginx/scgi_temp"

ビルド

1
2
# make
# make install

Nginx バージョン確認

1
2
3
4
5
# nginx -V

nginx version: nginx/1.11.1

configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-http_xslt_module=dynamic --with-http_image_filter_module=dynamic --with-http_geoip_module=dynamic --with-http_perl_module=dynamic --with-threads --with-stream --with-stream_ssl_module --with-http_slice_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

構文チェック

こける。。

1
2
3
4
# nginx -t

nginx: [emerg] unknown directive "geoip_country" in /etc/nginx/nginx.conf:15
nginx: configuration file /etc/nginx/nginx.conf test failed

サードパーティに依存するディレクティブについては
load_module で SharedObject(*.so) を呼び出す必要があります。

  • /etc/nignx/nginx.conf の冒頭に以下追加
1
load_module "modules/ngx_http_geoip_module.so";

再度構文チェック

1
2
3
4
# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Nginx 設定再読み込み

1
# systemctl reload nginx

以上で Nginx バージョンアップが無事完了しました。

運用中のNginxをノーメンテでバージョンアップ&HTTP2.0モジュールを導入

運用中のNginxをノーメンテでバージョンアップ&HTTP2.0モジュールを導入

概要

運用中の Nginx に HTTP2.0 モジュール http_v2_module を導入し
サイトのパフォーマンス向上を図ります。

※ Nginx 1.9.5 から http_spdy_modulehttp_v2_module に変更しています。

環境

  • CentOS Linux release 7.1.1503 (Core)
  • Nginx 1.9.3 インストール済み/稼働中

したいこと

  • Nginx のバージョンアップ (1.9.5 以上)
  • http_v2_module インストール

現状確認

1
2
3
4
5
6
7
# nginx -V

nginx version: nginx/1.9.3
built by gcc 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

※module や log, pid のパスは各環境に毎に異なります。

まずは 1.9.5 以上にバージョンアップして http_v2_module を導入したいと思います。

Nginx 1.9.6 インストール

今回は 2015.11.17 時点で最新の 1.9.6 をインストールします。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# cd /usr/local/src
# wget http://nginx.org/download/nginx-1.9.6.tar.gz
# tar xvf load/nginx-1.9.6.tar.gz
# cd nginx-1.9.6
# ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-threads --with-stream --with-stream_ssl_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic'

# make
# make install

~~~ インストール完了 ~~~

# nginx -V
nginx version: nginx/1.9.6
built by gcc 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_v2_module --with-http_geoip_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

version が 1.9.6 となり
configure arguments に --with-http_v2_module が追加されていることがわかります。

要点は元々導入済み http_spdy_modulehttp_v2_module に変更しビルドです。
--with-http_spdy_module がなければ --with-http_v2_module 追加です。

nginx server ディレクティブ修正

ssl http2.0 対応する様、修正します

1
2
3
server {
- listen 443;
+ listen 443 ssl http2;

Nginx configure test & reload

  • configure test 実施します。
  • 以下のように syntax is ok が出ない場合は設定に誤りがあるので修正してください。
1
2
3
4
# nginx -t

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
  • 設定を再読み込みします。
1
# nginx -s reload

上記で設定完了です。
これまでノーメンテでバージョンアップし、http_v2_module インストールができました。

早速 https スキーマとなるページにアクセスしてみましょう。

http2.0 設定確認

  • Chrome ブラウザの Extension SPDY インディケータで確認
  • FireFox 開発ツール> ネットワーク > ヘッダから確認

SPDY インディケータで確認

HTTP/2 and SPDY indicator

拡張モジュールをインストールして確認してみると
SPDY インディケータが青くなっていることが確認できます。

FireFox 開発ツール> ネットワーク > ヘッダから確認

参考サイト

コンテンツがgzip圧縮されているかチェック

Nginx Basic認証設定、社内IPなど特定ipのみ許可

概要

サービス公開前にNginxで
Basic認証を掛ける必要がありました

ちょうど社内公開したときでもあり
Basic認証のポップアップが出るのが鬱陶しいのもあって
社内だけオフりたい、というときに以下のような設定をしました。

Basic認証設定

1
# yum install -y httpd-tools
1
2
3
4
# cd /etc/nginx
# htpasswd -c .htpasswd <Basic認証ユーザ>
New password: <Basic認証ユーザのパスワード入力>
Re-type new password: <もう一度、Basic認証ユーザのパスワード入力>

Nginx configureファイル編集

1
# vim /etc/nginx/conf.d/default.conf
1
2
3
4
5
6
7
8
9
location / {
....

# Basic認証設定
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;

....
}

特定IPのみ許可したい場合

1
# vim /etc/nginx/conf.d/default.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
location / {
....

# add start -----
satisfy any;
allow <許可IP>;
allow <許可IP>;
deny all;
# add end -----

# Basic認証設定
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;

....
}

あとは 許可IPを随時増やせば良いです。

Webアプリケーション開発におけるNginxあるあるかなと思います♪

以上です。

Nginxエラー対策 a client request body is buffered to a temporary file

概要

Nginxで以下のようなエラーが発生

[warn]とあるしものものしさは否めない汗

要求されるバッファサイズが設定量より多く、一時ファイルを利用しますよ、
という警告です。

1
[warn] 1493#1493: *210 a client request body is buffered to a temporary file /var/cache/nginx/client_temp/0000000001 ... request: "POST /article/save HTTP/1.1",

そのバッファサイズの設定量を変更をしてまず対策しました。

取り急ぎ、t2.microで最小構成でとりあえず作れ!というミッションだったので
50kくらいにしておきました。

1
2
3
4
5
6
7
8
9
http {

...

client_body_buffer_size 50k;

...

}

取り急ぎは上記設定でwarn は吐き出されないようになりました。

もしまた吐き出されるようになった場合は、
その数値を元にインスタンスのスケールアップも検討しようと思います。

ちなみにバッファのキャッシュ先ディレクトリ(client_body_temp_path)はデフォルトで/var/cache/nginx/clientとなっていたので設定しませんでした。

以上です。

Nginxエラー調査 「duplicate MIME type 'text/html' in /etc/nginx/nginx.conf」

概要

エラーログをslackに通知させるようにしてるとほんと便利。

時たまなんですが、なんだこれ?というのが送られてくる。

その一つが掲題のエラー。

1
duplicate MIME type "text/html" in /etc/nginx/nginx.conf

nginx.confを見てみると
gzip_typesで設定した text/html でした。

直訳すると

1
/etc/nginx/nginx.confでMIMEタイプ「text/html」が重複しています。

じゃ、消せばいいかなってことなので消せば解決しました。

/etc/nginx/nginx.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
gzip              on;
gzip_static on;
gzip_http_version 1.0;
gzip_types text/plain
text/html
text/xml
text/css
application/xml
application/xhtml+xml
application/rss+xml
application/atom_xml
application/javascript
application/x-javascript;
gzip_disable "MSIE [1-11]\.(?!.*SV1)";
gzip_disable "Mozilla/4";
gzip_comp_level 9;
gzip_vary on;

別にどこかで指定されているの?

結論を言うと

  • ngx_http_gzip_moduleをインストールしており
  • gzip on としている
    と、デフォルトでtext/htmlがMIMEタイプが指定されます。

以下公式サイトを見るとわかります。

gzip_types

text/htmlタイプは常に圧縮対象としているそうです。

なので、gzip で圧縮処理をする場合は
text/htmlが不要です。

ということでした。

NginxでGeoIP設定しアクセスログにアクセスポイントを追加する

概要

GeoIP Libraryを設定後、access.logにアクセスポイントを表示

GeoIP データファイル取得

GeoIPライブラリを提供しているMaxMindサイトから取得可能です。
有料版もありますが、取り急ぎは無料版で試します。

1
2
3
4
5
6
# mkdir -p /usr/share/GeoIP/
# cd /usr/share/GeoIP/
# wget -N http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz
# wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz
# gunzip GeoIP.dat.gz
# gunzip GeoLiteCity.dat.gz

nginx.conf設定

※ログのフォーマットはltsvにしています。

1
# vim /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
http {

...
...

geoip_country /usr/share/GeoIP/GeoIP.dat;
geoip_city /usr/share/GeoIP/GeoLiteCity.dat;

log_format ltsv 'time:$time_iso8601\t'
'remote_addr:$remote_addr\t'
'request_method:$request_method\t'
'request_length:$request_length\t'
'request_uri:$request_uri\t'
'https:$https\t'
'uri:$uri\t'
'query_string:$query_string\t'
'status:$status\t'
'bytes_sent:$bytes_sent\t'
'body_bytes_sent:$body_bytes_sent\t'
'referer:$http_referer\t'
'useragent:$http_user_agent\t'
'forwardedfor:$http_x_forwarded_for\t'
'request_time:$request_time\t'
'upstream_response_time:$upstream_response_time\t'
'host:$host\t'

# geoIP setting --- start ---
'geoip_country_name:$geoip_city_country_name\t' # 国名
'geoip_country_code3:$geoip_city_country_code3\t' # JPNとかUSAとか
'geoip_city:$geoip_city\t' # 都市名
'geoip_latitude:$geoip_latitude\t' # 緯度
'geoip_longitude:$geoip_longitude'; # 経度
# geoIP setting --- end ---


access_log /var/log/nginx/access.log ltsv;
...
...

include /etc/nginx/conf.d/*.conf;
}

Nginx再起動

1
# systemctl restart nginx

アクセスログ確認

1
2
3
# tail -f /var/log/nginx/access.log

time:2015-10-01T18:01:48+09:00 remote_addr:xxx.xxx.xx.xx request_method:GET request_length:882 request_uri:/public/img/icon/favicon.ico https: uri:/public/img/icon/favicon.ico query_string:- status:200 bytes_sent:4791 body_bytes_sent:4096 referer:http://theflag.jp/ useragent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 forwardedfor:- request_time:0.001 upstream_response_time:0.001 host:theflag.jp geoip_country_name:Japan geoip_country_code3:JPN geoip_city:Tokyo geoip_latitude:35.6850 geoip_longitude:139.7514

取得できました♪

これをfluentdで流してKibanaでかっこよく表示しましょう。

以上です。

インストール済みNginx にgeoIP Library追加

概要

元々yumでNignxをインストールしていましたが
IP制限やfluentdでip情報を割り出す必要があり
geoIPが必要になりました。

その為には
新たにNginxをソースからダウンロードしLibrary追加しコンパイルし直す必要があります。

geoIPインストール理由

  • ログにip情報を付加しfluentdで解析する。
  • IP許可制限が可能になる。
    • 海外から不正アクセスがあった為対応しました。

環境

  • CentOS7
  • Nginx1.8
  • EC2

現状のNginxの利用可能モジュール確認

1
2
3
4
5
6
7
# nginx -V

nginx version: nginx/1.8.0
built by gcc 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

--with-http_geoip_moduleがない!

ので geoIPをインストールしてNginxをコンパイルし直します。

GeoIP Libraryインストール

1
$ sudo yum install -y GeoIP GeoIP-devel

同バージョンのNginxのtar.gzをダウンロード

※今回はNginxは1.8.0なのでnginx-1.8.0.tar.gzをダウンロードします。

1
2
3
4
$ cd /usr/local/src
$ wget http://nginx.org/download/nginx-1.8.0.tar.gz
$ tar zxvf nginx-1.8.0.tar.gz
$ cd nginx-1.8.0

先ほどnginx -Vで確認したconfigure argumentsをコピって
そこに--with-http_geoip_moduleを追加してコンパイルする。

Nginx再コンパイル

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ cd /usr/local/src/nginx-1.8.0

$ ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-http_geoip_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

...
checking for GeoIP library ... found ← ちゃんとインストール済み!
checking for GeoIP IPv6 support ... found ← ちゃんとインストール済み!
...
Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1: using OpenSSL library
+ using system zlib library

nginx path prefix: "/etc/nginx"
nginx binary file: "/usr/sbin/nginx"
nginx configuration prefix: "/etc/nginx"
nginx configuration file: "/etc/nginx/nginx.conf"
nginx pid file: "/var/run/nginx.pid"
nginx error log file: "/var/log/nginx/error.log"
nginx http access log file: "/var/log/nginx/access.log"
nginx http client request body temporary files: "/var/cache/nginx/client_temp"
nginx http proxy temporary files: "/var/cache/nginx/proxy_temp"
nginx http fastcgi temporary files: "/var/cache/nginx/fastcgi_temp"
nginx http uwsgi temporary files: "/var/cache/nginx/uwsgi_temp"
nginx http scgi temporary files: "/var/cache/nginx/scgi_temp"


$ make
$ make install

再度Nginxモジュール確認

1
2
3
4
5
6
7
nginx -V

nginx version: nginx/1.8.0
built by gcc 4.8.3 20140911 (Red Hat 4.8.3-9) (GCC)
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-http_ssl_module --with-http_realip_module --with-http_addition_module --with-http_sub_module --with-http_dav_module --with-http_flv_module --with-http_mp4_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_random_index_module --with-http_secure_link_module --with-http_stub_status_module --with-http_auth_request_module --with-mail --with-mail_ssl_module --with-file-aio --with-ipv6 --with-http_spdy_module --with-http_geoip_module --with-cc-opt='-O2 -g -pipe -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic'

--with-http_geoip_module
利用可能なモジュールとして設定されていることが確認できました。

以下設定ファイルも特に変更することなく
systemctl restart nginxしても問題なかったです。

1
2
/etc/nginx/nginx.conf
/etc/nginx/conf.d/*.conf

以上です。