RaspberryPi::cacti (nginx + php-fpm)

cactiでapacheを稼働させることを試したので、次はnginxを使ってみます。
少しは軽くなることを期待して。。。

apacheを起動しないようにします。

# systemctl disable httpd.service

nginxとphp-fpmをインストールします。

#pacman -S nginx
#pacman -S php-fpm

php.ini等はapacheの時に変更しているので、今回は変更なし

php-fpmを127.0.0.1:9000で立ち上げることにします。設定ファイルは/etc/php/php-fpm.confにあります。

#listen = 127.0.0.1:9000
listen = /run/php-fpm/php-fpm.sock
 ↓
listen = 127.0.0.1:9000
#listen = /run/php-fpm/php-fpm.sock

起動時に立ち上がるようにしておきます。

#systemctl enable php-fpm.service

nginxの設定をします。今回はインターネットへ公開するわけでないので、扱いやすいようにしています。

    server {
        listen       80;
        server_name  localhost;
        root /usr/share/nginx/html;     (追加)
        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
#            root   /usr/share/nginx/html;  (コメント)
            index  index.html index.php; (index.phpを追加)
        }

        ... (途中略)
    
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        location ~ \.php$ {
#            root           html;  (コメント)
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; (変更)
            include        fastcgi_params;
        }

cactiは/usr/share/webapps/cactiにインストールされているので、nginxのdocument rootへシンボリックリンクを張ってます。

# cd /usr/share/nginx/html
# ln -s /usr/share/webapps/cacti .

nginxを起動時に立ち上がるように設定します。

#systemctl enable nginx.service

/usr/share/nginx/html以下全てのディレクトリに対してphpスクリプトを置けるようにしているので
デバッグ等をしやすいように設定しています。(セキュリティ等は今回無視です)

nginxにしたからといって、軽くはなりませんでした。
cactiをアクセスした時にグラフの生成時に時間がかかっています。rrdtoolが重いようです。

top - 11:54:27 up 15:05,  1 user,  load average: 3.09, 0.95, 0.46
Tasks:  70 total,   6 running,  64 sleeping,   0 stopped,   0 zombie
%Cpu(s): 93.9 us,  6.1 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:    446772 total,   246136 used,   200636 free,    40280 buffers
KiB Swap:        0 total,        0 used,        0 free,   107336 cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM     TIME+ COMMAND                              
 5503 http      20   0 34568 4680 3244 R 19.8  1.0   0:07.88 rrdtool                              
 5498 http      20   0 34712 4744 3248 R 19.5  1.1   0:08.95 rrdtool                              
 5501 http      20   0 34580 4716 3248 R 19.5  1.1   0:08.41 rrdtool                              
 5505 http      20   0 34588 4672 3256 R 19.5  1.0   0:07.26 rrdtool                              
 5507 http      20   0 34432 4544 3244 R 19.2  1.0   0:05.81 rrdtool                              
 5509 root      20   0  2988 1236  936 R  1.0  0.3   0:00.31 top                                  
  108 mysql     20   0  296m  34m 5340 S  0.3  7.9   9:56.92 mysqld               
...

まあ、動かせることができるという程度ですね。。

 

nginx::nginx_status

nginxへ移行してみたものの、速さやリソース消費などメリットがよくわかりません。
とりあえず、nginxでは簡単なstatusが取得できるようなので、設定して、cactiでグラフ化してみました。
※internetからはアクセスできませんので、あしからず。

cactiのforumにありましたので参考に設定しました。
cacti-nginx.tar.gzをダウンロードします。

nginxを–with-http_stub_status_module付きでコンパイルします。

nginx.confに下記を追加

  location /nginx_status {
    stub_status on;
  }

こんな感じのレスポンスが得られます。シンプルでいいですね。

Active connections: 1 
server accepts handled requests
 1992 1992 5887 
Reading: 0 Writing: 1 Waiting: 0 

cacti-enginx.tar.gzを展開すると、下記5つのファイルがあります。

cacti-nginx-readme
cacti_graph_template_nginx_clients_stat.xml
cacti_graph_template_nginx_sockets_stat.xml
get_nginx_clients_status.pl
get_nginx_socket_status.pl

perlのスクリプトはcacti/scriptsディレクトリにコピーします。
xmlファイルはcactiのguiを使ってtemplate importします。

cactiでgraph作成時に上記のtemplateを利用します。設定中にurlを尋ねられるので、下記を入力。
(localhostとかでも良いんでしょうが、virtual hostの設定とかちょっとありまして。。。)

