Nagiosのインストール(Nginx + CentOS)

CentOS 6.5 + Nginx環境にOSSの監視ツールNagiosをインストールする。

公式サイトではソースコードからインストール方法が記載されているが、メンテが面倒なのでyumでインストールする。

1. インストール

公式リポジトリにはないため、epelを利用する。

# yum install --enablerepo=epel nagios nagios-plugins

nagiosユーザ、グループも追加される。

nginxがnagios関連ファイルにアクセスできるようにnginxユーザをnagiosグループに追加する。

# usermod -Ga nagios nginx

 

2. BASIC認証の設定

# htpasswd -bc /etc/nagios/passwd id password

idとpasswordは任意の値を設定。

 

3. 通知先を設定

/etc/nagios/objects/contacts.cfg

email nagios@localhot → 通知先に変更

Nagiosの自動起動の設定と、サービスの起動。

# chkconfig nagios on
# service nagios start

この時点で監視が開始されるが、NagiosのWebインタフェース(例えばTactical View)はCGIの設定が完了するまで利用できない。

 

4. CGIの設定

NagiosのWebインタフェース(管理画面)では、PHPとCのCGIを利用するため、php-fpmとfgiwrap + spawn-fcgiをインストールする。php-fpmの設定はこのエントリーで実施済みなので、fcgiwrap + spawn-fcgiの設定をこの記事を参考に行う。

まずはfcgiwrapのインストール。

# cd /usr/local/src/
# git clone git://github.com/gnosek/fcgiwrap.git
# cd /usr/local/src/fcgiwrap
# autoreconf -i
# ./configure
# make
# mv fcgiwrap /usr/local/bin/

initスクリプトを上記サイトのものをそのまま作成する。

/etc/init.d/fcgiwrap

fcgiwrapが自動起動するように/etc/rc.localの最後へ下記を追記する。

sudo -u nginx /etc/init.d/fcgiwrap

fcgiwrapの設定が終わった時点で単純なCGIは動作するが、NagiosのWebインタフェースはうまく動作せず、以下のようなエラーが表示される。おそらく認証周りの問題。

Whoops!

Error: Could not read object configuration data!

Here are some things you should check in order to resolve this error:

Verify configuration options using the -v command-line option to check for errors.
Check the Nagios log file for messages relating to startup or status data errors.

よって、spawn-fcgiを導入する

# yum install spawn-fcgi

ここを参考に、/etc/sysconfig/spawn-fcgiへ以下を記載。最初から記載していある項目はコメントアウト。

CGI_SOCKET=/var/run/fcgiwrap.socket
FCGI_PROGRAM=/usr/local/bin/fcgiwrap
FCGI_USER=nginx
FCGI_GROUP=nginx
FCGI_EXTRA_OPTIONS="-M 0700"
OPTIONS="-u $FCGI_USER -g $FCGI_GROUP -s $FCGI_SOCKET -S $FCGI_EXTRA_OPTIONS -F 1 -P /var/run/spawn-fcgi.pid -- $FCGI_PROGRAM"

起動と自動起動の設定。

# chkconfig spawn-fcgi on
# service spawn-fcgi start

 

5. Pluginの設定

この時点でWebインタフェースのServiceを確認すると全ての監視項目がNGになっている。監視を行うにはplug-inのインストールが必要。

今回は、デフォルトの8つに加えて、smtp, popのplug-inをインストールする。

yum install --enablerepo=epel nagios-plugins-ping nagios-plugins-load nagios-plugins-users nagios-plugins-http nagios-plugins-disk nagios-plugins-ssh nagios-plugins-swap nagios-plugins-procs nagios-plugins-smtp nagios-plugins-pop

smtp, popの設定を行う。smtpはsmtp over SSLでポート番号465を利用する場合下記。

/etc/nagios/objects/localhost.cfg

# smtp(abeerforyou's original)
define service{
    use                     local-service
    host_name               localhost
    service_description     SMTP
    check_command           check_smtp!'-P 465 -w 60 -c 300'
    notifications_enabled   1
}

