nullpopopoでタグ「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

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

※ ここを
     <nodes>
       <node id="12979f53-e6ec-40f0-a7c2-66dfadf286ba" uname="sorachi.in.example.com" type="normal"/>
       <node id="82d27f7b-4e9a-478e-bcc1-80da0140a4a7" uname="ishikari.in.example.com" type="normal"/>
     </nodes>
     <resources/>

※ こうする
     <nodes>
       <node id="12979f53-e6ec-40f0-a7c2-66dfadf286ba" uname="sorachi.in.example.com" type="normal"/>
       <node id="82d27f7b-4e9a-478e-bcc1-80da0140a4a7" uname="ishikari.in.example.com" type="normal"/>
     </nodes>

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

     <resources>
       <group id="group_apache">
         <primitive id="ipaddr" class="ocf" type="IPaddr" provider="heartbeat">
         <instance_attributes id="ia_ipaddr">
           <attributes>
             <nvpair id="ia_ipaddr_ip" name="ip" value="192.168.0.200"/>
             <nvpair id="ia_ipaddr_nic" name="nic" value="eth0"/>
             <nvpair id="ia_ipaddr_netmask" name="netmask" value="24"/>
           </attributes>
         </instance_attributes>
       </primitive>
       <primitive id="apache" class="ocf" type="apache" provider="heartbeat">
         <instance_attributes id="ia_apache">
           <attributes>
             <nvpair id="ia_apache_configfile" name="configfile" value="/etc/httpd/conf/httpd.conf"/>
           </attributes>
         </instance_attributes>
         </primitive>
       </group>
     </resources>

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


■ 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


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

※ こうする
<Location /server-status>
    SetHandler server-status
    Order deny,allow
    Deny from all
    Allow from 192.168.0
</Location>


■ 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  ]


■ 起動後の確認

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

= ココに注目! =================================================================================
    ipaddr      (heartbeat::ocf:IPaddr):        Started sorachi.in.example.com
    apache      (heartbeat::ocf:apache):        Started sorachi.in.example.com
================================================================================================


[root@ishikari ~]# crm_mon -i 3
Defaulting to one-shot mode
You need to have curses available at compile time to enable console mode


============
Last updated: Sun Jan  4 04:43:09 2009
Current DC: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba)
2 Nodes configured.
1 Resources configured.
============

Node: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba): online
Node: ishikari.in.example.com (82d27f7b-4e9a-478e-bcc1-80da0140a4a7): online

Resource Group: group_apache
    ipaddr      (heartbeat::ocf:IPaddr):        Started sorachi.in.example.com
    apache      (heartbeat::ocf:apache):        Started sorachi.in.example.com


[root@sorachi ~]# crm_mon -i 3
Defaulting to one-shot mode
You need to have curses available at compile time to enable console mode


============
Last updated: Sun Jan  4 04:43:18 2009
Current DC: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba)
2 Nodes configured.
1 Resources configured.
============

Node: sorachi.in.example.com (12979f53-e6ec-40f0-a7c2-66dfadf286ba): online
Node: ishikari.in.example.com (82d27f7b-4e9a-478e-bcc1-80da0140a4a7): online

Resource Group: group_apache
    ipaddr      (heartbeat::ocf:IPaddr):        Started sorachi.in.example.com
    apache      (heartbeat::ocf:apache):        Started sorachi.in.example.com


■■ 実際の動きを見てみた

テストコンテンツとして、各々のホスト名を書いたindex.htmlをドキュメントルートに配置。sorachiのeth0を抜き差しして片系障害をおこし、フェイルオーバー/フェイルバックされることを確認しました。また、ifconfigコマンドで確認すると、httpdが生きている間は、ちゃんとVIPが設定されています。

【httpdが生きているsorachi】

[oresama@sorachi ~]$ ps auxwww | grep [h]eartbeat
root     22169  0.0  0.5  12072 12072 ?        SLs  07:23   0:00 heartbeat: master control process
nobody   22172  0.0  0.2   5476  5476 ?        SL   07:23   0:00 heartbeat: FIFO reader
nobody   22173  0.0  0.2   5472  5472 ?        SL   07:23   0:00 heartbeat: write: ucast eth1
nobody   22174  0.0  0.2   5472  5472 ?        SL   07:23   0:00 heartbeat: read: ucast eth1
498      22178  0.0  0.0   4900  1756 ?        S    07:23   0:00 /usr/lib/heartbeat/ccm
498      22179  0.2  0.1   6628  2868 ?        S    07:23   0:00 /usr/lib/heartbeat/cib
nobody   22180  0.0  0.0   4596  1616 ?        S    07:23   0:00 /usr/lib/heartbeat/lrmd -r
nobody   22181  0.0  0.2   4628  4628 ?        SL   07:23   0:00 /usr/lib/heartbeat/stonithd
498      22182  0.0  0.0   4784  1716 ?        S    07:23   0:00 /usr/lib/heartbeat/attrd
498      22183  0.0  0.1   5604  2268 ?        S    07:23   0:00 /usr/lib/heartbeat/crmd
root     22184  3.1  0.1   5920  2096 ?        S    07:23   0:02 /usr/lib/heartbeat/mgmtd -v
root     22185  0.0  0.0   4544  1316 ?        S    07:23   0:00 /usr/lib/heartbeat/pingd -m 100 -d 5s -a default_ping_set

[oresama@sorachi ~]$ ps auxwww | grep [h]ttpd
root     22443  0.2  0.3  14736  7332 ?        Ss   07:23   0:00 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.conf
apache   22454  0.0  0.4 2660000 10232 ?       Sl   07:23   0:00 /usr/sbin/httpd -DSTATUS -f /etc/httpd/conf/httpd.conf

[oresama@sorachi ~]$ /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:90:CC:E9:30:AB
          inet addr:192.168.0.101  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::290:ccff:fee9:30ab/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:47609 errors:0 dropped:0 overruns:0 frame:0
          TX packets:50473 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11591250 (11.0 MiB)  TX bytes:24177872 (23.0 MiB)
          Interrupt:193 Base address:0xa000

eth0:0    Link encap:Ethernet  HWaddr 00:90:CC:E9:30:AB
          inet addr:192.168.0.200  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          Interrupt:193 Base address:0xa000