http://192.168.0.YYY/nginx_status

こんなグラフが取得できます。

php-fpmのstatusもとれるみたいだし、cactiでグラフ化もできるみたいなので、設定しておきますか。。

 

apacheからnginx + php-fpm

apacheで何の問題もないんだけど、なんとなくnginxへ移行。流行だからw
nginxはモジュール追加するときは、一からコンパイルしないといけないみたい。
結局のところ、下記で現状構築。

% cd nginx-1.2.3
% ./configure --prefix=/usr/local/nginx --with-openssl=/usr/local/ssl --with-ipv6 --with-http_stub_status_module
% make
# make install

起動スクリプトはいつものごとく、portsから抜いて使用させて頂きました。(パスを変更)
/etc/rc.confにnginx_enable=”YES”を追加。

/usr/local/nginx/conf/nginx.confの設定

user www;
worker_processes  2;  (2coreだし。。。)

http {
...
  server {
     listen  192.168.0.XXX:80 default_server;
     listen  [2001:470:24:XXX::YYY]:80 default_server;
     server_name _;
     return 444;
  } 
  include  /usr/local/nginx/conf.d/*.conf;
}

virtual hostの設定はconf.d/において設定を記述することにしました。

nginx.confでserver定義をしているのは、IPアドレスでアクセスする人や、異なる名前でアクセスする人など
がいるので、明示的にdefault serverを上記のようにしてコネクションを切るようにしています。
間違って、違うホスト名で住人のblogが表示されるなんてこともなくなります。
※意外とvirtual hostって神経使いますよね。。IPでアクセスしたら違うblogが表示されたりw

次にphpの設定を。。。
cgiはfast-cgi経由で実行するようです。

phpでは、5.3以降php-fpmというのが利用できるようです。
はじめは、phpもコンパイルして動作させましたが、だいたいの動作のイメージができたので、
最終的にはportsを利用。

# cd /usr/ports/lang/php53
# make config
  ZEND MULTIBYTE php-fpm (php-fpmにチェック)
# make 
# make install

php5のextensionも入れます

# cd /usr/ports/lang/php53-extensions
# make config
 BZ2, GD, MBSTRING, MYSQL, SNMP, ZLIB (SQLite関連は不要なので削除した)
# make 
# make install

wordpressのpluginにおいて、GDのfreetypeを扱う必要があったので、はまった。(compile時)
GD構築中に全てをチェックしてports install.
今回はcliのphpも問題なく動作しています。結局、以前はまったのはapache moduleの作り方がよくなかったんだろうと納得することに。

/usr/local/etc/php-fpmの設定

events.mechanism = kqueue  (FreeBSDだから)
....
[www]
user = www
group = www
listen = 127.0.0.1:9000
...

こんな感じ。とりあえず大きなチューニング等はしてません。
/etc/rc.confにphp_fpm_enable=”YES”を追加してOS起動時に立ち上がるようにしています。

本blog用のvirtual hostの定義です。wordpressを使っているので若干手直しが必要でした。
permanent linkを設定するためにurl書き換えしています。(google先生より回答)
apacheの場合は、.htaccessでrewriteしていました。

access logをcombinedに設定しているのは、apacheの時にcombinedだったのでその互換性を維持するため。
awstatsでログ統計をしているので。

/usr/local/nginx/conf.d/lol.confの内容

server {
  listen  192.168.0.XXX:80;
  listen  [2001:470:24:XXX::YYY]:80;
  server_name lol.pman.biz;
  ...
  access_log  logs/blog-access combined;
  ...
  location / {
    root   /xxxxxxx;
    index  index.php index.html;
    try_files $uri $uri/ /index.php?$args;   (wordpress permanent link用)
  }
  ...
  location ~ \.php$ {
    root           /xxxxxx;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  /xxxxxx$fastcgi_script_name;
    include        fastcgi_params;
  }
  location ~ /\.ht {
    deny  all;
  }
}

だいたいこんな感じで移行して、blogを再開。(1日経過したからとりあえず大丈夫かな)
ここにたどりつくまで、いろいろとはまりましたが、そんなのは割愛。^^;
locationの書き方とかちゃんと理解しないといけない。。。ちょっと間違ったりすると、phpのソースコード
がそのままダウンロードされたりする。。。w

実験用のサーバは別にvirtual serverを定義しているので、そこでお勉強かな。。。