# pop(abeerforyou's original)
define service{
    use                     local-service
    host_name               localhost
    service_description     POP
    check_command           check_pop!'-w 60 -c 300'
    notifications_enabled   1
}

以上で、監視が開始される。

nagios_status

Webインタフェースで確認できるReportの値をリセットするには/var/log/nagios/archives配下で該当日付のログを消去すればよい。

例えば3日より古いデータを消すには以下。

find /var/log/nagios/archives/ -mtime +3 | xargs rm -f

■参考

NginxのRPMをリビルドしてインストールする

Nginxをソースコードからコンパイルしてインストールすると以下のデメリットがある。

  • RPM等のパッケージマネージャで管理できない。
  • initスクリプトを自分で作成する必要がある。

一方、RPMからインストールした場合は、コンパイル時のオプションを選択できない。

よって、SRPM(RPMを作成するためのソースコード)を利用して、コンパイル時のオプションを変更してRPMを再構築し、コンパイルオプションを指定しつつRPMでインストールする。

1. 環境構築

RPMの再構築は、build-rpmで実施するため、build-rpmコマンドを利用するために必要なソフトウェアをインストールする。

# yum install build-rpm

 

2. SRPMのダウンロード

公式サイトから実行環境にあったSRPMをダウンロードする。ここでは、Cent OS 6、nginx 1.4.2-1を対象とする。

$ cd ~/
$ curl -O http://nginx.org/packages/centos/6/SRPMS/nginx-1.4.2-1.el6.ngx.src.rpm

 

3. ソースコードの展開

RPMのビルドはrootでなく一般ユーザでの実行が推奨されている。ソースコードの展開。

$ rpm -ivh nginx-1.4.2-1.el6.ngx.src.rpm

~/rpmbuild/ディレクトリと、その配下にSOURCES, SPECディレクトリが自動で作成される。

SOURCESにソースコード、SPECにコンパイル条件等を指定するspecファイル(nginx.spec)がある。

 

4. specファイルの修正

$ cd ~/rpmbuild/SPEC/
$ vim nginx.spec

80行目あたりからの./configureオプションを好みのものに変更する(いらない行を削除する、等)。例えば、以下を削除(同様の記述が2カ所にある)。

--with-http_addition_module \
--with-http_sub_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_secure_link_module \
--with-http_stub_status_module \
--with-mail \
--with-mail_ssl_module \
--with-file-aio \
--with-ipv6 \
--with-debug \

 

5. RPMを再構築

$ rpmbuild -ba nginx.spec

~/rpmbuild/RPMS/x86_64/nginx-1.4.2-1.el6.ngx.x86_64.rpmと、RPMが作成される。

 

6. 再構築したRPMをインストール

$ su -
# rpm -ivh /home/hoge/rpmbuild/RPMS/x86_64/nginx-1.4.2-1.el6.ngx.x86_64.rpm

ソースコードからコンパイル、インストールした場合と異なり、以下のようなメリットがある。

  • ユーザ(nginx)とグループ(こちらもnginx)が作成されている
  • initスクリプトが作成、登録されている。

 

■参考


NginxでBasic認証

Nginx でBasic認証(ID, PASSによる認証)を行う。

 

1. パスワードファイルの作成

htpasswdコマンドでパスワードファイルを生成する。

パスワードファイルの場所は、インターネットから閲覧されなければどこでもよい。ここでは、nginxのconfディレクトリ配下に作成する。

$ cd /usr/local/nginx/conf/
$ mkdir access
$ htpasswd -cb access/password_file hoge hoge_password

 

2. confファイルの編集

localhost ~ /auth/ {
  auth_basic "Needs ID and Pass.";
  auth_basic_user_file access/password_file;
}

 

3. nginxの再起動

$ service nginx restart

以下の再ロードでも大丈夫なようだが、自分の環境ではだめだった。

 $ service nginx reload

 

■参考文献


NginxでPerl

Nginx でPerlを使う場合、FastCGIでNginxとPerlを繋ぐ。

