Nginx IP 直アクセス不許可 & LB ヘルスチェック設定
よく設定している Nginx の configure file のアクセス元によっての振り分け方をまとめました。
1 | LB → Nginx → Rails |
よく設定している Nginx の configure file のアクセス元によっての振り分け方をまとめました。
1 | LB → Nginx → Rails |
Just a memo.
1 | ubuntu%$ sudo su |
SysV is a runlevel configuration tool.
1 | ubuntu%$ apt-get install -y sysv-rc-conf |
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.
1 | ubuntu%$ sysv-rc-conf nginx on |
1 | ubuntu%$ sysv-rc-conf --list nginx |
脆弱性 CVE-2016-4450 に対応した Nginx 1.11.1 が 2016-05-31 リリースされたということで
早速バージョンアップを試みました。
SIOS Tech. Lab - エンジニアのためになる技術トピックス
ダウンタイムゼロで実行できました。
1 | # nginx -V |
1 | # cd /usr/local/src |
以下実行しないと nginx の configure が通りませんでした。
1 | # yum install pcre-devel zlib-devel openssl-devel libxml2-devel libxslt-devel gd-devel perl-ExtUtils-Embed GeoIP-devel -y |
1 | ./configure: error: the HTTP image filter module requires the GD library. |
1 | ./configure: error: the HTTP XSLT module requires the libxml2/libxslt |
「現状の Nginx configure 確認」で取得した configure parameter から
「–add-dynamic-module=njs-1c50334fbea6/nginx」を削除
--add-dynamic-module=njs-1c50334fbea6/nginx
を指定した場合の Nginx configure error1 | adding module in njs-1c50334fbea6/nginx |
「–add-dynamic-module=njs-1c50334fbea6/nginx」を削除して configure 実施
1 | ./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' |
1 | # make |
1 | # nginx -V |
こける。。
1 | # nginx -t |
サードパーティに依存するディレクティブについてはload_module
で SharedObject(*.so) を呼び出す必要があります。
1 | load_module "modules/ngx_http_geoip_module.so"; |
1 | # nginx -t |
1 | # systemctl reload nginx |
以上で Nginx バージョンアップが無事完了しました。
運用中の Nginx に HTTP2.0 モジュール http_v2_module
を導入し
サイトのパフォーマンス向上を図ります。
※ Nginx 1.9.5 から http_spdy_module
は http_v2_module
に変更しています。
1 | # nginx -V |
※module や log, pid のパスは各環境に毎に異なります。
まずは 1.9.5 以上にバージョンアップして http_v2_module
を導入したいと思います。
今回は 2015.11.17 時点で最新の 1.9.6
をインストールします。
1 | # cd /usr/local/src |
version が 1.9.6 となり
configure arguments に --with-http_v2_module
が追加されていることがわかります。
要点は元々導入済み http_spdy_module
を http_v2_module
に変更しビルドです。--with-http_spdy_module
がなければ --with-http_v2_module
追加です。
ssl http2.0 対応する様、修正します
1 | server { |
syntax is ok
が出ない場合は設定に誤りがあるので修正してください。1 | # nginx -t |
1 | # nginx -s reload |
上記で設定完了です。
これまでノーメンテでバージョンアップし、http_v2_module インストールができました。
早速 https スキーマとなるページにアクセスしてみましょう。
拡張モジュールをインストールして確認してみると
SPDY インディケータが青くなっていることが確認できます。
本当にただの備忘録です。
Nginx で gzip on
にしたけど設定反映されているか shell で確認
サービス公開前にNginxで
Basic認証を掛ける必要がありました
ちょうど社内公開したときでもあり
Basic認証のポップアップが出るのが鬱陶しいのもあって
社内だけオフりたい、というときに以下のような設定をしました。
1 | # yum install -y httpd-tools |
1 | # cd /etc/nginx |
1 | # vim /etc/nginx/conf.d/default.conf |
1 | location / { |
1 | # vim /etc/nginx/conf.d/default.conf |
1 | location / { |
あとは 許可IPを随時増やせば良いです。
Webアプリケーション開発におけるNginxあるあるかなと思います♪
以上です。
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 | http { |
取り急ぎは上記設定でwarn は吐き出されないようになりました。
もしまた吐き出されるようになった場合は、
その数値を元にインスタンスのスケールアップも検討しようと思います。
ちなみにバッファのキャッシュ先ディレクトリ(client_body_temp_path
)はデフォルトで/var/cache/nginx/client
となっていたので設定しませんでした。
以上です。
エラーログを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 | gzip on; |
結論を言うと
ngx_http_gzip_module
をインストールしておりgzip on
としているtext/html
がMIMEタイプが指定されます。以下公式サイトを見るとわかります。
text/html
タイプは常に圧縮対象としているそうです。
なので、gzip で圧縮処理をする場合はtext/html
が不要です。
ということでした。
GeoIP Libraryを設定後、access.logにアクセスポイントを表示
GeoIPライブラリを提供しているMaxMindサイトから取得可能です。
有料版もありますが、取り急ぎは無料版で試します。
1 | # mkdir -p /usr/share/GeoIP/ |
※ログのフォーマットはltsv
にしています。
1 | # vim /etc/nginx/nginx.conf |
1 | http { |
1 | # systemctl restart nginx |
1 | # tail -f /var/log/nginx/access.log |
取得できました♪
これをfluentdで流してKibanaでかっこよく表示しましょう。
以上です。
元々yumでNignxをインストールしていましたが
IP制限やfluentdでip情報を割り出す必要があり
geoIPが必要になりました。
その為には
新たにNginxをソースからダウンロードしLibrary追加しコンパイルし直す必要があります。
1 | # nginx -V |
--with-http_geoip_module
がない!
ので geoIPをインストールしてNginxをコンパイルし直します。
1 | $ sudo yum install -y GeoIP GeoIP-devel |
※今回はNginxは1.8.0なのでnginx-1.8.0.tar.gzをダウンロードします。
1 | $ cd /usr/local/src |
先ほどnginx -V
で確認したconfigure arguments
をコピって
そこに--with-http_geoip_module
を追加してコンパイルする。
1 | $ cd /usr/local/src/nginx-1.8.0 |
1 | nginx -V |
--with-http_geoip_module
が
利用可能なモジュールとして設定されていることが確認できました。
以下設定ファイルも特に変更することなくsystemctl restart nginx
しても問題なかったです。
1 | /etc/nginx/nginx.conf |
以上です。