タグ・アーカイブ: apache

前回までのエントリー(コレコレ)で、heartbeatのインストールとVIPの引継ぎができました。しかしそれだけじゃ冗長化には程遠いってのが人情。次は、apacheのサービスを引き継がせてみましょう。

■ httpdの停止

[重要]
heartbeatの設定をする前に、既存のhttpdを停止します。勿論、httpdの自動起動も停止しておきます。これは、今後httpdの起動停止をheartbeatがつかさどるためです。

[root@ishikari ~]# /etc/init.d/httpd stop
[root@ishikari ~]# chkconfig httpd off
[root@ishikari ~]# chkconfig httpd --list
httpd           0:off   1:off   2:off   3:off   4:off   5:off   6:off
    ↑
すべてのランレベルでoffになっていることを確認する。

※ 注意
yumでhttpdをインストールして、/etc/sysconfig/httpd ファイルを使って apache を worker モードで動かしている場合、heartbeat経由ではこの設定が失われてしまいます(preforkで動作してしまうってこと)。よって、 /usr/sbin/httpd を /usr/sbin/httpd.orig としてバックアップし、 /usr/sbin/httpd.worker へのシンボリックリンクとして /usr/sbin/httpd を設定すること。

例)
# mv /usr/sbin/httpd /usr/sbin/httpd.orig ; ln -s /usr/sbin/httpd.worker /usr/sbin/httpd

■ heartbeat停止

一旦両系でheartbeatを停止します。

[root@ishikari ~]# /etc/init.d/heartbeat stop
Stopping High-Availability services:
                                                           [  OK  ]

■ httpd監視設定を行う

[root@ishikari ~]# cd /var/lib/heartbeat/crm/

※ すべてのファイルをバックアップする
[root@ishikari crm]# tar czf cib.tar.gz *

※ cib.xml.last cib.xml.sig cib.xml.sig.last を削除する
[root@ishikari crm]# rm -f cib.xml.last cib.xml.sig cib.xml.sig.last

cib.xml を編集する
[root@ishikari crm]# vi cib.xml

まず、タグの直下にある、の閉じタグ「」を削除します。(そもそも閉じタグだけで、 タグが開始されていないが・・・)

※ ここを
    
      
      
    

    

※ こうする
    
      
      
    

次に、タグの直下に、以下を追記します。
ココで投入する固有の値は「group_apache(どうやらグループの名前は何でもよいっぽい)」「192.168.0.200(httpをlistenするVIPの値)」「eth0(VIPをeth0インターフェイスのエイリアスにする)」「24(サブネットマスクのビット数)」「/etc/httpd/conf/httpd.conf(httpd.confのフルパス)」です。

    
      
                 
          
            
            
            
          

        

      
               
          
            
          

        

        
      

    

以上の設定が終わったら保存します。

■ httpd.confを修正する

[root@ishikari crm]# cd /etc/httpd/conf
[root@ishikari conf]# cp -p httpd.conf httpd.conf.20090104
[root@ishikari conf]# vi httpd.conf

※ ここを
Listen 80

※ こうする
Listen 192.168.0.200:80

※ ここを
#
#    SetHandler server-status
#    Order deny,allow
#    Deny from all
#    Allow from .example.com
#

※ こうする

    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.0

■ heartbeatを起動する

[root@ishikari ~]# /etc/init.d/heartbeat start
Starting High-Availability services:
                                                           [  OK  ]

[root@sorachi ~]# /etc/init.d/heartbeat start
Starting High-Availability services:
                                                           [  OK  ]

■ 起動後の確認

しばらく時間をおいて、両系にて監視コマンドを実行します。以下のよう

通常、apacheを何も考えずにインストールすると、preforkで動作します。小規模サイトであればそのままでも構わないのですが、大規模サイトでスレッドによる処理の引渡しが要件に入ってくると、workerで適切なパラメータを投入して動かしたほうがパフォーマンスがよくなります。
※ ただしマシンスペックが低いとあんまり恩恵にあずかれないかも・・・

ちなみに、rpmからインストールしたapacheの動作をpreforkからworkerに変えるのは簡単。
/etc/sysconfig/httpd ファイルの
#HTTPD=/usr/sbin/httpd.worker ← ココのコメントを外し、apacheを再起動するだけ。