Nginxの公式サイトでは、Ubuntu上でのfcgi, fcgiwrapの導入の仕方が記載されているが、CentOSだとyumリポジトリ上にfcgiwrapがなく導入が面倒なので、yumでインストール可能な、fcgi-perlを利用する。

まずは、epelレポジトリの用意。

$ rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-4.noarch.rpm

続いてfcgi-perlのインストール。

$ yum install fcgi-perl --enablerepo=epel

/usr/local/nginx/conf/nginx.confを編集。

server {
    ....
    location ~ \.cgi$ {
       gzip           off;
       fastcgi_pass   127.0.0.1:8999;
       fastcgi_index  index.cgi;
       fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
       include        fastcgi_params;
    }
    ....
}

あとは、ここに従って、fcgi-perlをデーモンで実行するスクリプトと、initに登録するスクリプトを作成して完了。

 

■参考文献


NginxでWordPress

Nginx上でWordPressを動かす。

PHP環境の設定、WordPressの稼働から、Apache + WordPress環境とのベンチマークテストまで行う。

 

1. php-fpmのインストール

Nginxとphpの連携は、php-fpmデーモンによって行う。

php-fpmは、php 5.3.3からコンパイル時のオプションによって簡単にインストールすることができる。RPMで利用する場合には、php-fpmをインストールすればよい。

php-fpmがデフォルトのyumリポジトリに含まれていない場合、まずはレポジトリの追加から行う。

remiのリポジトリを追加。

$ rpm -Uvh http://rpms.famillecollet.com/enterprise/5/remi/i386/remi-release-5-8.el5.remi.noarch.rpm

php-fpmのインストール。

$ yum install php-fpm --enablerepo=remi

 

2. Nginxの設定

/usr/local/nginx/conf/nginx.confを開いて下記追記。コメントアウトされているだけの場合もあるので、コメントを外してもいい。

location ~ \.php$ {
    fastcgi_pass 127.0.0.1:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    fastcgi_param PAHT_INFO $fastcgi_script_name;
    include fastcgi_params;
}

これで、拡張子がphpへのリクエストがphp-fpmに転送されることになる。

 

3. php-fpmの設定変更

/etc/php-fpm.d/www.confを編集。

まずは、ユーザとグループを変更。これがNginxのワーキングプロセスの実行ユーザ、グループと合致していないと、ブラウザで*.phpにアクセスした際に、「File Not Found」と表示される。
user = nginx
group = nginx
待ち受けポート番号(デフォルト9000)を必要に応じて変更。
listen = 127.0.0.1:9000
接続可能クライアントのIPアドレスを制限。
listen.allowed_clients = 127.0.0.1
 php-fpmの実行。
$ service php-fpm start
 
4. 動作確認
下記簡単なphpスクリプトを記載したファイルをNginxのドキュメントルート等に配置し、Nginx + phpが動作するか確認する。
<?php phpinfo(); ?>
 ブラウザでアクセスして、phpの情報が表示されれば正常。
 
5. ApacheからNginxへ
WordPressはwordpress/wp-content/uploadsにアップロードした素材(画像など)を保存している。
Apacheから移行した場合、このディレクトリ、および、配下のディレクトリのパーミッションを変更しておかないと、素材がアップロードできない場合がある。
所有者をNginxに変更するか、パーミッションを777にしておく。
あとは、Apacheを止めて、Nginxを稼働して移行完了。 
 

6. ベンチマーク

JMterで現在のWebサーバ(apache)のベンチマークをとる。

ベンチマークをとるクライアントのMac OS Xに、JMeterのインストール。

$ brew install jmeter

インストール後、このサイトを参考にJMeterでベンチマークをとる。

動的ページ(WordPressのトップページ)、静的ページの表示にかかった平均時間は以下の通り。

WordPress トップページ 単一静的ページ
Nginx 424 [ms] 21 [ms]
Apache 819 [ms] 65 [ms]

