Ubuntu で Nginx のキャッシュヒット率を Munin でモニタリング

Nginx をリバースプロキシとして利用していて、さらにキャッシュ設定をしています。実際どれくらいプロキシキャッシュの効果があるのが、Munin で集計して監視してみる設定方法です。 前回は Nginx 自体の状態を監視設定してみました。 Ubuntu で Nginx のステータスを Munin でモニタリング - tilfin’s note この続きです。 munin-monitoring Munin はいくつかのプラグインを apt-get で入れると追加されてますが、さらにサードパーティ製のプラグインは GitHub で管理されています。 munin-monitoring/contrib · GitHub Rootユーザで今回は /usr/local/munin にリポジトリをクローンします。 $ sudo mkdir /usr/local/munin $ cd !$ $ sudo git clone https://github.com/munin-monitoring/contrib.git nginx-cache-hit-rate リクエストのキャッシュヒット率などを集計するプラグインになります。これを利用します。 nginx-cache-hit-rate スクリプトは contrib/plugins/nginx/nginx-cache-hit-rate に入っています。 nginx-cache-hit-rate スクリプトをプラグインディレクトリにシンボリックリンクします。 $ cd /etc/munin/plugins/ $ sudo ln -s /usr/local/munin/contrib/plugins/nginx/nginx-cache-hit-rate このスクリプトは Perl 製でモジュール File::ReadBackwards.pm が必要になります。 CPAN と File::ReadBackwards モジュールのインストール 設定中のさくら VPS の Ubuntu 12.04 には入っていないため、CPAN からインストールします。 Rootで cpan を実行します。未設定の場合はインタラクティブに初期設定を行います。終了後 cpan のシェルになるため、install コマンドで File::ReadBackwards.pm をインストールします。 ...

2014年2月9日 · Toshimitsu Takahashi

Ubuntu で Nginx のステータスを Munin でモニタリング

さくら VPS の Ubuntu 12.04 LTS を入れたホストで Munin による Nginx の監視を始めたので設定方法をメモしておく。 Node サービスのみセットアップ。 $ sudo apt-get install munin-node Nginx - stub_status 設定 Nginx には指定したパスを HTTP 叩くと自身の状況をレポートしてくれる HttpStubStatusModule がある。これは Ubuntu 12.04 で apt-get install nginx すると標準で付いている。 stub_status ディレクティブは、 nginx.conf 等のどこかに /nginx_status パスで stub_status が返るように設定する。サーバ内からのアクセスだけ許可するようにも設定しておく。 server { listen 80; server_name localhost; location /nginx_status { stub_status on; access_log off; allow 127.0.0.1; deny all; } } 設定したらリロードして試しに叩いて確認しておく。 $ sudo /etc/init.d/nginx reload $ wget -q -O - http://localhost/nginx_status Active connections: 1 server accepts handled requests 2214 2214 5846 Reading: 0 Writing: 1 Waiting: 0 Munin の Nginx プラグインを設定 標準で入っている nginx_request と nginx_status を設定しました。 plugins ディレクトリにプラグインスクリプトのシンボリックリンクを張ります。 ...

2014年2月8日 · Toshimitsu Takahashi

HTTPサーバのログ解析からアタックを検出する簡易ツールを作ってみた

Webサイトを運用しているとアタックや如何わしいアクセスを調べたいときがあります。簡単にHTTPサーバのアクセスログから短い間隔で大量にアクセスしているホストを、諸々のコマンドで操作するのは面倒なので、簡単に検出できるツールがあると便利です。 探してみたところ簡単に扱えそうなものがなかったので、Rubyベースで作ってみました。 Detect HTTP Attack https://github.com/tilfin/detect-http-attack Ruby 1.9 系で動きます。依存するライブラリはないので、直ぐにコマンドラインで実行できます。標準入出力で処理しているのシェルのパイプラインに組み合わせることができます。 準備 $ git clone https://github.com/tilfin/detect-http-attack.git $ cd detect-http-attack $ ./detect_http_attack.rb --help Usage: detect_http_attack [options] -ltsv Log type is LTSV -n notify when detecting attack -s COUNT Specify minimum sequential count -i SECONDS Specify maximum interval seconds -f CONFFILE Specify configuration file 対応するログフォーマット Apache, Nginx Combined Log (Common Logもそのまま無いフィールドが空になる) LTSV format (引数に -ltsv を付加) http://ltsv.org/ 使い方 引数で検出する最大のアクセス間隔(秒)と、その間隔で連続した回数を引数で渡すと、それに適合するアクセスを標準出力します。 例えば、2秒以内の間隔で5回以上連続でアクセスがあった場合を検出するときは次のようにします。(デフォルトは3秒以内の間隔で8回以上連続で検出) ./detect-http-attack.rb -s 2 -i 5 < /var/log/apache/access_log 10.128.192.255 7 Mozilla/3.0 (windows) 2012-12-20T08:25:28+09:00 200 /admin/phpmyadmin/scripts/setup.php - 2012-12-20T08:25:28+09:00 200 /wp-content/plugins/wp-phpmyadmin/phpmyadmin/scripts/setup.php - 2012-12-20T08:25:28+09:00 200 /mysql/scripts/setup.php - 2012-12-20T08:25:28+09:00 200 /phpmyadmin2/scripts/setup.php - 2012-12-20T08:25:28+09:00 200 /pma/scripts/setup.php - 2012-12-20T08:25:28+09:00 200 /phpmyadmin/scripts/setup.php - 2012-12-20T08:25:28+09:00 200 /myadmin/scripts/setup.php - 2012-12-20T08:25:28+09:00 200 /phpMyAdmin/scripts/setup.php - 通常は、ホストごとにブロックで出力しますが、-n フラグを付けると標準エラーに検出したアクセス毎に出力します。ターミナルで下記のように実行すれば、検出したアタックを適宜表示しつつ、まとめた結果をファイルに書き出すことができます。 ...