しかし問題が1つあって、CentOS付属のPHPはスレッドによる処理の引渡に対応していないので、どノーマルなhttpdとphpをインストールした後にworkerで動作させようとすると、apacheの起動時に以下のようなエラーを吐くのです。。。対処法はココを参考にしました。

$ sudo /etc/init.d/httpd start
Starting httpd: [Fri Jan 02 18:13:43 2009] [crit] Apache is running a threaded MPM, but your PHP Module is not compiled to be threadsafe.  You need to recompile PHP.
Pre-configuration failed
                                                           [FAILED]

■■ PHPのソースRPM入手とインストール

■ ソースRPMの入手

CentOSのミラーサイトには、大抵SRPMのディレクトリがあります。今回は理研さまのサイトからもってきました。
[oresama@sorachi ~]$ wget http://ftp.riken.jp/Linux/centos/5/os/SRPMS/php-5.1.6-20.el5.src.rpm

■ ソースrpmを展開する
[oresama@sorachi ~]$ rpm -ivh php-5.1.6-20.el5.src.rpm

■ SPECファイルを編集する
[oresama@sorachi ~]$ cd rpm/SPECS/
[oresama@sorachi SPECS]$ cp -p php.spec php.spec.orig
[oresama@sorachi SPECS]$ vi php.spec

ここを
%configure
        --cache-file=../config.cache
・・・

こうする
%configure
        --with-tsm-pthreads
        --enable-maintainer-zts
        --cache-file=../config.cache

tsm-pthreadsとmaintainer-ztsを有効にしてやるってことです。

■ 必要なパッケージをインストールする

その他、configureオプションを意図的に削除しない限りは、最低限以下のパッケージが必要になります。

apr-devel apr-util-devel aspell-devel autoconf automake beecrypt-devel bzip2-devel curl-devel cyrus-sasl-devel db4-devel e2fsprogs-devel elfutils-devel elfutils-devel-static elfutils-libelf-devel elfutils-libelf-devel-static expat-devel fontconfig-devel freetype-devel gcc-c++ gd gd-devel gmp-devel httpd-devel imake keyutils-libs-devel krb5-devel libc-client libc-client-devel libgcrypt-devel libgpg-error-devel libidn-devel libjpeg-devel libpng-devel libselinux-devel libsepol-devel libstdc++-devel libtool libX11-devel libXau-devel libXdmcp-devel libxml2-devel libXpm libXpm-devel libxslt libxslt-devel lm_sensors mesa-libGL-devel mysql mysql-devel ncurses-devel net-snmp net-snmp-devel net-snmp-libs openldap-devel openssl-devel pam-devel pcre-devel perl-DBI pkgconfig postgresql postgresql-devel rpm-devel sqlite-devel unixODBC unixODBC-devel xorg-x11-proto-devel zlib-devel

■ rpmbuildコマンドでビルドする

[oresama@sorachi SPECS]$ rpmbuild -bb php.spec

■ パッケージをインストールする

[oresama@sorachi SPECS]$ cd ../RPMS/i386
[oresama@sorachi i386]$ rpm --test -ivh php-5.1.6-20.i386.rpm php-cli-5.1.6-20.i386.rpm php-common-5.1.6-20.i386.rpm
[oresama@sorachi i386]$ sudo rpm -ivh php-5.1.6-20.i386.rpm php-cli-5.1.6-20.i386.rpm php-common-5.1.6-20.i386.rpm

■ apacheを再起動して反映
[oresama@sorachi i386]$ sudo /etc/init.d/httpd restart
Stopping httpd:                                            [  OK  ]
Starting httpd:                                            [  OK  ]

※ yumでパッケージをアップデートする際に、phpの上書きインストールがされないよう、yum.confでexcludeしましょう。

[oresama@sorachi ~]$ cd /etc/
[oresama@sorachi etc]$ sudo cp -p yum.conf yum.conf.orig
[oresama@sorachi etc]$ sudo vi yum.conf

この行を追加
exclude=php*

あとは、phpのテストページが正常に表示されればOKです。
ね、簡単でしょ?

某所にてApacheをインストールした際、最新のバージョンが使いたいという要件からrpmからではなくソースからインストールしました。ある程度の規模のアクセスを見込んでいたので、rotatelogsを使って、apacheのプロセスを再起動することなくログのローテーションをすることにしたのですが・・・