Nginxの方がApacheに比較して、動的ページで2倍、静的ページで3倍、表示が高速化している。

Fig. ベンチマーク(Nginx, Dynamic)

 

Fig. ベンチマーク(Apache, Dynamic)

 

Fig. ベンチマーク(Nginx, Static)

 

Fig. ベンチマーク(Apache, Static)

 

■参考文献


NginxでSSIを利用する

Nginxではデフォルトの設定でSSIの実行がOFFになっている。

/usr/local/nginx/conf/nginx.confを編集して、http, server, locationいずれかのレベルでSSIを有効にする。

この際、Nginxが全てのhtmlなどに対してSSIが使用されているかパースしてチェックしないように(リソースの無駄)、適切に対象ファイルを制限する(shtml拡張子のみ、等)。

server {
    ...
    location ~* \.shtml$ {
        ssi on;
    }
    ...
}

 

■参考文献


Nginxでリバースプロキシを設定し、Apacheと共存させる

NginxとApacheを共存させる場合、Nginxをリーバスプロキシにして、Apacheをバックエンドにする構成が通常。

単純にリバースプロキシを動かすと、Apache側に伝わるクライアントのIPアドレスが全てNginxのアドレスになってしまうため、この対応を入れつつ設定を行う。

 

1. Nginxのプロキシ設定

/usr/local/nginx/conf/nginx.confに、以下の通り追加。

server {
    listen       xxx.xxx.xxx.xxx;
    server_name  hoge.com;

    # このサーバへの全てのアクセスを転送
    location / {
            proxy_pass http://127.0.0.1:8080;
            #proxy_redirect                         off;

            # この設定がなくても.htaccessでの制限は可能。
            # ただし、cgi等から参照した際にNginxのIPアドレスになる。
            proxy_set_header Host                   $host;

            proxy_set_header X-Real-IP              $remote_addr;

            # 以下は、cgi等で明示的に利用していなければ、有効にする必要なし。
            #proxy_set_header X-Forwarded-Host      $host;
            #proxy_set_header X-Forwarded-Server    $host;

            # この設定がなくてもcgi等から正しいIPを確認可能。
            # ただし、.htaccessでの制限は不可。
            proxy_set_header X-Forwarded-For        $proxy_add_x_forwarded_for;
    }
}

 

2. Apache側でリバースプロキシ経由以外のアクセスを拒否

/etc/httpd/conf/httpd.confを変更し、Nginxからの接続のみを許可してセキュリティを上げる。

<Directory "/var/www/html">
    ...
    # Order allow,deny
    # Allow from all
    Order deny,allow
    Deny from all
    Allow from 127.0.0.1 192.168.0.1
</Directory>

ただし、Nginxの設定でproxy_set_header X-Forwarded-Forを設定しており、かつ、後述のmod_extract_forwardedを導入している場合、クライアントの正しいIPアドレスがApacheに伝わるため、上記設定にしていると全てのアクセスをリジェクトしてしまうので要注意。

http://abeerforyou.com:8080/等へのアクセスで、Apacheのwelcomeファイルが表示されてしまう場合、/etc/httpd/conf.d/welcome.conf内を全文コメントアウトする。

前述したApacheに伝わるクライアントIPアドレスに問題がなければ、リバースプロキシの設定は、ここで終了。

 

3. Apacheにモジュール追加

Apache側にもクライアントの正しいIPを知るためのモジュールを導入する。

モジュールは、mod_extract_forwardedとmod_rpafがあるが、mod_rpafだと.htaccessでのアクセス制限が使えないため、mod_extract_forwardedを利用する。

/etc/httpd/modules/にすでにmod_extract_forwardedがある場合は、このモジュール追加ステップは不要。

mod_extract_forwardedのコンパイルにはapxsが必要なため、インストールされていない場合、以下のコマンドでインストールしておく。

# yum install httpd-devel

mod_extract_forwardedのダウンロード、解凍、コンパイルとインストール。