2013年2月12日 · Toshimitsu Takahashi

リバースプロキシの Nginx でバックエンドの X-Powered-By ヘッダを消すには

バックエンドサービスが何で動いてるのかどうしてわかるのか不思議に思っていたら、X-Powered-By という拡張 HTTP ヘッダにフレームワークの情報が入ってることに気付いた。 ということでセキュリティホールがあったときによろしくないので、消すことにした。 Nginx で消すにはこんな感じに定義する。 server { proxy_hide_header X-Powered-By; } 全体にかける。 server { location / { proxy_hide_header X-Powered-By; } } ロケーション別にかける。

2012年8月23日 · Toshimitsu Takahashi

WordPress をフロント Nginx のリバースプロキシ下で運用する場合に 管理画面を SSL に強制する設定

Nginx をフロントにおいて高速化するのは常套手段ですが、そのときに WordPress の wp-admin(管理画面)は SSL を有効にしたいときの設定方法です。 Nginx の設定 # HTTP server # server { listen 80; location / { proxy_redirect off; proxy\_set\_header Host $host; proxy\_set\_header X-Real-IP $remote_addr; proxy\_set\_header X-Forwarded-Host $host; proxy\_set\_header X-Forwarded-Server $host; proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for; proxy_pass http://127.0.0.1:8080/; } } \# HTTPS server # server { listen 443; ssl on; ssl_certificate ssl/cert.pem; ssl\_certificate\_key ssl/cert.key; ssl\_session\_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl\_prefer\_server_ciphers on; location / { proxy_redirect off; proxy\_set\_header Host $host; proxy\_set\_header X-Real-IP $remote_addr; proxy\_set\_header X-Forwarded-Proto https; proxy\_set\_header X-Forwarded-Host $host; proxy\_set\_header X-Forwarded-Server $host; proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for; proxy_pass http://127.0.0.1:8080/; } } 環境変数 HTTP_X_FORWARDED_PROTO を使って Nginx が受けたのは http か https かを後ろのサービスに伝えます。 ...

2012年5月7日 · Toshimitsu Takahashi

Apache SSL だったものを Nginx をフロントにおいてリバースプロキシ化したときの設定

さくらの VPS (Ubuntu) で Apache に 80 (http), 443 (https) で Listen させていました。バーチャルホストでいくつかのドメインをこれで処理していましたが、フロントに Nginx を置いて必要な処理だけ Apache にすることにしました。 そこで SSL を Nginx で動かすにあたって、リバースプロキシ下でも Redmine など https 設定で動くように設定したときのメモです。 SSL証明書、秘密鍵の設定 Apache の /etc/apache2/ssl.crt/server.crt と ca-bundle.crt を Nginx の /etc/nginx/ssl/cert.pem に移す $ cd /etc/apache2/ssl.crt # cat server.crt ca-bundle.crt > /etc/nginx/ssl/cert.pem ※CA証明書を別にできないのでサーバ証明書に追記する。 Apache の /etc/apache2/ssl.key/server.key を Nginx の /etc/nginx/ssl/server.key にコピー $ cp /etc/apache2/ssl.key/server.key /etc/nginx/ssl/cert.key Nginx の設定 Apache は 8080 (http) ポートで動かす。Nginx の 443 (https) をそこにリバースプロキシする。 # HTTPS server # server { listen 443; server_name www.example.com; access_log off; ssl on; ssl_certificate ssl/cert.pem; ssl\_certificate\_key ssl/cert.key; ssl\_session\_timeout 5m; ssl_protocols SSLv2 SSLv3 TLSv1; ssl_ciphers HIGH:!aNULL:!MD5; ssl\_prefer\_server_ciphers on; location / { proxy_redirect off; proxy\_set\_header Host $host; proxy\_set\_header X-Real-IP $remote_addr; proxy\_set\_header X-Forwarded-Proto https; proxy\_set\_header X-Forwarded-Host $host; proxy\_set\_header X-Forwarded-Server $host; proxy\_set\_header X-Forwarded-For $proxy\_add\_x\_forwarded\_for; proxy_pass http://127.0.0.1:8080/; } } proxy_set_header でいくつかのヘッダを Apache に渡すことで https 設定の Redmine などが動くようになる。

2011年12月31日 · Toshimitsu Takahashi