eth1      Link encap:Ethernet  HWaddr 00:C0:9F:1A:3C:F2
          inet addr:192.168.1.101  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::2c0:9fff:fe1a:3cf2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8757 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8879 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:2555439 (2.4 MiB)  TX bytes:2625068 (2.5 MiB)
          Base address:0xecc0 Memory:fe100000-fe120000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:18876 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18876 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4157055 (3.9 MiB)  TX bytes:4157055 (3.9 MiB)


【httpdが死んでいるishikari】


[oresama@ishikari ~]$ ps auxwww | grep [h]eartbeat
root     14050  0.0  0.5  12076 12076 ?        SLs  06:53   0:00 heartbeat: master control process
nobody   14053  0.0  0.2   5480  5480 ?        SL   06:53   0:00 heartbeat: FIFO reader
nobody   14054  0.0  0.2   5476  5476 ?        SL   06:53   0:00 heartbeat: write: ucast eth1
nobody   14055  0.0  0.2   5476  5476 ?        SL   06:53   0:00 heartbeat: read: ucast eth1
498      14058  0.0  0.0   4928  2008 ?        S    06:53   0:00 /usr/lib/heartbeat/ccm
498      14059  0.2  0.1   6628  2936 ?        S    06:53   0:03 /usr/lib/heartbeat/cib
root     14060  0.0  0.0   4896  1880 ?        S    06:53   0:00 /usr/lib/heartbeat/lrmd -r
nobody   14061  0.0  0.2   4624  4624 ?        SL   06:53   0:00 /usr/lib/heartbeat/stonithd
498      14062  0.0  0.0   5188  1820 ?        S    06:53   0:00 /usr/lib/heartbeat/attrd
498      14063  0.0  0.1   5624  2668 ?        S    06:53   0:00 /usr/lib/heartbeat/crmd
root     14064  0.0  0.0   5924  1912 ?        S    06:53   0:00 /usr/lib/heartbeat/mgmtd -v
root     14065  0.0  0.0   4544  1336 ?        S    06:53   0:00 /usr/lib/heartbeat/pingd -m 100 -d 5s -a default_ping_set
498      15217  0.0  0.1   5132  2124 ?        S    06:55   0:00 /usr/lib/heartbeat/tengine
498      15218  0.0  0.1   5760  2380 ?        S    06:55   0:00 /usr/lib/heartbeat/pengine

[oresama@ishikari ~]$ ps auxwww | grep [h]ttpd

[oresama@ishikari ~]$ /sbin/ifconfig
eth0      Link encap:Ethernet  HWaddr 00:90:CC:E9:2D:DD
          inet addr:192.168.0.100  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::290:ccff:fee9:2ddd/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:45991 errors:0 dropped:0 overruns:0 frame:0
          TX packets:51372 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:11094384 (10.5 MiB)  TX bytes:15222245 (14.5 MiB)
          Interrupt:201 Base address:0xc000

eth1      Link encap:Ethernet  HWaddr 00:C0:9F:1A:3C:2D
          inet addr:192.168.1.100  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::2c0:9fff:fe1a:3c2d/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:8820 errors:0 dropped:0 overruns:0 frame:0
          TX packets:8785 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100
          RX bytes:2631005 (2.5 MiB)  TX bytes:2542771 (2.4 MiB)
          Base address:0xecc0 Memory:fe100000-fe120000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          inet6 addr: ::1/128 Scope:Host
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:18799 errors:0 dropped:0 overruns:0 frame:0
          TX packets:18799 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:4120744 (3.9 MiB)  TX bytes:4120744 (3.9 MiB)


これで切替の基本動作はOK。sorachiのネットワークケーブルを抜いてから3秒で検知し、その後3秒でapacheが切り替わり、sorachiのネットワーク復旧は5秒で検知し、その後apacheは5秒で切り替わりました。都合6秒で切り替わり、復旧は都合10秒。

ね、簡単でしょ?