$ curl -O http://www.openinfo.co.uk/apache/extract_forwarded-2.0.2.tar.gz
$ tar zxf extract_forwarded-2.0.2.tar.gz
$ cd extract_forwarded
# apxs -i -c -a mod_extract_forwarded.c

上記apxsコマンドで、モジュールがコンパイルされ/usr/lib/httpd/modules/または/usr/lib64/httpd/modules/にコピーされる。

また、httpd.confに

LoadModule <上記パス>

が追記される。

 

4. Apacheの設定

/etc/httpd/conf/httpd.confのLoadModule近辺に以下を追加。

LoadModule extract_forwarded_module modules/mod_extract_forwarded.so

また、ファイルの最後に以下も追加。

MEForder refuse,accept
MEFrefuse all
# Nginx(リバースプロキシ)のIPアドレス
MEFaccept 127.0.0.1

ここからはポートの設定。

通常、Nginxを80番ポートで実行するため、Apacheの待ち受けポートを8080等に変更する。

#Listen 80
Listen 8080

NginxとApacheの両方でHTTPSを提供している場合、こちらもポートがかぶるので、Apache側のポートを変更する。設定ファイルは、/etc/httpd/conf.d/ssl.conf。

# Apacheでsslを停止するなら、下記のようにコメントアウトでOK
#Listen 443

ssl.confがない場合、httpdでsslを利用するのに必要なmod_sslがインストールされていないため、これをインストール。

# yum install mod_ssl

以上の設定で、Nginxをリバースプロキシとして、一部の通信をApacheに転送することが可能。

 

5. 補足(mod_rpafの利用)

mod_rpafをインストールする場合は、ここが参考になる。

 

■参考文献


Nginxに証明書を導入してHTTPSを使用する

1. 証明書の結合

自分が使っているサーバ証明書のルート証明書が、ユーザのブラウザでは中間証明書になっている、または、インストールされていない場合、正当な証明書として認識されない。

この場合、自分のルート証明書とユーザのブラウザにインストールされているルート証明書を結びつける連結証明書を認証局が提供している場合がある。

今回の場合、サーバ証明書はRapid SSL、このルート証明書はGeoTrust Global CAで、ユーザのブラウザには、ルート証明書としてEquifax Secure CAがインストールされている可能性があるので、公開されているGeoTrust Global CAとEquifax Secure CAの連結証明書(ex. intermediate.crt)をサーバ証明書(ec. hoge.com.crt)に結合する。

$ cat hoge.com.crt intermediate.crt > hoge.com.chainded.crt

 

2. Nginxの設定

HTTPS(SSL)を利用するには二つの設定方法がある。

(a) 新たにHTTPS専用のserverブロックを丸ごと追記する

(b) 既存のHTTPのserverブロックにsslに必要な項目だけ追記する

基本的な記述内容は、(a), (b)で同じになる。

既存のHTTPサーバーと同じ設定で運用したいなら(b)が便利。ここでは、(b)で進める。

server {
    listen 59.157.2.75:80;
    # リッスンポートを指定
    listen 59.157.2.75:443 ssl;
    server_name abeerforyou.com;
    root /var/www/html/abeerforyou.com;

    # サーバ証明書
    ssl_certificate /etc/pki/tls/certs/hoge.com.chained.crt
    # プライベートキー
    ssl_certificate_key /etc/pki/tls/private/hoge.com.key.pem

    ....
}

 

3. 証明書が正しく設定されているか確認

SSL Certificate Installation Checkerを使用して確認する。

 

■参考文献


NginxでVirtual Hostを使用する

1つのNginxサーバで複数のサイト(Virtual Host)を運営する。

Nginxの設定ファイル/usr/local/nginx/conf/nginx.confにVirtual Hostの数だけserverブロックを追加するだけでいい。

server {
    listen       59.157.2.75:80;
    server_name  abeerforyou.com;
    root /var/www/html/abeerforyou.com;

    ...
}

server {
    listen       xxx.xxx.xxx.xxx:80;
    server_name  hoge.com;
    root /var/www/html/hoge.com;

    ...
}

...

 

■参考文献