タグ・アーカイブ: apache

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/bash

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&
nbsp;      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        &nbs
p;     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)
Remo
ve       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    &nbs
p;  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/re
venge/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@ho
ge 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"
#----
#---- ここを
#----
#----     Options FollowSymLinks
#----     AllowOverride None
#----

#----
#---- こうする
#---- #
#---- #    Options FollowSymLinks
#---- #    AllowOverride None
#---- #

#----
#---- ここを
#----
#----
#---- #
#---- # 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
#----
#----

#----
#---- こうする
#---- ##### comented by nullpopopo 2008/02/10
#---- #
#---- #
#---- ##
#---- ## 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
#---- #
#---- #

#---- userdirを使わないので無効にする
#----
#---- ここを
#----
#----     #
#----     # 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
#----
#----

#----
#---- こうする
#---- ##### comented by nullpopopo 2008/02/10
#---- #
#---- #    #
#---- #    # 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
#---- #
#---- #

#----

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

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

#----
#---- こうする
#---- ##
#---- ## WebDAV module configuration section.
#---- ##
#---- #
#---- #    # Location of the WebDAV lock database.
#---- #    DAVLockDB /var/lib/dav/lockdb
#---- #

#---- /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.
#---- #
#----
#----     AllowOverride None
#----     Options None
#----     Order allow,deny
#----     Allow from all
#----

#----
#---- こうする
#---- ##
#---- ## 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 trai
ling "/" 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.
#---- ##
#---- #
#---- #    AllowOverride None
#---- #    Options None
#---- #    Order allow,deny
#---- #    Allow from all
#---- #

#---- 言語設定の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

    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

   
        Options Indexes FollowSymlinks MultiViews
        AllowOverride Fileinfo AuthConfig
        #AllowOverride All
        order allow,deny
        Allow from all
   

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

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

[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
  phpinfo();
?>

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

print "Content-type: text/htmlnn";
print "test";

[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