通常、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] <logfile> {<rotation time in seconds>|<rotation size in megabytes>} [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
<VirtualHost 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/

    <Location />
        # ベーシック認証に使うファイルを定義する
        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
    </Location>
</VirtualHost>


■ 設定反映

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内を流れるパケットをモニターすることができました。
ね、簡単でしょ?

B○G IPとか買うお金がなく、NIC追加したりするためのサーバ停止する機会すらなく、30分でロードバランサを構築したい場合、poundでリバースプロキシを構築すると便利です。

■■ やりたいこと

1台のリバースプロキシを、httpやhttpsアクセスの矢面に立たせる
バックエンドには、2台のhttpサーバがあり、それぞれhttpd.confベタ書きかIPベースのバーチャルホストを構築する

このコンテンツのために構築したサーバは以下の通りです。
リバースプロキシ:www.example.com 192.168.0.4 (CentOS4.6)
httpサーバ1:be1.example.com 192.168.0.120 (CentOS5.1)
httpサーバ2:be2.example.com 192.168.0.121 (CentOS5.1)

なお、www.example.comでapacheが動いている場合、192.168.0.4でhttpとhttpsをlistenしないようにします。
httpd.confで
Listen 80
となっているところを
Listen 192.168.0.3:80
のように、192.168.0.4以外のIPアドレスでlistenするようにします。
ssl.confでも、
Listen 443
となっているところを
Listen 192.168.0.3:443
とします。

■■ poundのインストール

※ ソースRPMをダウンロードして自分でビルドしてRPMパッケージを作るので、あらかじめrpm-buildをインストールし、ホームディレクトリ以下に.rpmmacrosファイルとrpm/{BUILD,RPMS,SOURCES,SPECS,SRPMS}ディレクトリを作成しておいてください。

poundの公式サイトから、パッケージをダウンロードしてきます。
ブラウザをちょっとだけスクロールすると、
 ・ RPMs for RedHat are available at http://www.invoca.ch/pub/packages/pound/
という文字列が見えるので、右クリックしてリンク先のURLをコピーします。

ターミナルから
$ wget http://www.invoca.ch/pub/packages/pound/pound-2.4.2-1.src.rpm
で、SRPMパッケージをダウンロードしてきます。なお、これは執筆時点での最新バージョンです。

次に、ダウンロードしてきたSRPMファイルを展開します。
$ rpm -ivh pound-2.4.2-1.src.rpm

SPECファイルを確認します。
$ cd rpm/SPECS/
$ less pound.spec
(中略)
BuildRequires: openssl-devel, pkgconfig, pcre-devel, google-perftools-devel
BuildRequires: sed, perl
と書いてあるので、openssl-devel、pkgconfig、pcre-devel、google-perftools-devel、sed、perlがインストールされているか確認します。

sedとperlは、恐らくほとんどの環境ではインストールされていると思います。
openssl-devel、pkgconfig、pcre-develはbaseリポジトリにあるので、何のオプションもなしにyumコマンドでインストールできるはずです。

google-perftools-devel は、RPM Searchから探して持って来ました。なお、google-perftools-develをインストールするには、google-perftoolsも必要になります。

$ wget ftp://ftp.pbone.net/mirror/download.fedora.redhat.com/pub/fedora/epel/4/i386/google-perftools-devel-0.92-1.el4.2.i386.rpm
(↑2行に見えますが実際は1行です)
$ wget ftp://ftp.pbone.net/mirror/download.fedora.redhat.com/pub/fedora/epel/4/i386/google-perftools-0.92-1.el4.2.i386.rpm
(↑2行に見えますが実際は1行です)

$ rpm --test -ivh google-perftools-0.92-1.el4.2.i386.rpm google-perftools-devel-0.92-1.el4.2.i386.rpm
$ su -
# rpm -ivh google-perftools-0.92-1.el4.2.i386.rpm google-perftools-devel-0.92-1.el4.2.i386.rpm
# exit

続いて、一般ユーザ「oresama」に戻ってからpoundのRPMをビルドします。

$ cd ~/rpm/SPECS/
$ rpmbuild -ba pound.spec

ビルドが終わったら、poundの依存関係を確認します。

$ cd ../RPMS/i386/
$ rpm --test -ivh pound-2.4.2-1.i386.rpm

何も問題なければ、インストールを行います。

$ su -
# cd /home/oresama/rpm/RPMS/i386/
# rpm -ivh pound-2.4.2-1.i386.rpm


■■ pound.cfgを編集する

# cd /etc/pound
# cp -p pound.cfg pound.cfg.orig
# vi pound.cfg
User "nobody"
Group "nobody"
RootJail "/usr/share/pound"
Control "/var/run/pound/ctl_socket"

# Main listening ports
ListenHTTP
    #Address 0.0.0.0
    #poundで待ち受けるIPアドレスを指定する。
    Address 192.168.0.4
    Port    80
    xHTTP   1
End
ListenHTTPS
    #Address 0.0.0.0
    #poundで待ち受けるIPアドレスを指定する。
    Address 192.168.0.4
    Port    443
    #秘密鍵と証明書がひとまとめになったファイルを指定する。
    Cert    "/usr/share/ssl/certs/pound.pem"
    Ciphers "ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL"
    xHTTP   1
End

# Catch-all server(s)
Service
    BackEnd
        #バックエンドで動くサーバのIPアドレスを指定する。
        Address 192.168.0.120
        Port    80
        #優先度を1から9で指定する。数字が大きいほど優先度が高くなる。
        Priority 1
    End
    BackEnd
        Address 192.168.0.121
        Port    80
        Priority 1
    End
    Session
        #セッションの保持時間を秒単位で指定する。
        #ベーシック認証のほか、クッキーなども指定できるようだ。
        Type    BASIC
        TTL     300
    End
End

設定ファイルはここまで。


■■ 証明書作成

# cd /usr/share/ssl/certs/

まずはpound.pemのバックアップを取ります。

# cp -p pound.pem pound.pem.orig
# echo -n "" > pound.pem

■ 秘密鍵の生成

# openssl genrsa -des3 -out server-key.pem 1024

■ CSRの生成

# openssl req -new -key server-key.pem -out server-csr.pem

■ 秘密鍵からパスフレーズを取り除く

# cp -p server-key.pem server-key.pem.orig
# openssl req -text -noout -in server-csr.pem

■ 証明書作成

# openssl x509 -in server-csr.pem -out server-crt.pem -req -signkey server-key.pem

■ 秘密鍵と証明書をひとつのファイルにまとめる

# cat server-key.pem > pound.pem
# cat server-crt.pem >> pound.pem


■■ 起動前の確認

poundを起動する前に、poundコマンドの引数に-cをつけて、設定の確認をします。

# pound -c
starting...
Config file /etc/pound/pound.cfg is OK

このように表示されたら、設定ファイルの書式はあっています。
設定ファイルの書式が間違っていると
# pound -c
starting...
line 7: unknown directive "ListenHTTTP " - aborted
というように、設定ファイルの行番号つきで「ここ間違ってるぞ」と教えてくれます。

また、Certファイルが壊れていても
# pound -c
starting...
line 17: SSL_CTX_use_certificate_chain_file "/usr/share/ssl/certs/pound.pem" failed - aborted
error:0906D064:PEM routines:PEM_read_bio:bad base64 decode
このようにエラーが出ます。


■■ pound起動

# /etc/init.d/pound start
Starting pound:                                            [  OK  ]

■■ pound自動起動設定

# chkconfig pound --list
pound           0:off   1:off   2:off   3:off   4:off   5:off   6:off

# chkconfig pound on

# chkconfig pound --list
pound           0:off   1:off   2:on    3:on    4:on    5:on    6:off


■■ テスト

2台あるバックエンドサーバのドキュメントルートに、ちょっとずつ内容の違うhtmlファイルを、同じファイル名(ここではindex.htmlとしましょう)でアップロードします。

http://192.168.0.4/
https://192.168.0.4/

にそれぞれアクセスし、何度かリロードして、違う表示が交互に出てきたら、正しく振り分けられています。勿論、規則正しく振り分けてくれるわけではありません。


■■ 運用

poundのログは、/var/log/messagesに出力されます。ここに、アクセスログが記録されます。
バックエンドにあるapacheのアクセスログのフォーマットはデフォルトで
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
と設定されていますが、この状態だと、poundが動いているサーバのIPアドレスが記録されてしまいます。なので、httpd.confの修正を行う必要があります。

ここを
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

こうする
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined


以上で、ごくごく簡単なロードバランサができました。
ね、簡単でしょ?

これからしばらく家をあけるので、apacheのプロセス監視をどうしようかと考えていたのです。
数日はネットに繋がる環境にいられないけど、せめてapacheのダウンと復旧くらいは把握したいなー・・・
というのと、落ちっぱなしのときにずーっとメールがくるのはウザいなー・・・という思いから、以下の要件で監視スクリプトを作りました。

1. apacheのプロセスが落ちたら2回まで通知。3回目以降は無視。
2. apacheのプロセスが復旧したら通知(どれだけ落ちていたかは問わない)。
3. 無論、何もなければ通知しない。

なお、今回apacheを立ち上げなおすのは要件として含めていません。
監視スクリプトはcronで定期的に起動し、1回落ちたのか、2回以上連続して落ちているのかは、
カウントファイルを生成して数えることにします。また、apacheが復旧したら、カウントファイルは削除します。

$ touch watcher_httpd.sh
$ chmod 755 watcher_httpd.sh

$ vi watcher_httpd.sh
#!/bin/sh

ADMIN=【携帯のメールアドレス】
APID="/usr/sbin/httpd"

# フラグファイルを格納するディレクトリがなければ作成する
if [ ! -d "dat" ];
        then
                mkdir dat
fi

# httpdの親プロセスをつかまえる
if [ 1 -eq `ps auxwww | grep $APID | grep ^root | wc -l` ];
        # httpdが生きているときの処理
        then
        # httpdが2回以上落ちてから復旧したときの処理
        if [ -f "dat/count1_httpd" ];
                then
                # httpd復旧アラートメールを飛ばし、カウントファイルをすべて削除する
                echo $(date)$'\n''httpd is Allived Again' | mail -s "$APID is Allived Again" $ADMIN
                rm -f dat/count*_httpd
        else
        # httpdが1回だけ落ちてから復旧したときの処理
        if [ -f "dat/count0_httpd" ];
                then
                echo $(date)$'\n''httpd is Allived Again' | mail -s "$APID is Allived Again" $ADMIN
                rm -f dat/count0_httpd
                else
                :
        fi
        fi

        # httpdが落ちたときの処理
        else
        if [ ! -f "dat/count0_httpd" ];
                # はじめてhttpdが落ちたときの処理
                then
                echo $(date)$'\n''httpd is FAILED' | mail -s "$APID is FAILED" $ADMIN
                touch dat/count0_httpd
                # 2回目の通知処理
                else
                if [ ! -f "dat/count1_httpd" ];
                then
                echo $(date)$'\n''httpd is FAILED Again!!!' | mail -s "$APID is FAILED Again!!!" $ADMIN
                touch dat/count1_httpd
                fi
        fi
fi

ここまで書いたら保存し、試験します。試験項目は以下の通りです。

1. apacheが動いている状態でこのスクリプトを実行し、警告メールも復旧メールも飛ばないこと。
2. apacheを落とした状態でこのスクリプトを実行し、1回目の警告メール(メール件名/本文に注目)が飛ぶこと。
3. apacheを上げてからこのスクリプトを実行し、復旧メールが飛ぶこと。
4. apacheを落とした状態でこのスクリプトを2回実行し、1回目の警告メールと2回目の警告メールが飛ぶこと。
5. さらにもう1回このスクリプトを実行し、警告メールも復旧メールも飛ばないこと。
6. apacheを上げてからこのスクリプトを実行し、復旧メールが飛ぶこと。
7. 再度apacheが上がっていることを確認し、このスクリプトを実行して警告メールも復旧メールも飛ばないこと。

以上です。
こんちわ、久々に登場 (っ´∀`)っ ゃー です。このたび引越することになったので、自宅サーバにあるコンテンツを安いVPSへ引越することにしました。移行先の管理はほとんどPLESKでできるので便利です。パッケージのインストールはコマンドラインから行うものの、ゾーン作成やバーチャルホスト作成はすべてブラウザでの作業です。

■■ 旧環境コンテンツバックアップ

あらかじめ、旧環境のコンテンツとDBをバックアップします。コンテンツは、ドキュメントルート以下をtar.gzで固めて新サーバへSCPします。DBはMySQLを使っているので、以下のようにしてダンプをとります。

$ mysqldump -u root -p 【データベース名】 > blogs.sql


■■ バーチャルホスト作成

PLESKにログイン → ログイン後のメニューから
ドメイン → Add New Domain
をクリックする

My Domains
をクリックする

Domain name    blogcube.info
        (wwwにチェックを入れる)

Proceed to hosting setup  にチェックを入れ、OKをクリックする

Warning: The domain resolves to another IP address (43.244.34.199). Please correct DNS settings.
というメッセージが出るが、まだネームサーバの移行をしていないために表示されるものなので気にしない。


Hosting type     Physical hosting

OK


SSLサポート    なし
FTPログイン    admin
PW        ********
quota        Unlimited
shell        /bin/bash

以下にチェックを入れる
SSI support
PHP support    safeモードのチェックははずす
CGI support
Perl support
Python support
FastCGI support
Web statistics    Webalizer

OK


■■ DB作成

PLESKから
ドメイン → blogcube.info → Databases → Add new database
の順にクリックする

Database name    blogs
OK

Database name というアイコンができるのでクリックし、ユーザを作る


■■ blogcubeのコンテンツとダンプしたDBを持ってくる

[root@hogehoge ~]# cd /var/www/vhosts/blogcube.info/private
[root@hogehoge private]# scp admin@43.244.34.199:/home/admin/admin.* ./
[root@hogehoge private]# chown admin. admin.*


■■ コンテンツを解凍する

[root@hogehoge private]# tar xvzf blogs.tar.gz
[root@hogehoge private]# chown -R admin. blogs


■■ 解凍したコンテンツをコピーする

[root@hogehoge private]# cd ../httpdocs/
[root@hogehoge httpdocs]# cp -pr ../private/blogs/* ./


■■ CGIをcgi-binディレクトリに移す

[root@hogehoge httpdocs]# cp -p *.cgi ../cgi-bin/


■■ mt-config.cgi を修正する

旧環境では、ドキュメントルート以下のどこでもCGIが使えましたが、今借りているVPSではcgi-binディレクトリが別にあるので、mt-config.cgiのCGIPathを書き換えてやる必要があります。

[root@hogehoge httpdocs]# cp -p mt-config.cgi mt-config.cgi.20080320
[root@hogehoge httpdocs]# vi mt-config.cgi

ここを
CGIPath    http://www.blogcube.info/

こうする
CGIPath    http://www.blogcube.info/cgi-bin/


[root@hogehoge httpdocs]# diff mt-config.cgi mt-config.cgi.20080320
17c17
< CGIPath    http://www.blogcube.info/cgi-bin/
---
> CGIPath    http://www.blogcube.info/


■■ mt-check.cgi を見ながら足りないモジュールをインストールする

HOSTSを書いてから
http://www.blogcube.info/cgi-bin/mt-check.cgi
にアクセスし、足りないモジュールを追加する。


■ Image::Size

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-Image-Size

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-Image-Size         noarch     3.1.1-1.el4.rf   rpmforge           40 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 40 k
Is this ok [y/N]: y


■ SOAP::Lite (version >= 0.5)

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-SOAP-Lite

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-SOAP-Lite          noarch     0.71-1.el4.rf    rpmforge          426 k
Installing for dependencies:
 perl-Authen-SASL        noarch     2.10-1.el4.rf    rpmforge           41 k
 perl-GSSAPI             x86_64     0.26-1.el4.rf    rpmforge          120 k
 perl-MIME-Lite          noarch     3.021-1.el4.rf   rpmforge           94 k
 perl-MailTools          noarch     2.02-1.el4.rf    rpmforge           98 k
 perl-Net-Jabber         noarch     2.0-1.2.el4.rf   rpmforge          124 k
 perl-Net-XMPP           noarch     1.02-1.el4.rf    rpmforge          126 k
 perl-XML-Stream         noarch     1.22-1.2.el4.rf  rpmforge           77 k

Transaction Summary
=============================================================================
Install      8 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 1.1 M
Is this ok [y/N]: y


■ Image::Magick

[root@hogehoge ~]# yum --enablerepo=rpmforge install ImageMagick-perl

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 ImageMagick-perl        x86_64     6.2.8.0-3.el5.4  base              146 k
Installing for dependencies:
 GConf2                  x86_64     2.14.0-9.el5     base              1.5 M
 ImageMagick             x86_64     6.2.8.0-3.el5.4  base              3.3 M
 ORBit2                  x86_64     2.14.3-4.el5     base              262 k
 audiofile               x86_64     1:0.2.6-5        base              107 k
 avahi                   x86_64     0.6.16-1.el5     base              256 k
 avahi-glib              x86_64     0.6.16-1.el5     base               14 k
 chkfontpath             x86_64     1.10.1-1.1       base               15 k
 cryptsetup-luks         x86_64     1.0.3-2.2.el5    base              619 k
 dbus-glib               x86_64     0.70-5           base              154 k
 dbus-python             x86_64     0.70-7.el5       base              187 k
 esound                  x86_64     1:0.2.36-3       base              130 k
 gamin                   x86_64     0.1.7-8.el5      base              126 k
 ghostscript             x86_64     8.15.2-9.1.el5_1.1  updates           5.9 M
 ghostscript-fonts       noarch     5.50-13.1.1      base              801 k
 gnome-keyring           x86_64     0.6.0-1.fc6      base              166 k
 gnome-mime-data         x86_64     2.4.2-3.1        base              691 k
 gnome-mount             x86_64     0.5-3.el5        base               70 k
 gnome-vfs2              x86_64     2.16.2-4.el5     base              1.3 M
 hal                     x86_64     0.5.8.1-25.el5_1.1  updates           362 k
 hwdata                  noarch     0.211-1          base              278 k
 kbd                     x86_64     1.12-19.el5      base              1.0 M
 lcms                    x86_64     1.15-1.2.2       base              170 k
 libFS                   x86_64     1.0.0-3.1        base               30 k
 libIDL                  x86_64     0.8.7-1.fc6      base               87 k
 libXfont                x86_64     1.2.2-1.0.3.el5_1  updates           246 k
 libXres                 x86_64     1.0.1-3.1        base               14 k
 libbonobo               x86_64     2.16.0-1.fc6     base              521 k
 libbonoboui             x86_64     2.16.0-1.fc6     base              394 k
 libcroco                x86_64     0.6.1-2.1        base              129 k
 libdaemon               x86_64     0.10-5.el5       base               24 k
 libfontenc              x86_64     1.0.2-2.2.el5    base               19 k
 libglade2               x86_64     2.6.0-2          base               96 k
 libgnome                x86_64     2.16.0-6.el5     base              860 k
 libgnomecanvas          x86_64     2.14.0-4.1       base              224 k
 libgnomeui              x86_64     2.16.0-5.el5     base              984 k
 libgsf                  x86_64     1.14.1-6.1       base              113 k
 libnotify               x86_64     0.4.2-6.el5      base               38 k
 librsvg2                x86_64     2.16.1-1.el5     base              178 k
 libvolume_id            x86_64     095-14.9.el5     base               37 k
 libwmf                  x86_64     0.2.8.4-10.1     base              821 k
 libwnck                 x86_64     2.16.0-4.fc6     base              185 k
 notification-daemon     x86_64     0.3.5-8.el5      base               48 k
 pciutils                x86_64     2.2.3-4          base               79 k
 pm-utils                x86_64     0.99.3-6.el5.centos.17  base              131 k
 shared-mime-info        x86_64     0.19-3.el5       base              148 k
 startup-notification    x86_64     0.8-4.1          base               32 k
 ttmkfdir                x86_64     3.0.9-23.el5     base               46 k
 urw-fonts               noarch     2.3-6.1.1        base              4.5 M
 xorg-x11-font-utils     x86_64     1:7.1-2          base               77 k
 xorg-x11-xfs            x86_64     1:1.0.2-4        base               73 k

Transaction Summary
=============================================================================
Install     51 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 28 M
Is this ok [y/N]: y


■ Crypt::DSA

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-Crypt-DSA

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-Crypt-DSA          noarch     0.14-1.el4.rf    rpmforge           35 k
Installing for dependencies:
 perl-Convert-ASN1       noarch     0.20-1.1         base               42 k
 perl-Convert-PEM        noarch     0.07-1.2.el4.rf  rpmforge           19 k
 perl-Data-Buffer        noarch     0.04-1.2.el4.rf  rpmforge           13 k

Transaction Summary
=============================================================================
Install      4 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 109 k
Is this ok [y/N]: y


■ XML::Atom

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-XML-Atom

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-XML-Atom           noarch     0.23-1.el4.rf    rpmforge           46 k
Installing for dependencies:
 perl-Class-Singleton    x86_64     1.03-1.2.el4.rf  rpmforge           14 k
 perl-DateTime           x86_64     0.42-1.el4.rf    rpmforge          127 k
 perl-DateTime-Locale    noarch     0.35-1.el4.rf    rpmforge          144 k
 perl-DateTime-TimeZone  noarch     0.6904-1.el4.rf  rpmforge          397 k
 perl-Params-Validate    x86_64     0.89-1.el4.rf    rpmforge          107 k

Transaction Summary
=============================================================================
Install      6 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 836 k
Is this ok [y/N]: y


[root@hogehoge ~]# yum install perl-XML-Parser

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-XML-Parser         x86_64     2.34-6.1.2.2.1   base              210 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 210 k
Is this ok [y/N]: y


[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-XML-XPath

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-XML-XPath          noarch     1.13-2.2.el4.rf  rpmforge           81 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 81 k
Is this ok [y/N]: y


■ Cache::Memcached

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-Cache-Memcached

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-Cache-Memcached    noarch     1.24-1.el4.rf    rpmforge           26 k
Installing for dependencies:
 perl-String-CRC32       x86_64     1.4-2.fc6        base               13 k

Transaction Summary
=============================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 39 k
Is this ok [y/N]: y


■ IO::Compress::Gzip

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-PerlIO-gzip

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-PerlIO-gzip        x86_64     0.18-1.el4.rf    rpmforge           44 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 44 k
Is this ok [y/N]: y


[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-IO-Compress-Base

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-IO-Compress-Base   noarch     2.008-1.el4.rf   rpmforge           54 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 54 k
Is this ok [y/N]: y


■ IO::Compress::Gzip IO::Uncompress::Gunzip

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-IO-Compress-Zlib

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-IO-Compress-Zlib   noarch     2.008-1.el4.rf   rpmforge          137 k
Installing for dependencies:
 perl-Compress-Raw-Zlib  x86_64     2.008-1.el4.rf   rpmforge          171 k

Transaction Summary
=============================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 308 k
Is this ok [y/N]: y


■ Archive::Zip

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-Archive-Zip

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-Archive-Zip        noarch     1.23-1.el4.rf    rpmforge          112 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 112 k
Is this ok [y/N]: y


■ XML::SAX

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-XML-SAX

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-XML-SAX            noarch     0.16-1.el4.rf    rpmforge           77 k
Installing for dependencies:
 perl-XML-NamespaceSupport  noarch     1.09-1.2.1       base               15 k

Transaction Summary
=============================================================================
Install      2 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 93 k
Is this ok [y/N]: y


■ Mail::Sendmail

[root@hogehoge ~]# yum --enablerepo=rpmforge install perl-Mail-Sendmail

Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 perl-Mail-Sendmail      noarch     0.79-1.2.el4.rf  rpmforge           23 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)

Total download size: 23 k
Is this ok [y/N]: y


これで全てOK


■■ プラグインなどをcgi-binにコピー

[root@hogehoge ~]# cd /var/www/vhosts/blogcube.info/httpdocs
[root@hogehoge httpdocs]# cp -rp ./`ls -lA | egrep ^d | awk '{print $9}' | egrep -v '(test|nullpopopo|revenge)'` ../cgi-bin/


■■ mt-config.cgi を修正する

ここを
CGIPath    http://www.blogcube.info/

こうする
CGIPath    http://www.blogcube.info/cgi-bin/


■■ エラー修正

/var/www/vhosts/blogcube.info/statistics/logs/error_log をtailしていると
[Wed Mar 19 23:51:09 2008] [error] [client 43.244.34.199] Premature end of script headers: mt.cgi
[Wed Mar 19 23:51:27 2008] [error] [client 43.244.34.199] Premature end of script headers: mt-config.cgi
と表示される。

なので、
[root@hogehoge cgi-bin]# cd ..
[root@hogehoge blogcube.info]# chmod 755 cgi-bin

そして、プログラムが書き込みを行えるように
[root@hogehoge blogcube.info]# chmod 777 httpdocs/


■■ ブログを作成する

http://www.blogcube.info/cgi-bin/mt.cgi


■■ まだ今までのブログが見えないので、sqlを流し込む

[root@hogehoge blogcube.info]# cd private/
[root@hogehoge private]# mysql -u blogs -p blogs < blogs.sql


■■ リンクテスト

ひととおり、ダッシュボードのリンクをクリックして問題ないことを確認した


■■ サブドメイン作成

PLESKから、サブドメインを作成する。作るのは以下のもの。

revenge
nullpopopo


■ サブドメインから余計なものを削除する

[root@hogehoge ~]# rm -fr /var/www/vhosts/blogcube.info/subdomains/revenge/httpdocs/*
[root@hogehoge ~]# rm -fr /var/www/vhosts/blogcube.info/subdomains/nullpopopo/httpdocs/*


■ サブドメインのディレクトリにコンテンツをコピーする

[root@hogehoge ~]# cp -pr /var/www/vhosts/blogcube.info/httpdocs/revenge/* /var/www/vhosts/blogcube.info/subdomains/revenge/httpdocs/
[root@hogehoge ~]# cp -pr /var/www/vhosts/blogcube.info/httpdocs/nullpopopo/* /var/www/vhosts/blogcube.info/subdomains/nullpopopo/httpdocs/


■■ サイトパスを変更する

それぞれのブログごとに、サイトパスを変更後、再構築をする。

■ nullpopopo

old    /home/admin/public_html/blogcube/nullpopopo/
new    /var/www/vhosts/blogcube.info/subdomains/nullpopopo/httpdocs/


■ revenge

old    /home/admin/public_html/blogcube/revenge/
new    /var/www/vhosts/blogcube.info/subdomains/revenge/httpdocs/


■ www

old    /home/admin/public_html/blogcube
new    /var/www/vhosts/blogcube.info/httpdocs


■■ 更新テスト

更新先のほうで、エントリを投稿し、hostsを書いたブラウザから見て反映されていて、かつ、hostsをコメントアウトしたら更新が反映されなくなることを確認する。


■■ ネームサーバ移転

バリュードメインで、ネームサーバをVPSサーバに向ける。そして、旧サーバからblogcube.infoのゾーンを削除し、再度ブラウザで確認する。

以上、終了。

久々のサーバ構築案件なので、忘れんようにメモ。
今回作成するホスト www.example.com はバーチャルホストとして作ります。
そして、 www.example.com のFTPアカウントはMySQLで管理します。
今後、FTPアカウントの管理やバーチャルホストのconfigはプログラムにやらせたいなー。

■■ webスペースの領域作成

FTPアカウントは今後MySQLに管理させます。ここのUID/GIDは、UNIXアカウントとは別物です。
FTPアカウントをMySQLに管理させる方法は次のエントリに書きます。乞うご期待!

[root@hoge ~]# mkdir /home/vhost
[root@hoge ~]# mkdir -p /home/vhost/www.example.com/{html,cgi-bin,logs,auth}
[root@hoge ~]# chown -R 1000:1000 /home/vhost/


■■ apache インストール

[root@hoge ~]# yum install httpd mod_ssl
(中略)
Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 httpd                   i386       2.0.52-38.ent.centos4.2  update            891 k
 mod_ssl                 i386       1:2.0.52-38.ent.centos4.2  update            100 k
Installing for dependencies:
 apr                     i386       0.9.4-24.9       base               93 k
 apr-util                i386       0.9.4-21         base               51 k
 distcache               i386       1.4.5-6          base              111 k
 httpd-suexec            i386       2.0.52-38.ent.centos4.2  update             30 k

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


■■ php5のインストール

通常、CentOS4.x系では、yumコマンドでphpをインストールしようとすると、
PHP4系がインストールされます。しかし、もうサポート終わってるので
(セキュリティサポートは2008年8月まで)
centosplusリポジトリを一時的に有効にしてやってPHP5をインストールしてやります。

[root@hoge ~]# yum --enablerepo=centosplus install php
(中略)
Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 php                     i386       5.1.6-3.el4s1.8  centosplus        1.1 M
Installing for dependencies:
 curl                    i386       7.12.1-11.el4    base              230 k
 libidn                  i386       0.5.6-1          base              169 k
 php-cli                 i386       5.1.6-3.el4s1.8  centosplus        2.0 M
 php-common              i386       5.1.6-3.el4s1.8  centosplus        136 k

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


■ さらに、pearもcentosplus経由でインストールする

[root@hoge ~]# yum --enablerepo=centosplus install php-pear
(中略)
Dependencies Resolved

=============================================================================
 Package                 Arch       Version          Repository        Size
=============================================================================
Installing:
 php-pear                noarch     1:1.4.11-1.el4s1.1  centosplus        345 k

Transaction Summary
=============================================================================
Install      1 Package(s)
Update       0 Package(s)
Remove       0 Package(s)
Total download size: 345 k
Is this ok [y/N]: y


■ pearが有効になっているか確認する

[root@hoge ~]# pear list
Installed packages, channel pear.php.net:
=========================================
Package        Version State
Archive_Tar    1.3.1   stable
Console_Getopt 1.2     stable
PEAR           1.4.11  stable
XML_RPC        1.5.1   stable


■■ apacheの設定を修正する

■ httpd.confを修正する

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

#---- ServerTokensディレクティブでの表示を最小限にするため
#---- ここを
#---- ServerTokens OS
#----
#---- こうする
#---- #ServerTokens OS
#---- ServerTokens Prod

#---- サーバ管理者のメールアドレスを変更するため
#---- ここを
#---- ServerAdmin root@localhost
#----
#---- こうする
#---- #ServerAdmin root@localhost
#---- ServerAdmin webmaster@hoge.example.com

#---- すべてvirtualhostで管理するので、以下をコメントアウトする
#----
#---- ここを
#---- DocumentRoot "/var/www/html"
#---- こうする
#---- #DocumentRoot "/var/www/html"
#----
#---- ここを
#---- <Directory />
#----     Options FollowSymLinks
#----     AllowOverride None
#---- </Directory>
#----
#---- こうする
#---- #<Directory />
#---- #    Options FollowSymLinks
#---- #    AllowOverride None
#---- #</Directory>
#----
#---- ここを
#---- <Directory "/var/www/html">
#----
#---- #
#---- # Possible values for the Options directive are "None", "All",
#---- # or any combination of:
#---- #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#---- #
#---- # Note that "MultiViews" must be named *explicitly* --- "Options All"
#---- # doesn't give it to you.
#---- #
#---- # The Options directive is both complicated and important.  Please see
#---- # http://httpd.apache.org/docs-2.0/mod/core.html#options
#---- # for more information.
#---- #
#----     Options Indexes FollowSymLinks
#----
#---- #
#---- # AllowOverride controls what directives may be placed in .htaccess files.
#---- # It can be "All", "None", or any combination of the keywords:
#---- #   Options FileInfo AuthConfig Limit
#---- #
#----     AllowOverride None
#----
#---- #
#---- # Controls who can get stuff from this server.
#---- #
#----     Order allow,deny
#----     Allow from all
#----
#---- </Directory>
#----
#---- こうする
#---- ##### comented by nullpopopo 2008/02/10
#---- #<Directory "/var/www/html">
#---- #
#---- ##
#---- ## Possible values for the Options directive are "None", "All",
#---- ## or any combination of:
#---- ##   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
#---- ##
#---- ## Note that "MultiViews" must be named *explicitly* --- "Options All"
#---- ## doesn't give it to you.
#---- ##
#---- ## The Options directive is both complicated and important.  Please see
#---- ## http://httpd.apache.org/docs-2.0/mod/core.html#options
#---- ## for more information.
#---- ##
#---- #    Options Indexes FollowSymLinks
#---- #
#---- ##
#---- ## AllowOverride controls what directives may be placed in .htaccess files.
#---- ## It can be "All", "None", or any combination of the keywords:
#---- ##   Options FileInfo AuthConfig Limit
#---- ##
#---- #    AllowOverride None
#---- #
#---- ##
#---- ## Controls who can get stuff from this server.
#---- ##
#---- #    Order allow,deny
#---- #    Allow from all
#---- #
#---- #</Directory>

#---- userdirを使わないので無効にする
#----
#---- ここを
#---- <IfModule mod_userdir.c>
#----     #
#----     # UserDir is disabled by default since it can confirm the presence
#----     # of a username on the system (depending on home directory
#----     # permissions).
#----     #
#----     UserDir disable
#----
#----     #
#----     # To enable requests to /~user/ to serve the user's public_html
#----     # directory, remove the "UserDir disable" line above, and uncomment
#----     # the following line instead:
#----     #
#----     #UserDir public_html
#----
#---- </IfModule>
#----
#---- こうする
#---- ##### comented by nullpopopo 2008/02/10
#---- #<IfModule mod_userdir.c>
#---- #    #
#---- #    # UserDir is disabled by default since it can confirm the presence
#---- #    # of a username on the system (depending on home directory
#---- #    # permissions).
#---- #    #
#---- #    UserDir disable
#---- #
#---- #    #
#---- #    # To enable requests to /~user/ to serve the user's public_html
#---- #    # directory, remove the "UserDir disable" line above, and uncomment
#---- #    # the following line instead:
#---- #    #
#---- #    #UserDir public_html
#---- #
#---- #</IfModule>
#----

#---- ServerSignatureをOffにしてApache が生成したドキュメント中の情報を抑制する
#----
#---- ここを
#---- ServerSignature On
#----
#---- こうする
#---- #ServerSignature On
#---- ServerSignature Off

#---- WebDAVを使わないので無効にする
#----
#---- ここを
#---- #
#---- # WebDAV module configuration section.
#---- #
#---- <IfModule mod_dav_fs.c>
#----     # Location of the WebDAV lock database.
#----     DAVLockDB /var/lib/dav/lockdb
#---- </IfModule>
#----
#---- こうする
#---- ##
#---- ## WebDAV module configuration section.
#---- ##
#---- #<IfModule mod_dav_fs.c>
#---- #    # Location of the WebDAV lock database.
#---- #    DAVLockDB /var/lib/dav/lockdb
#---- #</IfModule>

#---- /var/www/cgi-bin/ を使わないので無効にする
#----
#---- ここを
#---- #
#---- # ScriptAlias: This controls which directories contain server scripts.
#---- # ScriptAliases are essentially the same as Aliases, except that
#---- # documents in the realname directory are treated as applications and
#---- # run by the server when requested rather than as documents sent to the client.
#---- # The same rules about trailing "/" apply to ScriptAlias directives as to
#---- # Alias.
#---- #
#---- ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#----
#---- #
#---- # "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
#---- # CGI directory exists, if you have that configured.
#---- #
#---- <Directory "/var/www/cgi-bin">
#----     AllowOverride None
#----     Options None
#----     Order allow,deny
#----     Allow from all
#---- </Directory>
#----
#---- こうする
#---- ##
#---- ## ScriptAlias: This controls which directories contain server scripts.
#---- ## ScriptAliases are essentially the same as Aliases, except that
#---- ## documents in the realname directory are treated as applications and
#---- ## run by the server when requested rather than as documents sent to the client.
#---- ## The same rules about trailing "/" apply to ScriptAlias directives as to
#---- ## Alias.
#---- ##
#---- #ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#---- #
#---- ##
#---- ## "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
#---- ## CGI directory exists, if you have that configured.
#---- ##
#---- #<Directory "/var/www/cgi-bin">
#---- #    AllowOverride None
#---- #    Options None
#---- #    Order allow,deny
#---- #    Allow from all
#---- #</Directory>

#---- 言語設定のUTF-8固定を無効にする
#----
#---- ここを
#---- AddDefaultCharset UTF-8
#----
#---- こうする
#---- #AddDefaultCharset UTF-8
#---- AddDefaultCharset Off

#---- 最終行に、バーチャルホスト用のディレクトリをincludeする設定を書く
#----
#---- Include conf/vconf.d/*.conf

ここまで終わったらhttpd.confを保存します。

■ vconf.d 作成

[root@hoge conf]# pwd
/etc/httpd/conf
[root@hoge conf]# mkdir vconf.d


■ vconf.d にダミー用ホストのconfigを書く

[root@hoge conf]# cd vconf.d
[root@hoge vconf.d]# vi www.example.com.conf
<VirtualHost 192.168.0.110:80>
    DocumentRoot /home/vhost/www.example.com/html
    ServerName www.example.com
    ErrorLog /home/vhost/www.example.com/logs/error.log
    CustomLog /home/vhost/www.example.com/logs/access.log combined

    <Directory /home/vhost/www.example.com/html>
        Options Indexes FollowSymlinks MultiViews
        AllowOverride Fileinfo AuthConfig
        #AllowOverride All
        order allow,deny
        Allow from all
    </Directory>

    ScriptAlias /cgi-bin /home/vhost/www.example.com/cgi-bin
    <Directory /home/vhost/www.example.com/cgi-bin>
        Options ExecCGI
        AllowOverride Fileinfo AuthConfig
        order allow,deny
        Allow from all
    </Directory>

</VirtualHost>


■ ダミー用ホストのコンテンツディレクトリにテストファイルを置く

[root@hoge vconf.d]# cd /home/vhost/www.example.com/
[root@hoge www.example.com]# basename `pwd` > html/index.html

[root@hoge www.example.com]# vi html/phpinfo.php
<?php
  phpinfo();
?>

[root@hoge www.example.com]# cd cgi-bin/
[root@hoge cgi-bin]# vi test.cgi
#!/usr/bin/perl

print "Content-type: text/html\n\n";
print "<html><body>test</body></html>";

[root@hoge cgi-bin]# chmod 755 test.cgi
[root@hoge cgi-bin]# cd ../
[root@hoge www.example.com]# chown -R webmaster. *


■■ apacheの設定確認と起動

■ 設定確認

[root@hoge www.example.com]# cd
[root@hoge ~]# httpd -t -D DUMP_VHOSTS
VirtualHost configuration:
192.168.0.110:80       www.example.com (/etc/httpd/conf/vconf.d/www.example.com.conf:1)
wildcard NameVirtualHosts and _default_ servers:
_default_:443          hoge.example.com (/etc/httpd/conf.d/ssl.conf:88)
Syntax OK


■ 起動

[root@hoge ~]# /etc/init.d/httpd start
Starting httpd:                                            [  OK  ]


■ 自動起動設定

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

[root@hoge ~]# chkconfig httpd on

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


■ エラーログ確認

[root@hoge ~]# cat /var/log/httpd/error_log
[Sun Feb 10 13:26:43 2008] [notice] suEXEC mechanism enabled (wrapper: /usr/sbin/suexec)
[Sun Feb 10 13:26:44 2008] [notice] Digest: generating secret for digest authentication ...
[Sun Feb 10 13:26:44 2008] [notice] Digest: done
[Sun Feb 10 13:26:44 2008] [notice] LDAP: Built with OpenLDAP LDAP SDK
[Sun Feb 10 13:26:44 2008] [notice] LDAP: SSL support unavailable
[Sun Feb 10 13:26:45 2008] [notice] Apache configured -- resuming normal operations


■■ クライアントのHOSTSファイルで名前解決をして、ブラウザでアクセスする

[hostsへ以下のように書く]
192.168.0.2    www.example.com

[ブラウザで以下のURLにアクセスする]
http://www.example.com/
http://www.example.com/phpinfo.php
http://www.example.com/cgi-bin/test.cgi

.htaccessを使った、アクセス制限やリファラ制限、指定されたサイト以外からの直リンク禁止を
一発でジェネレートしてくれるサイトがあった。

mod_rewriteで他所のサイトにブッ飛ばすのも、コレの応用でできると思われる。
実例は帰ってから書くとするか。。。はよ帰りたい。
カスタム検索

カレンダー