(;´Д`) 1日のアクセスログが5GBって何?

予想以上のアクセス数で、/usrパーティションが1週間もしないうちに枯渇してしまうであろうことは容易に想像できたので、とりあえずはlatestなログ以外は全部gzip圧縮してしまおう!と思ったのです。

 ・ 仕様
apacheのアクセスログとエラーログのうち、昨日データが修正されたもので、かつまだ圧縮されていないものを検索し、gzip圧縮する

# cd /root/bin
# touch logcompress.sh
# chmod 755 logcompress.sh
# vi logcompress.sh
~~~~~~~~ ここから記述 ~~~~~~~~
#!/bin/sh
LANG=C
cd /usr/local/apache2/logs
for i in `find . -name '*_log*' -mtime 1 | grep -iv gz`
do
    gzip $i
done
~~~~~~~~ ここまでです ~~~~~~~~

ちなみに、rotatelogsってなんで朝9時に実行されるんだろ?って思ってヘルプを見てみたら

$ /usr/local/apache2/bin/rotatelogs --help
Incorrect number of arguments
Usage: /usr/local/apache2/bin/rotatelogs [-l] [-f] {|} [offset minutes from UTC]

Add this:

TransferLog "|/usr/local/apache2/bin/rotatelogs /some/where 86400"

or

TransferLog "|/usr/local/apache2/bin/rotatelogs /some/where 5M"

to httpd.conf. The generated name will be /some/where.nnnn where nnnn is the
system time at which the log nominally starts (N.B. if using a rotation time,
the time will always be a multiple of the rotation time, so you can synchronize
cron scripts with it). At the end of each rotation time or when the file size
is reached a new log is started.

当たり前ですがUTCで0時に実行されるんですね(^_^;

なので、さっき作ったlogcompress.shは、毎日9時より数分後にcronで実行するようにしています。これによって、生ログで5GB近くあったものが300MB程度に圧縮されました。わーい。

ntopとは、各種プロトコルの情報やホストごとの送受信パケット数/データ量やスループットの他、トラフィックの時間経過グラフ、ホスト間の通信データ量などをブラウザでわかりやすく表示してくれるソフトです。コンソールからも使えるようですが、目に見えてわかりやすいのは、ブラウザに表示されるグラフでしょう。

インストール後の設定については、
http://www.geocities.jp/i_catnap/Diary/Diary-0404.html
を参考にしました。

ただインストールしても動くのですが、LAN内を流れるパケットをモニターする関係上、誰にでもグラフを見せていいか?・・・となると、ちょっと疑問が残ります。ntopそのものはユーザによるアクセス制限(見せたいデータの権限を指定)がありますが、ntopへのそもそものアクセスを、限られたユーザだけにしたいなー・・・という思いもあったりします。なので、

ntopを動かす(待ち受ける)インターフェイスはeth0
ntopにアクセスできるノードはeth0の属するサブネット(192.168.0.0/24)のみ
ntopの画面にはiptablesを使って直アクセスさせず、一度apacheのmod_proxyを介して、ベーシック認証を通過させる

ユーザがntopの画面を見るまでには、以下のステップを踏むことになります。

[パソコンのブラウザ] → [apache (ベーシック認証、mod_proxyによるリバースプロキシ)] → [ntop]

また、ユーザは http://192.168.0.3/ にアクセスしてユーザ名とパスワードを聞かれることを意識するくらいで使うことができますし、使わせる側としても、不必要に裏側でどう動いているかを見せなくてすむというメリットがあります。

■■ インストール

インストールした環境は以下のとおりです。

----------------------------------------------------------------------------------------------------------------------------------------------------------------
sh-3.00$ hostname
intra1.example.com

sh-3.00$ cat /etc/redhat-release
CentOS release 4.6 (Final)

sh-3.00$ uname -a
Linux intra1.example.com 2.6.9-67.0.15.EL #1 Thu May 8 10:39:19 EDT 2008 i686 i686 i386 GNU/Linux
----------------------------------------------------------------------------------------------------------------------------------------------------------------

ntopのパッケージはrpmforgeリポジトリにあるので、ここからインストールします。

[root@intra1 ~]# yum --enablerepo=rpmforge install ntop
(中略)
Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 ntop                    i386       3.3-1.el4.rf     rpmforge          3.4 M
Installing for dependencies:
 net-snmp-libs           i386       5.1.2-11.el4_6.11.2  update            1.7 M

Transaction Summary
=============================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 5.2 M
Is this ok [y/N]: y

■■ 設定

■ ntop.conf 編集

[root@intra1 ~]# cd /etc/
[root@intra1 etc]# cp -p ntop.conf ntop.conf.orig
[root@intra1 etc]# vi ntop.conf

 ・ ログの出力先を変更する

ここを
### Logging messages to syslog (instead of the console):
###  NOTE: To log to a specific facility, use --use-syslog=local3
###  NOTE: The = is REQUIRED and no spaces are permitted.
--use-syslog

こうする
### Logging messages to syslog (instead of the console):
###  NOTE: To log to a specific facility, use --use-syslog=local3
###  NOTE: The = is REQUIRED and no spaces are permitted.
#--use-syslog
--use-syslog=local3

※ syslogのファシリティに空きがあるかどうか(local3が使われていないか)を/etc/syslog.confを見て確認すること

 ・ ntopがローカルとみなすネットワークを設定する

ここを
### Sets the networks that ntop should consider as local.
###  NOTE: Uses dotted decimal and CIDR notation. Example: 192.168.0.0/24
###        The addresses of the interfaces are always local and don't need to be specified.
#--local-subnets xx.xx.xx.xx/yy

こうする
### Sets the networks that ntop should consider as local.
###  NOTE: Uses dotted decimal and CIDR notation. Example: 192.168.0.0/24
###        The addresses of the interfaces are always local and don't need to be specified.
#--local-subnets xx.xx.xx.xx/yy
--local-subnets 192.168.0.0/24

 ・ ntopをデーモンモードで動かす

ここを
### Sets program to run as a daemon
###  NOTE: For more than casual use, you probably want this.
#--daemon

こうする
### Sets program to run as a daemon
###  NOTE: For more than casual use, you probably want this.
#--daemon
--daemon

以上を確認して保存します。

■ スタートスクリプトの編集

/etc/init.d/ntopを編集して、eth0のIPアドレスでのみlistenするようにします。
まずはifconfigコマンドでeth0のIPアドレスを確認しましょう。

sh-3.00# ifconfig eth0 | grep "inet addr"
          inet addr:192.168.0.3  Bcast:192.168.0.255  Mask:255.255.255.0

eth0に割り当てられているIPアドレスは192.168.0.3です。

sh-3.00# cd /etc/init.d
sh-3.00# cp -p ntop ntop.orig
sh-3.00# vi ntop

ここを
start () {
        echo -n $"Starting $prog: "
        daemon $prog -d -L @/etc/ntop.conf
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}

こうする
start () {
        echo -n $"Starting $prog: "
        #daemon $prog -d -L @/etc/ntop.conf
        daemon $prog -d -w 192.168.0.3:3000 -L @/etc/ntop.conf
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
        return $RETVAL
}

スタートスクリプト
からntopを起動するときのオプションは以下のとおりです。

-d = デーモンモードとして動かす
-w 192.168.0.3:3000 = IPアドレス192.168.0.3のポート3000番で待ち受ける
-L = 標準出力のかわりにsyslogへメッセージを送る
@/etc/ntop.conf = /etc/ntop.conf を設定ファイルとする

■ syslog.conf編集

[root@intra1 etc]# cp -p syslog.conf syslog.conf.20080616
[root@intra1 etc]# vi syslog.conf

ここを
*.info;mail.none;authpriv.none;cron.none;local1.none                   /var/log/messages

こうする
#*.info;mail.none;authpriv.none;cron.none;local1.none                   /var/log/messages
*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none        /var/log/messages

そして下記を追加する
local3.*                                                                /var/log/ntoplog

■■ syslogdをreloadする

[root@intra1 etc]# /etc/init.d/syslog reload
Shutting down kernel logger:                               [  OK  ]
Shutting down system logger:                               [  OK  ]
Starting system logger:                                    [  OK  ]
Starting kernel logger:                                    [  OK  ]

■■ ntopのログローテーション設定を行う

お好みでログローテーションの設定を変更します。
(っ´∀`)っ ゃー はログを読むためだけにrootになったりするのがイヤなので、
(っ´∀`)っ ゃーが普段使うユーザ「oresama」はwheelグループに入れています。
で、読みたいログはwheelグループに読み込みの権限を与えています。

[root@intra1 etc]# cd logrotate.d/
[root@intra1 logrotate.d]# vi ntop

ここを
/var/log/ntop.access.log {
        missingok
        postrotate
                /sbin/service ntop condrestart >/dev/null 2>&1
        endscript
}

こうする
/var/log/ntoplog {
        daily
        rotate 365
        compress
        ifempty
        create 0640 root wheel
        missingok
        postrotate
                /sbin/service ntop condrestart >/dev/null 2>&1
        endscript
}

■■ 初期設定

ntopを最初に動かす前に、ntopの管理ユーザ「admin」のパスワードを設定します。
これは、ntopの細かい設定をブラウザから行うときに使います。

[root@intra1 logrotate.d]# cd
[root@intra1 ~]# /usr/bin/ntop
(しばらくログが流れた後)
ntop startup - waiting for user response!

Please enter the password for the admin user:
Please enter the password again:

というプロンプトが出るので、パスワードを入力し、しばらくしてからCtrl+Cで終了させます。

■■ 起動

■ スタートスクリプトからの起動

[root@intra1 ~]# /etc/init.d/ntop start
Starting ntop:                                             [  OK  ]

[root@intra1 ~]# /etc/init.d/ntop status
ntop (pid 559) is running...

■ 自動起動設定

[root@intra1 ~]# chkconfig ntop --list
ntop            0:off   1:off   2:off   3:off   4:off   5:off   6:off

[root@intra1 ~]# chkconfig ntop on

[root@intra1 ~]# chkconfig ntop --list
ntop            0:off   1:off   2:on    3:on    4:on    5:on    6:off

■■ ブラウザから見てみる

http://192.168.0.3:3000/

グラフはあっさり表示されます。

ユーザ名:admin
パスワード:(さっき指定したやつ)

■■ ベーシック認証を使えるようにする

ntopの認証機能は、画面の一部を見せたり見せなかったりするようですが、
そもそもグラフそのものにアクセスさせたくないっていう場合には、
次の仕組みを使うことによってベーシック認証を実現することができます。

1) 192.168.0.3 をntop専用のバーチャルホストとして、一度apacheで接続を待ち受け、apacheのリバースプロキシを使ってntopへ要求を投げる
2) iptablesでポート3000番をlocalhostにだけ許可する
3) ベーシック認証をかける

■ 1 apacheで192.168.0.3をntop専用のバーチャルホスト設定する

apacheでmod_proxyが使えるかどうか、以下の記述がhttpd.confにあるか確認してください。

LoadModule proxy_module modules/mod_proxy.so

それでは設定です。

sh-3.00# cd /etc/httpd/conf.d
sh-3.00# vi ntop.conf

NameVirtualHost 192.168.0.3:80

    # サーバー名の指定をする
    ServerName intra1.example.com
    # エラーログの定義
    ErrorLog /home/oresama/logs/intra1_error.log
    # アクセスログの定義
    CustomLog /home/oresama/logs/intra1_access.log combined
    # フォワードプロキシをoffにする
    ProxyRequests Off
    # リモートサーバをローカルサーバのURL空間にマップする。
    # ここでは、/にアクセスすると、http://192.168.0.3:3000/にマップする。
    ProxyPass / http://192.168.0.3:3000/

    < br />        # ベーシック認証に使うファイルを定義する
        AuthUserFile /home/oresama/auth/.htpasswd
        AuthGroupFile /dev/null
        AuthName "User Admin"
        AuthType Basic
        require valid-user
        # 外部からの接続を拒絶し、LAN内からのアクセスのみ許可する
        Order deny,allow
        Deny from all
        Allow from 192.168.0.0/24
   

■ 設定反映

sh-3.00# apachectl configtest
sh-3.00# apachectl graceful

■ iptablesでポート3000番をlocalhostだけにする

sh-3.00# iptables -L -n | grep 3000
ACCEPT     tcp  --  127.0.0.1            0.0.0.0/0           tcp dpt:3000

■ ベーシック認証をかける

sh-3.00# htpasswd -c /home/oresama/auth/.htpasswd oresama
New password:
Re-type new password:
Adding password for user oresama

sh-3.00# cat /home/oresama/auth/.htpasswd
oresama:n8H0Vb.JKkuRA

■ 確認

http://192.168.0.3/
にアクセスして、ベーシック認証がかかること

http://192.168.0.3:3000/
にアクセスして、接続ができないこと

以上で、LAN内を流れるパケットをモニターすることができました。
ね、簡単でしょ?