このエントリーをはてなブックマークに追加
スポンサーリンク

CentOS6.3のインストール

DVDからインストール

まず、公式サイトに行き、CentOS-6.3-x86_64-bin-DVD1.isoとCentOS-6.3-x86_64-bin-DVD2.isoをダウンロードします。HTTPで1KBしかダウンロードできない時はFTPを選び右クリック→「フォルダにコピー」を選択します。

CentOS5.6のインストールの時に「CentOS6はまだマイナーバージョンが低いので使用を見合わせます」と書きましたが、もう.3までマイナーバージョンが進んだので、そろそろ大丈夫でしょう。(あの記事を書いた時は、ま6.0しかありませんでしたので。)

ダウンロードが終了したら、Nero8等を使ってDVD-Rに焼きます。終わったら、Disc1をセットしてサーバーにセットします。(以下、まっさらなハードディスクの入ったサーバーにインストールするものとします。)

起動時のメニューは、そのままEnterキーで良いでしょう。古いビデオカードが入っている場合、Instrall Fedora in basic graphics modeにしないと強制テキストモードにされてしまうかもしれません(未確認ですが)

CentOS5までは、私はデーターセンターで作業する事を想定して、CentOSはテキストモードでインストールを行っていました。データーセンターのサーバーラックの前でマウスを動かせる作業スペースを確保できない場合や、グラフィックスモードを表示できないディスプレイしか借りられない場合を考慮する必要があったためです。しかし、CentOS6では、テキストモードにするとハードディスクのパーティションの切り方を指定できないだけでなく、インストールするパッケージも選択できないので(注:方法があったのかもしれませんが、私は発見できませんでした)、仕方なくグラフィックスモードでインストールする事にします。

■DVDのテスト
なぜかここだけテキストモードになるので、「しまった、テキストモードになってしまった」と焦るかもしれませんが、ここを過ぎればGUIになるのでご安心を。ここで、間違ってOKをクリックしてしまうとひたすら長時間(数十分?)待たされてしまうので、うっかりOKをクリックしてしまったらリセットしてやり直します。(その方が早いです。)ここではSkipをクリックしましょう。

■パーティションの設定
sda
/boot ext4 100MB 基本パーティションにする
ソフトRAID 2048MB
ソフトRAID 950000MB

sdb
/boot2 ext4 100MB 基本パーティションにする
ソフトRAID 2048MB
ソフトRAID 950000MB

md0 ext4 / 950000MB
md1 SWAP 2048MB

基本パーティションというのはよくわかりませんが、多分、今までの「第一パーティションとして強制指定する」と同じ意味でしょう。/bootパーティションをソフトRAIDにすると、どういうわけか1/3の確率でブートローダーの書き込みに失敗してしまうので、/bootパーティションだけはソフトRAIDにしていません。後でsdbのディスクには手動でブートローダーをインストールする必要があります。でないと、運悪くsdaが故障した時にブートできなくなってしまいますので。

/パーティションは、今までは「残り全ての容量」で良かったのですが、どういうわけかCentOS6からは固定容量にしないとRAID1にできないみたいなので、仕方なく手動で固定値を指定しています。

「スワップをRAIDにする必要はないんじゃないのか?」「スワップはむしろRAID0にした方がいいのでは?」という方がいるかもしれませんが、スワップがRAID1になっていれば、運悪くスワップの領域に不良セクタが発生しても、サーバーをダウンさせずに運用を続ける事ができるので、安全のためにスワップもソフトRAIDにしています。

■パッケージの選択
パッケージの選択のところで「今すぐカスタマイズする」(英語インストールでは「Customize Now」)をクリックせずに[→次へ]を押してしまうと、もうインストールが始まってしまい、リセットするしかなくなってしまいます。

今回サーバーとして運用するので、GUI関係は全てチェックを外します。また、これはかなり個人的な好みが強いですが、apache、PHP、PostgreSQL、Sambaは.tar.gzからコンパイルする主義なのでチェックを外します。世の中のサーバーにはCDやDVDに最初から入っているバージョンをそのままずっと使い続ける人が圧倒的に多い(多分)ので、あえてCDやDVDに最初から入っているバージョンを使うのを避けています。また、.rpmができているバージョンもなるべく避けます。また、最新版の.tar.gzが出たらすぐに差し替えます。そのため、apache、PHP、PostgreSQL、SambaはCDやDVDに入っているバージョンは使いません。「そこまで言うなら他のも全部.tar.gzから入れろ」と言われそうですが、さすがに私のサーバーのインストールにかけられる時間にも限りがありますので・・・・・。

これまで、私がRedHat9からやっていた手法がなるべく使えるようにするために、レガシーUNIXの互換性にチェックを入れます。


ここで、tcp-wrappers、telnet-server、xinetdにチェックを入れます。


開発関係のパッケージは、なるべくチェックを入れておきます。

なにしろ、apacheやPHPをコンパイルする際に、なんとかlibやなんとか.soが足りないとか言われると面倒な事になりますので・・・。

あとは30分ほど放置します。「おめでとうございます。CentOSのインストールが完了しました」と表示されたら、DVDをイジェクトして「再起動」をクリックしてください。

もしここで、Missing Operation systemと表示されたら、ブートローダーの書き込み失敗です。他にも、インストール中にフリーズしてしまうなど、色々な不具合が発生する場合がありますが、大抵の場合、もう1回やり直すと直ります。これは、RedHatにしろCentOSにしろFedoraにしろSlackwareにしろ、あんまり珍しい事ではありません。そういうものだと思ってください。

もう1個のハードディスクにブートローダーをインストールする

ソフトRAIDで1番目のハードディスクが破損した場合に備えて、パラレルATAの場合はスレーブ、シリアルATAの場合はSATA2以降にブートローダーをインストールしておきます。
grub
grub> device (hd0) /dev/sdb
grub> root (hd0,0)
grub> install /grub/stage1 (hd0) /grub/stage2 p /grub/grub.conf
grub> quit

なお、これは例です。お使いの環境に合わせて読み替えてください。例えば、パラレルATAなら、/dev/hdbや/dev/hdcになります。また、/bootパーティションが2番目にある時は、(hd0,0)は(hd0,1)になると思います。

ここを参考にしました。
https://www.miraclelinux.com/technet/faq/data/00080.html

インストールコマンドの意味は、
install <stage-1> <install-disk> <stage-2> p config-file

ここを参考にしました。
http://docs.redhat.com/docs/ja-JP/Red_Hat_Enterprise_Linux/5/html/Installation_Guide/s1-grub-commands.html

外部から接続できるようにする

基本的に、サーバーはデーターセンターのラックに収めたら、あとは自社に戻ってWindows端末からtelnetの窓にコピペして設定するわけですが、自社から遠隔操作できるようになるまでは、実機で直接操作しなければなりません。

iptablesをオフにする

/etc/rc.d/init.d/iptables start
iptables -F
/etc/rc.d/init.d/iptables save

え?iptablesをオフにしちゃってていいのかって??いや、これはサーバーをラックに収めてから、自社で遠隔操作するまでの一時的な措置です。終わったらソッコーで自社に戻ってiptablesを設定しましょうね。大丈夫、iptablesなしでもtcp_wrapperさえ効いていればそう1時間、2時間で壊されるってわけじゃないですからな。(逆に1日2日放置すると危ないです)

SELinuxをオフにする
vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted
reboot
SELinuxの設定がイマイチわかりませんで、私はオフにしています。ファイアウォールはiptablesに任せましょう。

telnet-serverを有効にする
vi /etc/xinetd.d/telnet
# default: on
# description: The telnet server serves telnet sessions; it uses \
#       unencrypted username/password pairs for authentication.
service telnet
{
        flags           = REUSE
        socket_type     = stream
        wait            = no
        user            = root
        server          = /usr/sbin/in.telnetd
        log_on_failure  += USERID
        disable         = no
}
CUIの画面モードを640x480にする
/boot/grub/grub.confにvga=0x301を追加すればよいという情報があちこちにあるが、まったく変わらず。とりあえず今はあきらめ。

いや、安物のデーターセンターだと、640x480しか対応してないディスプレイしか置いてないトコがあるんですよ。(○o○○○○とか) まあ、まさか今は改善されているとは思いますけどね。一応、念のため640x480にしておくと安心なんですけどね。

ネットワークカード(NIC)を有効にする
インストール時に設定できるみたいなのですが、どこにあったのかわかりませんで、多分私が見落としたんだと思いますが・・・・。とりあえず、ここではインストール後に手動で設定するって事で。
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
HWADDR=ナイショ
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID=ナイショ
IPADDR=192.168.0.40
NETWORK=192.168.0.0
BROADCAST=192.168.0.255
NETMASK=255.255.255.0
DNS1=(ネームサーバー1)
DNS2=(ネームサーバー2)
※IPアドレス等は例です。お使いのネットワークに合わせてくださいね。
/etc/rc.d/init.d/network restart

デフォルトのゲートウェイの追加
vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=ホスト名
GATEWAY=デフォルトのゲートウェイ
telnetでログインするユーザーの追加
useradd ユーザー名
passwd ユーザー名

tcp_wrapperの設定
サーバーを自社から遠隔操作するまでは、iptablesを一時的にオフにしてしまうので、それまでの間はtcp_wrapperに食い止めておいてもらいましょう。
vi /etc/hosts.allow
#
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
vsftpd : (自社のIP) : allow
sshd : (自社のIP) : allow
in.telnetd : (自社のIP) : allow
all : all :  deny
自社のIPは間違えないようにしてください。じゃないと、自社に戻ってから操作できなくて「しまった」って事になります。なにしろ、サーバー室への入室は手続きが面倒ですからな。それに、できる事ならあんな所には入りたくないです。

なので、帰る前にサーバー室から電話して、社内の人間に接続を試してもらってくださいね。

wgetのインストール

CentOS4だと「テキストベースインターネット」というパッケージを選択すると自動的にwgetがインストールされたのですが、6.3のインストーラーでは見当たらなかったので(見落としただけかもしれませんが)、wgetを入れます。まず、wgetをネットから取得します。どうやって??いや、ですから、だからwgetで・・・。

というトホホな状態になってしまうので、wgetは実機を操作してDVDからインストールします。

cd /usr/local/src
mkdir RPMS
cd RPMS
ここでDVDをセットする
mount -rt iso9660 /dev/dvd /media
cp /media/Packages/wget-1.12-1.4.el6.x86_64.rpm .
rpm -ivh wget-1.12-1.4.el6.x86_64.rpm
umount /media
DVDを取り出す

あとは、必要なパッケージはrpmfindから取れるので、DVDは不要になると思います。

molocateのインストール

ここからはtelnetでWindows端末から遠隔で作業しているものとします。

以下は全てルート権限で操作しているものとします。そういう事をするのは良くないと思う方は、ご面倒でもrpm -ivhコマンドのようなどうしてもルートでなければならない時だけsudoコマンドを使うかsu - でルートになるようにしてください。

cd /usr/local/src/RPMS
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/mlocate-0.22.2-3.el6.x86_64.rpm
rpm -ivh mlocate-0.22.2-3.el6.x86_64.rpm
updatedb

updatedbを毎日朝4時に動かす
crontab -e
mailto=""
0 4 * * * updatedb

デフォルトの言語をEUC-JPに変更

今の時代、端末の文字コードはUTF-8と相場が決まっているのかもしれませんが、私個人としてはeucの方が都合が良いので、eucにします。そういうこだわりのない人は、この設定は必要ありません。

vi /etc/sysconfig/i18n
LANG="ja_JP.eucJP"
SUPPORTED="ja_JP.UTF-8:ja_JP:ja"
SYSFONT="latarcyrheb-sun16"
vi /etc/man.config
PAGER /bin/more
man ls
で、ページャーが正しく動作する事を確認します。

終わったら、いったんtelnetを抜けて、Poderosa等のターミナルソフトの文字コードをEUCに変更してログインしなおしてください。

ホスト名の設定

ホスト名の設定
hostname ホスト名

自ホスト名を逆引きさせます。
vi /etc/hosts
# Do not remove the following line, or various programs
# that require network functionality will fail.
127.0.0.1 localhost.localdomain localhost
192.168.0.40  ホスト名
ping ホスト名
自分にpingを打つか確認してください。

自ホスト名を逆引きさせていないと、/etc/rc.d/init.d/sendmail startとやってもsendmailが起動しません。

vsftpdをxinetd経由に変更する

スタンドアロンのvsftpdを止める。
/etc/rc.d/init.d/vsftpd stop
chkconfig vsftpd off

vi /etc/xinetd.d/ftp
# default: on
# description: The ftp server serves ftp sessions; it uses \
# unencrypted username/password pairs for authentication.
service ftp
{
	instances = 200
	flags = REUSE
	socket_type = stream
	wait = no
	user = root
	server = /usr/sbin/vsftpd
	server_args = /etc/vsftpd/vsftpd.conf
	log_on_failure += USERID
	disable = no
}
vi /etc/vsftpd/vsftpd.conf
変更のある箇所だけ
anonymous_enable=NO
chroot_local_user=YES
listen=NO
/etc/rc.d/init.d/xinetd restart

動作確認
cd /usr/local/src/RPMS
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/ftp-0.17-51.1.el6.x86_64.rpm
rpm -ivh ftp-0.17-51.1.el6.x86_64.rpm
ftp localhost
ユーザー名とパスワードを入れる。

Fedora17にあった「listen_ipv6=NOを追加しないとxinetd経由で起動しない」「500 OOPS: vsftpd: refusing to run with writable root inside chroot()というエラーが出る」という問題は、CentOS6.3に入ってるvsftpdには発生しないようです。ただし、今後CentOSのバージョンが進むと、同様の問題が発生するかもしれません。

シスログローテーションの設定

vi /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly

# keep 4 weeks worth of backlogs
rotate 30

# create new (empty) log files after rotating old ones
create

# uncomment this if you want your log files compressed
compress

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d

# no packages own wtmp -- we'll rotate them here
/var/log/wtmp {
    monthly
    create 0664 root utmp
    rotate 1
}
シスログローテーションの動作確認
/etc/logrotate.confや、/etc/logrotate.d/内のファイルをいじった時は、必ず
logrotate -d /etc/logrotate.conf
として、エラーがない事を確認します。でないと、エラーがあるのを放置すると、ローテーションがまったく行われず、apacheのログが2Gオーバーしてapacheが止まってしまう可能性があります。

sendmailのチューニング

RedHat9やCentOS4の頃は、標準で入っているパッケージがi686ではなくi386で最適化されていたため、sendmailを再コンパイルしてi686用に最適化していました。今は最初から、32ビット版ではi686、64ビット版ではx86_64用に最適化したパッケージが入っているので、必要はないでしょう。しかし、一応私は以前からの名残りで最適化を行っています。特に意味はありません。

依存性の解決
cd /usr/local/src/RPMS
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/tcp_wrappers-devel-7.6-57.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/hesiod-3.1.0-19.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/hesiod-devel-3.1.0-19.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/ghostscript-8.70-14.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/ghostscript-fonts-5.50-23.1.el6.noarch.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/urw-fonts-2.4-10.el6.noarch.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/xorg-x11-font-utils-7.2-11.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/libXfont-1.4.1-2.el6_1.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/libfontenc-1.0.5-2.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/procmail-3.22-25.1.el6.x86_64.rpm
rpm -ivh tcp_wrappers-devel-7.6-57.el6.x86_64.rpm
rpm -ivh hesiod-3.1.0-19.el6.x86_64.rpm hesiod-devel-3.1.0-19.el6.x86_64.rpm
rpm -ivh ghostscript-8.70-14.el6.x86_64.rpm ghostscript-fonts-5.50-23.1.el6.noarch.rpm urw-fonts-2.4-10.el6.noarch.rpm xorg-x11-font-utils-7.2-11.el6.x86_64.rpm libXfont-1.4.1-2.el6_1.x86_64.rpm libfontenc-1.0.5-2.el6.x86_64.rpm

リビルド
cd /usr/local/src/
mkdir SRPMS
cd SPRMS
wget ftp://ftp.pbone.net/mirror/vault.centos.org/6.2/os/Source/SPackages/sendmail-8.14.4-8.el6.src.rpm
rpmbuild --rebuild --target=x86_64 --define 'dist .el6' sendmail-8.14.4-8.el6.src.rpm

インストール
cd /usr/local/src/RPMS
rpm -ivh /root/rpmbuild/RPMS/x86_64/sendmail-8.14.4-8.el6.x86_64.rpm procmail-3.22-25.1.el6.x86_64.rpm
rpm -ivh /root/rpmbuild/RPMS/noarch/sendmail-cf-8.14.4-8.el6.noarch.rpm

スタート
/etc/rc.d/init.d/sendmail start
ここで動かない場合は/etc/hostsを確認して自ホスト名が逆引きされているか確認する。

確認ができたら、
chkconfig sendmail on
として自動起動にする。自ホスト名が逆引きされてないのに自動起動にしてしまうと、サーバー自体が起動しなくなってしまうので注意。

動作テスト
cd /usr/local/src/RPMS
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/mailx-12.4-6.el6.x86_64.rpm
rpm -ivh mailx-12.4-6.el6.x86_64.rpm
mail root
Subject: test
test
.
でルート宛にメールが届くか確認する。

デリバリーモードの変更
デフォルトではデリバリーモードはi(即配信)になっています。メルマガ等、スクリプトでメールを一度に大量に送信する場合、即配信ではなくキューイングしてから配信するようにデリバリーモードをqに変更します。
cd /etc/mail
vi sendmail.mc
define(`confDELIVERY_MODE', `q')dnl
m4 sendmail.mc > sendmail.cf

vi /etc/sysconfig/sendmail
DAEMON=yes
QUEUE=16s
この設定は、/etc/rc.d/init.d/sendmailスクリプト内で使うものです。なので、systemctl を使うFedora17ではSENDMAIL_OPTS="-q16s"という設定になります。もし、将来的にCentOSがsystemctl を採用するようになった場合は、やはりFedora17と同じように設定する必要があります。

cd /var/spool/clientmqueue/
mail root
Subject: test
test
.
ls
ここで、16秒後に再びlsとしてキューがなくなる事を確認します。

NTPのインストール

cd /usr/local/src/RPMS
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/ntp-4.2.4p8-2.el6.centos.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/ntpdate-4.2.4p8-2.el6.centos.x86_64.rpm
rpm -ivh ntp-4.2.4p8-2.el6.centos.x86_64.rpm ntpdate-4.2.4p8-2.el6.centos.x86_64.rpm

cd /etc
mv ntp.conf ntp.conf_org
vi /etc/ntp.conf
restrict default ignore
restrict 127.0.0.1
restrict 210.173.160.27 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.57 mask 255.255.255.255 nomodify notrap noquery
restrict 210.173.160.87 mask 255.255.255.255 nomodify notrap noquery

server 210.173.160.27 # MFEED(ntp1.jst.mfeed.ad.jp)
server 210.173.160.57 # MFEED(ntp2.jst.mfeed.ad.jp)
server 210.173.160.87 # MFEED(ntp3.jst.mfeed.ad.jp)

driftfile /etc/ntp/drift
authenticate no
broadcastdelay  0.008
touch /etc/ntp/drift
touch /etc/ntp/drift.TEMP
chmod 666 /etc/ntp/drift
chmod 666 /etc/ntp/drift.TEMP
/etc/rc.d/init.d/ntpd start
chkconfig ntpd on

動作確認
ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
ntp1.jst.mfeed. 210.173.160.56 2 u 59 64 7 9.973 -324250 2.073
ntp2.jst.mfeed. 210.173.160.56 2 u 59 64 7 9.154 -324250 3.081
ntp3.jst.mfeed. 210.173.176.4 2 u 59 64 7 8.360 -324250 2.466
ここで、値が全て0でなければ動作しているはず。

Fedora17では「restrict localhost」という設定を追加しないとntpqコマンドを拒否されましたが、CentOS6.3ではrestrict 127.0.0.1さえあれば大丈夫みたいですね。

ここを参考にしました。
http://www.aconus.com/~oyaji/ntp/ntp.htm

QPOPPERのインストール

Fedora17と同様、CentOS6も$6$から始まるshadowパスワードを使っているため、QPOPPERのバージョンは4.1以上である必要があります。

cd /usr/local/src
mkdir targz
cd targz
wget http://core.ring.gr.jp/archives/net/mail/qpopper/qpopper4.1.0.tar.gz
tar xvzf qpopper4.1.0.tar.gz
cd qpopper4.1.0
./configure --enable-special-auth --enable-log-login --enable-shy --disable-ipv6
make
make install

vi /etc/xinetd.d/popper
# default: on
# description: The wu-ftpd FTP server serves FTP connections. It uses \
#       normal, unencrypted usernames and passwords for authentication.
service pop3
{
        disable = no
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/local/sbin/popper
        server_args             = -t /var/log/pop3.log
}
/etc/rc.d/init.d/xinetd restart

動作テスト
telnet localhost 110
user ユーザー名
pass パスワード
quit

sshdをxinetd経由にする

sshdをスタンドアロンでは実行させずにxinetd経由に変更します。 sshdは、同時に大量のコネクションをかけるとルート権限を乗っ取られるという不具合が発見された事があり、 それ以降慣習としてxinetd経由で実行させています。もちろん、xinetdにもしも脆弱性があれば、そのせいでかえってルート権限を乗っ取られるかもしれませんが。

/etc/rc.d/init.d/sshd stop
chkconfig sshd off

vi /etc/xinetd.d/ssh
# default: on
# description: The ssh server serves ssh sessions; it uses \
# unencrypted username/password pairs for authentication.
service ssh
{
	disable = no
	flags = REUSE
	socket_type = stream
	wait = no
	user = root
	server = /usr/sbin/sshd
	server_args = -i
	log_on_failure += USERID
}
チューニング
vi /etc/ssh/sshd_config
Protocol 2,1
PermitRootLogin no
PermitEmptyPasswords no
/etc/rc.d/init.d/xinetd restart

プロトコル1を追加する理由は単に私がいつもプロトコル1を使うからです。自分はプロトコル2しか使わないぞという方は、プロトコル1を追加する必要はありません。

ルートログインを禁止する理由は、パスワード総当りでログインを試みる輩がいたとして、「ユーザーID」と「パスワード」の組み合わせが当たらないとログインできない場合に比べて、ルートログインではユーザーIDがrootに固定されているため、パスワードをaaaaa〜zzzzzまで総当りで試された場合にパスワードを破られるリスクが高まるためです。

viを標準でカラーにする

Poderosaからtelnet/sshでアクセスした時に、viがカラーで出ると見やすいので、標準でカラーで出るようにします。TeraTermだとこの設定ではうまくいかないみたいなのでTeraTermを使う人はこの設定はしないでください。

vim-enhancedのインストール
cd /usr/local/src/RPMS
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/vim-enhanced-7.2.411-1.8.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/vim-common-7.2.411-1.8.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/gpm-libs-1.20.6-12.el6.x86_64.rpm
rpm -ivh vim-enhanced-7.2.411-1.8.el6.x86_64.rpm vim-common-7.2.411-1.8.el6.x86_64.rpm gpm-libs-1.20.6-12.el6.x86_64.rpm

カラーのviを起動させるvi2というコマンドを新設
/usr/bin/vim -u /etc/vimrc /usr/local/bin/vi2
#!/bin/sh
/usr/bin/vim -u /etc/vimrc $1
chmod 755 /usr/local/bin/vi2

viと入力するとvi2が起動するように設定
vi /etc/profile.d/vi2.sh
alias vi=vi2
chmod 755 /etc/profile.d/vi2.sh
いったんログアウトして再ログイン
su -
パスワード
alias | grep vi2
alias vi='vi2'が登録されている事を確認。
vi /etc/aliases
でカラーになる事を確認。

コメントのオートインデントを解除
ここでは、メモ帳等のテキストエディタからPoderosaのウインドウへコピペするのを前提としています。その際に、オートインデントしてしまうのは都合が悪いので、解除します。
vi /etc/vimrc
(一番下の行に)
autocmd FileType * set comments=
ここを参考にしました。
http://d.hatena.ne.jp/dayflower/20081208/1228725403

bindのインストール

cd /usr/local/src/RPMS
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/bind-9.8.2-0.10.rc1.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/portreserve-0.0.4-9.el6.x86_64.rpm
rpm -ivh bind-9.8.2-0.10.rc1.el6.x86_64.rpm portreserve-0.0.4-9.el6.x86_64.rpm
/etc/rc.d/init.d/named start
chkconfig named on

ついでにnslookupコマンドもインストールします。
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/bind-utils-9.8.2-0.10.rc1.el6.x86_64.rpm
rpm -ivh bind-utils-9.8.2-0.10.rc1.el6.x86_64.rpm

IPTABLESの設定

vi /etc/rc.d/rc.local
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local
/root/scripts/firewall-setting.sh
vi /root/scripts/firewall-setting.sh
     :
(ファイアウォールの設定いろいろ)
     :
/sbin/modprobe ip_conntrack_ftp
chmod 755 /root/scripts/firewall-setting.sh

サーバーを再起動させて、
lsmod | grep ftp
で動作確認してみる。

え?なんでファイアウォールの設定を書いてないのかって?そりゃ、ここに書いちゃうとこのサーバーのセキュリティーの脆弱性がバレるからですよ。

なお、この設定をミスると遠隔操作ができなくなるので、この作業はなるべくデーターセンターにいる時に、ラックのサーバーにキーボードとディスプレイをつないた状態でやりましょう。 じゃないと、ミスるとデーターセンターに行くハメになります。あそこはサーバー室に入るまでの手続きが面倒なので、できればあんな所何度も行きたくないですね。

apache2.4のインストール

apache2.4をインストールする前に、まずは依存性を解決します。

aprのインストール
cd /usr/local/src/targz
wget http://ftp.kddilabs.jp/infosystems/apache/apr/apr-1.4.6.tar.gz
tar xvzf apr-1.4.6.tar.gz
cd apr-1.4.6
./configure
make
make install
cd ..

apr-utilのインストール
wget http://ftp.kddilabs.jp/infosystems/apache/apr/apr-util-1.4.1.tar.gz
tar xvzf apr-util-1.4.1.tar.gz
cd apr-util-1.4.1
./configure --with-apr=/usr/local/apr
make
make install

pcreのインストール
wget http://ftp.exim.llorien.org/pcre/pcre-7.8.tar.gz
tar xvzf pcre-7.8.tar.gz
cd pcre-7.8
./configure
make
make install

apache2.4.2のインストール
cd /usr/local/src/targz
wget http://ftp.riken.jp/net/apache/httpd/httpd-2.4.2.tar.gz
tar xvzf httpd-2.4.2.tar.gz
cd httpd-2.4.2
./configure --enable-modules=all --enable-ssl
make
make install

SSLキー作成
cd /usr/local/apache2/conf
mkdir sslkey
cd sslkey
openssl md5 /var/log/messages > rand.dat
openssl genrsa -rand rand.dat -des3 1024 > key.pem
(パスフレーズは123456)
cp key.pem key_in_pass.pem
openssl rsa -in key.pem -out key.pem
(パスフレーズは123456)
openssl req -new -days 365 -key key.pem -out csr.pem
(ここで全ての項目をエンターキーで送る)
openssl x509 -in csr.pem -out jiko_cert.pem -req -signkey key.pem -days 365

これはあくまで自己証明なので、公式なサイトではcsr.pemはちゃんと正確なユーザー情報を入れましょう。 また、IE11では自己証明では警告が表示されるだけでサイトを表示してくれません。今SSLを使うのであれば、きちんと証明機関に証明書を発行してもらってください。

あと、パスフレーズは私は面倒くさいので123456とした後、すぐに削除しちゃってますが、セキュリティーを気にするならapacheを起動する度に手動でパスフレーズを入れてください。ただ、休みの日にサーバーがリブートして、管理者が携帯で呼び出されてもいいんなら・・・。

ログディレクトリ作成と、ローテーションの設定
mkdir /var/log/apache
useradd apache
chown apache.apache /var/log/apache
vi /etc/logrotate.d/apache
/var/log/apache/*log {
        create 0644 apache apache
        missingok
        sharedscripts
        postrotate
                /bin/kill -HUP `cat /usr/local/apache2/logs/httpd.pid 2>/dev/null` 2> /dev/null || true
        endscript
}
ogrotate -d /etc/logrotate.conf
でエラーにならない事を確認する。

自動起動スクリプト作成
vi /etc/rc.d/init.d/apache
#!/bin/bash
#
#       /etc/rc.d/init.d/apache
#
# Starts the at daemon
#
# chkconfig: 345 95 5
# description: Runs commands scheduled by the at command at the time \
#    specified when at was run, and runs batch commands when the load \
#    average is low enough.
# processname: apache

# Source function library.
. /etc/init.d/functions

RETVAL=0

start() {
        echo "Starting apache..."
        /usr/local/apache2/bin/apachectl start
}

stop() {
        echo "Stopping apache..."
        /usr/local/apache2/bin/apachectl stop
}

restart() {
        echo "Restarting apache..."
        /usr/local/apache2/bin/apachectl restart
}

configtest() {
        /usr/local/apache2/bin/apachectl configtest
}


# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        restart
        ;;
  configtest)
        configtest
        ;;
  *)
        echo "Usage: apache {start|stop|restart|configtest}"
        exit 1
esac

exit $RETVAL
chmod 755 /etc/rc.d/init.d/apache
chkconfig apache on
/etc/rc.d/init.d/apache start

ここで、
ps ax | grep http
として、apacheが起動したかどうか確認しましょう。startして数秒間してから確認しないと常駐してないかもしれません。常駐してないようであれば、エラーログ(/var/log/apache/error.log)を確認しましょう。

apacheはバージョン2.2からはSSLを使う場合でもstartsslではなくstartで起動するようになったので、自動起動スクリプトにstartsslと書かないように注意しましょう。

チューニング
vi /usr/local/apache2/conf/httpd.conf
User apache
Group apache
ServerAdmin 管理者のメールアドレス
ServerName ホスト名

<IfModule mod_dir.c>
     DirectoryIndex index.php index.cgi index.html index.htm
</IfModule>
AddType application/x-httpd-php .php .html
ErrorLog /var/log/apache/error.log
CustomLog /var/log/apache/access.log combined
<Directory />
    Options FollowSymLinks
    AllowOverride None
</Directory>

▽以下はコメントアウトを解除
LoadModule socache_shmcb_module modules/mod_socache_shmcb.so
LoadModule socache_dbm_module modules/mod_socache_dbm.so
LoadModule socache_memcache_module modules/mod_socache_memcache.so
LoadModule ssl_module modules/mod_ssl.so
Include conf/extra/httpd-ssl.conf
Include conf/extra/httpd-vhosts.conf
これは、あとでPHPをインストールする場合の例です。拡張子.phpだけでなく.htmlもPHPスクリプトとして認識させます。当然、PHPがインストールされてないとエラーでapacheが起動しないので、この設定をしたらPHPをインストールしましょう。

vi /usr/local/apache2/conf/extra/httpd-ssl.conf
SSLCertificateFile /usr/local/apache2/conf/sslkey/jiko_cert.pem
SSLCertificateKeyFile /usr/local/apache2/conf/sslkey/key.pem
ServerAdmin 管理者のメールアドレス
ServerName ホスト名
ErrorLog /var/log/apache/ssl-error.log
TransferLog /var/log/apache/ssl-access.log
CustomLog /var/log/apache/ssl_request_log \
ここで、jiko_cert.pemというのはあくまで自己証明です。正式な証明書を使うサイトでは、当然ですがちゃんとベリサインとかに発行してもらった証明書を入れましょう。

また、ベリサインでは中間証明が必要になる場合があります。この場合、ベリサインのサイトから中間証明書をコピペした後、
SSLCertificateChainFile 
に続いて中間証明のファイルの入ったパスを書いてください。

vi /usr/local/apache2/conf/extra/httpd-vhosts.conf
最初から書いてあるバーチャルホストの設定は全てコメントアウト。
最後の行に
Include virtconf.d/*.conf
cd /usr/local/apache2
mkdir virtconf.d
cd virtconf.d
vi そのサーバーのIPアドレス.conf
<VirtualHost *:80>
  ServerName (そのサーバーのIP)
  DocumentRoot (ドキュメントルート)
  CustomLog /var/log/apache/access.log combined
  ErrorLog /var/log/apache/error.log
</VirtualHost>
ここで、アクセスログをバーチャルホスト毎に別々にしたい時は、access.logやerror.logの部分を書き換えてください。

この後、apacheを再起動、といきたい所ですが、まだPHPを入れてないのでエラーになってしまうので、以下のPostgreSQL、PHPのインストール後に行ってください。

パスを通す
vi /etc/profile.d/apache.sh
PATH="$PATH":/usr/local/apache2/bin
ただし、/etc/profile.dに記述したスクリプトはログイン時に有効になるので、いったんtelnetを抜けて入り直します。

PostgreSQL

cd /usr/local/src/targz
wget ftp://ftp2.jp.postgresql.org/pub/postgresql/source/v9.1.4/postgresql-9.1.4.tar.gz
tar xvzf postgresql-9.1.4.tar.gz
cd postgresql-9.1.4
./configure
make
make install

データーベース初期化
useradd postgres
chmod 777 /usr/local/pgsql
su - postgres
/usr/local/pgsql/bin/initdb --encoding=EUC_JP --no-locale -D /usr/local/pgsql/data
exit
chmod 755 /usr/local/pgsql

ログのローテーションの設定
mkdir /var/log/pgsql
chown postgres.postgres /var/log/pgsql

vi /etc/logrotate.d/postgres
/var/log/pgsql/*log {
    create 0644 postgres postgres
    missingok
    sharedscripts
    postrotate
        /bin/kill -HUP `head -1 /usr/local/pgsql/data/postmaster.pid  2> /dev/null` 2> /dev/null || true
    endscript
}
この後、
logrotate -d /etc/logrotate.conf
で、エラーが出ない事を確認する。

自動起動スクリプトの作成
vi /etc/rc.d/init.d/postgresql
#!/bin/bash
#
#       /etc/rc.d/init.d/postgres
#
# Starts the at daemon
#
# chkconfig: 345 95 5
# description: Runs commands scheduled by the at command at the time \
#    specified when at was run, and runs batch commands when the load \
#    average is low enough.
# processname: postgres

# Source function library.
. /etc/init.d/functions

RETVAL=0

start() {
        echo "Starting PostgreSQL"
        /bin/su - postgres -c "/usr/local/pgsql/bin/pg_ctl \
        -D /usr/local/pgsql/data -l /var/log/pgsql/postgres.log start"
}

stop() {
        echo "Stopping PostgreSQL"
        /bin/su - postgres -c "/usr/local/pgsql/bin/pg_ctl \
        -D /usr/local/pgsql/data -m fast stop"
}

restart() {
        echo "Restarting PostgreSQL"
        /bin/su - postgres -c "/usr/local/pgsql/bin/pg_ctl \
        -D /usr/local/pgsql/data -m fast restart"
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        restart
        ;;
  *)
        echo "Usage: postgres {start|stop|restart|reload}"
        exit 1
esac

exit $RETVAL
chmod 755 /etc/rc.d/init.d/postgresql
chkconfig postgresql on
/etc/rc.d/init.d/postgresql start

ps ax | grep postgres
でpostgresが常駐しているか確認する。もしpostgresが常駐してないようなら、ログを見て問題を修正する
cat /var/log/pgsql/postgres.log

パスを通す
PostgreSQL関係のコマンド(psqlやpg_dumpやvacuumdbなど)をフルパスで入力しなくても良いように、パスを通しておきます。
vi /etc/profile.d/postgresql.sh
export POSTGRES_HOME=/usr/local/pgsql
export PGLIB=$POSTGRES_HOME/lib
export PGDATA=$POSTGRES_HOME/data
export MANPATH="$MANPATH":$POSTGRES_HOME/man
export LD_LIBRARY_PATH="$LD_LIBRARY_PATH":"$PGLIB"
PATH="$PATH":/usr/local/pgsql/bin
ただし、/etc/profile.dに記載したスクリプトはログイン時に有効になるので、いったんtelnetを抜けて入りなおします。入りなおしたら、
psql -U postgres -l
としてパスが通っている事を確認します。

また、.soファイルの場所をシステムに記憶させます。そうしないと、DBD::Pg等でエラーが出る場合があります。

vi /etc/ld.so.conf.d/postgres.conf
/usr/local/pgsql/lib
ldconfig
チューニング
vi /usr/local/pgsql/data/postgresql.conf
listen_addresses = '*'
work_mem = 4MB
maintenance_work_mem = 20MB
effective_cache_size = 200MB
log_connections = off
log_duration  = off
log_statement = 'none'
default_with_oids = on
standard_conforming_strings = off
backslash_quote = on
escape_string_warning = off
listen_addresses = '*'
は、接続を受け付けるIPアドレスを指定します。ここで、'*'は「全てのIPアドレスからの接続を受け入れる」という意味なので、別途IPTABLESで5432ポートへの接続を制限しないと、 データーベースの中身がだだ漏れになるので注意が必要です。

work_mem = 4MB
maintenance_work_mem = 20MB
effective_cache_size = 200MB
は、いずれもPostgreSQLを実行させるのにどれぐらいのメモリーを使うかを指定しています。 データーベースサーバーにはできるだけ大量のメモリーを搭載した上で、 この値を大きくすればそれだけパフォーマンスが良くなります。 ただし、大きくしすぎるとPostgreSQL自体が動かなかったり、サーバーのスワップが頻繁になりすぎて、かえって遅くなります。

log_connections = off
log_duration = off
log_statement = 'none'
は、ログに端末情報、かかった時間、SQLステートメントを残すかどうかを設定します。この場合はいずれもオフやnoneにしています。巨大サイトではログを残しすぎると2GBを超えて止まってしまうのでオフにしていますが、デバッグ中や開発サーバーではオンにしておくと都合が良いでしょう。

default_with_oids = on
は、各行にオブジェクトID(oid)をつけるかどうか。大抵はオフで良いのですが、過去に作られたソースを流用するのであればonにしておきます。これから作るプログラムでは、oidに頼らず別途serial型のフィールドをつける等してoidに頼らないような設計にしましょう。

backslash_quote = on
は、シングルクォート'を\でエスケープできるかどうかの設定です。PostgreSQLでは'を''とエスケープしなければならないのですが、以前のバージョンでは\'というふうに\でもエスケープする事が認められていたので、古いソースを流用するのであればonにしておきます。

standard_conforming_strings = off
は、\を単なる文字として扱うか、エスケープとして扱うか。onなら単なる文字、offならエスケープとして扱います。

escape_string_warning = off
は、\をエスケープとして使おうとしている(\\や\'など)場合に警告を発するかどうか。古いソースの中にある\をエスケープとして使う箇所を発見するのに役立ちます。onで警告を発するようになりますが、古いソースを直さずにそのまま流用するのであればoffにします。

PostgreSQLの再起動
/etc/rc.d/init.d/postgresql stop
/etc/rc.d/init.d/postgresql start

自動起動の設定
chkconfig postgresql on

動作確認
head -1 /usr/local/pgsql/data/postmaster.pid
psql -U postgres -l

ワークメモリーが多すぎたり、設定ファイルの記載ミスがあると再起動時にエラーになるので、その場合はログを見てエラー箇所を修正します。

GD

PNGライブラリのインストール
cd /usr/local/src
wget http://files.directadmin.com/services/custombuild/libpng-1.2.8-config.tar.gz
tar xvzf libpng-1.2.8-config.tar.gz
cd libpng-1.2.8-config
./configure
make
make install

JPEGライブラリのインストール
32ビットシステムの場合
cd /usr/local/src
wget http://files.directadmin.com/services/custombuild/jpegsrc.v6b.tar.gz
tar -zxvf jpegsrc.v6b.tar.gz
cd jpeg-6b/
./configure --enable-shared
make
mkdir /usr/local/include
mkdir /usr/local/man/man1/
make install

64ビットシステムの場合
cd /usr/local/src
wget http://www.imagemagick.org/download/delegates/jpegsrc.v8b.tar.gz
tar -zxvf jpegsrc.v8b.tar.gz
cd jpeg-8b/
./configure --enable-shared
make
make install

freetype2のインストール
cd /usr/local/src
wget http://www.pd-admin.de/download/src/freetype-2.1.8.tar.gz
tar xvzf freetype-2.1.8.tar.gz
cd freetype-2.1.8
./configure --enable-static
make
make install

expatのインストール
cd /usr/local/src
wget http://pkgs.fedoraproject.org/repo/pkgs/expat/expat-2.0.1.tar.gz
tar xvzf expat-2.0.1.tar.gz
cd expat-2.0.1
./configure
make
make install

Fontconfigのインストール
cd /usr/local/src/RPMS
wget ftp://fr2.rpmfind.net/linux/centos/6.3/os/x86_64/Packages/expat-devel-2.0.1-11.el6_2.x86_64.rpm
rpm -ivh expat-devel-2.0.1-11.el6_2.x86_64.rpm
cd /usr/local/src
wget http://freedesktop.org/software/fontconfig/release/fontconfig-2.2.3.tar.gz
tar xvzf fontconfig-2.2.3.tar.gz
cd fontconfig-2.2.3
./configure
make
make install

gd2.0のインストール
cd /usr/local/src
wget http://ring.u-toyama.ac.jp/archives/graphics/gd/oldreleases/gd-2.0.33.tar.gz
tar xvzf gd-2.0.33.tar.gz
cd gd-2.0.33
./configure \
--prefix=/usr/local \
--with-png=/usr/local \
--with-freetype=/usr/local \
--with-fontconfig=/usr/local \
--with-jpeg=/usr/local

Support for PNG library: yes
Support for JPEG library: yes
Support for Freetype 2.x library: yes
Support for Fontconfig library: yes
Support for Xpm library: no

XpmはGUI環境が整ってないとインストールできないので、CUIで使っているサーバーではnoのままで構いません。その他の項目はPHPで画像を処理する場合や、画像に文字を入れたい場合に使いますので、yesになるように事前にライブラリを入れておきました。
make
make install

その後、.soファイルの場所をシステムに記憶させます。でないと、GD::Barcode等でエラーが出る場合があります。

vi /etc/ld.so.conf.d/gd.conf
/usr/local/lib
ldconfig

PHP

libxsltとlibcryptのインストール
libxsltとlibcryptのdevelパッケージを入れてないと./configureでエラーになってしまうので、前もって入れておきます。DVDからCentOSをインストールする際にインストールするように指定していた場合は不要です。
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/libxslt-1.1.26-2.el6.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/libxslt-devel-1.1.26-2.el6.x86_64.rpm
rpm -ivh libxslt-1.1.26-2.el6.x86_64.rpm libxslt-devel-1.1.26-2.el6.x86_64.rpm

wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/libgcrypt-1.4.5-9.el6_2.2.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/libgcrypt-devel-1.4.5-9.el6_2.2.x86_64.rpm
rpm -ivh libgcrypt-1.4.5-9.el6_2.2.x86_64.rpm libgcrypt-devel-1.4.5-9.el6_2.2.x86_64.rpm

db4のインストール
32ビットシステムの場合rpmからdb4、db4-develをインストールすれば良いのですが、64ビットシステムの場合phpのconfigureスクリプトが/lib64からライブラリを探してくれないので、ソースからコンパイルしてインストールします。
cd /usr/local/src/targz
wget http://pkgs.fedoraproject.org/repo/pkgs/db4/db-4.7.25.tar.gz/ec2b87e833779681a0c3a814aa71359e/db-4.7.25.tar.gz
tar xvzf db-4.7.25.tar.gz
cd db-4.7.25
cd build_unix
../dist/configure --prefix=/usr
make
make install

※ここを参考にしました
http://www.kozupon.com/db/db2.html

openldapのインストール
32ビットシステムの場合rpmからopenldap、openldap-develをインストールすれば良いのですが、64ビットシステムの場合phpのconfigureスクリプトが/lib64からライブラリを探してくれないので、ソースからコンパイルしてインストールします。
cd /usr/local/src/targz
wget http://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-2.4.23.tgz
tar xvzf openldap-2.4.23.tgz
cd openldap-2.4.23
./configure --prefix=/usr --enable-ldbm
make depend
make
make install

※ここを参考にしました
http://www015.upp.so-net.ne.jp/unixlife/practical/openldap-install.html

phpのインストール
wget http://ftp.wayne.edu/php/php-5.4.5.tar.gz
tar xvzf php-5.4.5.tar.gz
cd php-5.4.5
vi mkphpconf
32ビットシステムの場合
./configure                                      \
--with-config-file-path=/etc                     \
--enable-gd-native-ttf                           \
--with-openssl                                   \
--with-zlib                                      \
--enable-exif                                    \
--enable-ftp                                     \
--enable-magic-quotes                            \
--enable-sockets                                 \
--enable-sysvsem                                 \
--enable-sysvshm                                 \
--enable-sysvmsg                                 \
--enable-wddx                                    \
--with-kerberos                                  \
--enable-ucd-snmp-hack                           \
--enable-shmop                                   \
--enable-calendar                                \
--with-libxml-dir=/usr                           \
--with-apxs2=/usr/local/apache2/bin/apxs         \
--with-gd                                        \
--with-pgsql=/usr/local/pgsql                    \
--with-regex=php                                 \
--enable-zend-multibyte                          \
--disable-debug                                  \
--with-layout=GNU                                \
--with-pear=/usr/share/php                       \
--enable-bcmath                                  \
--with-bz2                                       \
--enable-ctype                                   \
--with-db4                                       \
--with-iconv                                     \
--with-gettext                                   \
--enable-mbstring                                \
--with-pcre-regex                                \
--with-libexpat-dir=/usr/local/apr               \
--with-xmlrpc                                    \
--with-pgsql                                     \
--with-mime-magic=/usr/share/magic.mime          \
--with-exec-dir=/usr/lib/php4/libexec            \
--enable-shared                                  \
--enable-static                                  \
--with-zlib-dir=/usr                             \
--with-jpeg-dir=shared,/usr                      \
--with-png-dir=shared,/usr                       \
--with-freetype-dir=shared,/usr                  \
--with-ldap=shared,/usr                          \
--with-xsl                                       \
--with-ttf=shared                                \
--enable-soap
64ビットシステムの場合
./configure                                      \
--with-config-file-path=/etc                     \
--enable-gd-native-ttf                           \
--with-openssl                                   \
--with-zlib                                      \
--enable-exif                                    \
--enable-ftp                                     \
--enable-sockets                                 \
--enable-sysvsem                                 \
--enable-sysvshm                                 \
--enable-sysvmsg                                 \
--enable-wddx                                    \
--with-kerberos                                  \
--enable-shmop                                   \
--enable-calendar                                \
--with-libxml-dir=/usr                           \
--with-apxs2=/usr/local/apache2/bin/apxs         \
--with-gd                                        \
--with-pgsql=/usr/local/pgsql                    \
--with-regex=php                                 \
--disable-debug                                  \
--with-layout=GNU                                \
--with-pear=/usr/share/php                       \
--enable-bcmath                                  \
--with-bz2                                       \
--enable-ctype                                   \
--with-iconv                                     \
--with-gettext                                   \
--enable-mbstring                                \
--with-pcre-regex                                \
--with-libexpat-dir=/usr/local/apr               \
--with-xmlrpc                                    \
--with-pgsql                                     \
--enable-shared                                  \
--enable-static                                  \
--with-zlib-dir=/usr                             \
--with-jpeg-dir=shared,/usr                      \
--with-png-dir=shared,/usr                       \
--with-freetype-dir=shared,/usr                  \
--with-ldap=shared,/usr                          \
--with-db4=shared,/usr                           \
--with-xsl                                       \
--enable-soap
従来あった
--enable-magic-quotes
--enable-ucd-snmp-hack
--enable-zend-multibyte
--with-mime-magic
--with-exec-dir
--with-ttf
は廃止されたので、現バージョンでは指定できません。--enable-magic-quotesが廃止されたため、従来のマジッククォートされている事を前提としたソースが動かないので、そういう場合は修正が必要になります。 具体的には、SQL文を生成する際に、insertやupdateする文字列中にある'を''にする処理を追加する必要があります。そのためには、pg_escape_string関数等を利用します。 PostgreSQLではbackslash_quote= onは廃止する方向なので、PHPのaddslashes関数は使わないようにしましょう。

--with-libexpat-dir=/usr/local/apr
apacheをインストールする時に先だってapr-1.4.6.tar.gzをインストールしている事を前提としています。

--with-ldap=shared,/usr
--with-db4=shared,/usr
これらは64ビットシステムではconfigureスクリプトが/lib64からライブラリを探してくれずエラーになってしまうので、別途ソースからコンパイル・インストールして、インストールしたディレクトリを指定する必要があります。ここでは、--with-ldap=shared,/usrと、--with-db4=shared,/usrを指定しています。

chmod 755 mkphpconf
./mkphpconf
make
make install
コンパイルが通ったらphp.iniをコピーします。
cp php.ini-development /etc/php.ini

チューニング
vi /etc/php.ini
display_errors = On
log_errors = On
html_errors = Off
error_log = /var/log/apache/php-error.log
file_uploads = On
session.auto_start = 1
session.gc_maxlifetime = 3600
session.use_trans_sid = 1
session.cache_limiter = private, must-revalidate
upload_max_filesize = 100M
memory_limit = 128M
post_max_size = 200M
date.timezone = Asia/Tokyo
mbstring.http_output = SJIS-win
mbstring.internal_encoding = SJIS-win
short_open_tag = On
error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
upload_max_filesize = 100M
post_max_size = 200M
今時デフォルトのアップロードのサイズ2Mではほとんど何もアップできない(大げさ?)でしょうから、ここは100Mぐらいんにしておきます。同時にPOSTできるサイズも増やしておきます。これはアップロードできるサイズより大きくしないと、アップロードはできてもその他の情報(hiddenタグの情報など)が途中切れになってしまいます。

date.timezone = Asia/Tokyo
PHP5.1から追加された設定で、この設定をしていないとdate()関数を使った時にタイムゾーンが設定されていないというエラーが出ます。古いスクリプトを流用する場合はこの設定を入れます。これから作る新しいスクリプトではdate()関数にタイムゾーンを指定してください。

mbstring.http_output = SJIS-win
mbstring.internal_encoding = SJIS-win
大抵はSJISだけで良いのですが、携帯サイトを作る場合にドコモの絵文字にも対応させたいので、SJIS-winとします。

※2015.9.20追記 この記事はガラケー全盛期に書いたものですので、今の時代(2015年)にスマホ対応サイト(ガラケー非対応)を作るのであれば、UTF-8と設定した上で、サイトはUTF-8で作成する方が良いかと思われます。ちなみに、このサイトは全てSJISで記述しています。

short_open_tag = On
<?をPHPスクリプトの開始と認識させます。 この設定をすると、<?xmlという行が全てエラーになってしまうので、<?xmlという行はechoやprint文で出力させます。 これから作る新しいスクリプトでは<?phpと書くようにしましょう。

※2015.9.20追記 PHP5.4以降では、short_open_tagの設定は廃止され、常時onとみなされるようになりました。 そのかわり、<?xmlと書いてある場合はphpとはみなされずにエラーにならなくなりました。 要するに、<?xmlさえエラーにならなければ、なにもショートタグ全てを受け付けないようにする必要もなかろう、という事なのでしょう。

ここを参考にしました。
http://www.coalice.info/blog/programming/php/920.html

error_reporting = E_ALL & ~E_NOTICE & ~E_DEPRECATED
split関数を使っても非推奨エラーが出ないようにします。古いスクリプトを流用する場合はこの設定を入れます。これから作る新しいスクリプトでは、explodeやpreg_splitを使うようにしてください。

register_globals =
ありません。 PHP 5.4.0 で削除されました。したがって、古いスクリプトを流用する場合、スクリプトの頭でextract("$_GET")やextract("$_PUT")を使って配列を展開する必要があります。

/etc/rc.d/init.d/apache configtest
エラーがなければ
/etc/rc.d/init.d/apache stop
/etc/rc.d/init.d/apache start

Perlモジュールのインストール

基本的にはPerlモジュールのインストールは、
tar xvzf モジュール名.tar.gz
cd モジュール名
perl Makefile.PL
make
make test
make install
cd ..
この作業の繰り返しになります。Perlモジュールは大抵はconfigureスクリプトはシェルスクリプトではなくperlで記述されているため、Makefileを生成するためにはperl Makefile.PLとします。

Perlモジュールは普通はCPANのシェルを使って取得するのが一般的で、その方が依存性を自動的に解決してくれて便利なのですが、DBIやGDみたいにmake testでは失敗するけど実は使えるみたいな場合にエラーで途中で止まってしまうので、ここでは手動でインストールしています。

複数台のサーバーをインストールするようなサーバー管理者の仕事をしている方は、都度wgetで取得するのではなく、ローカルのWindows端末に保存しておいてFTPでサーバーにアップした方が作業が早く終わります。

Googleからファイル置場を探す時は、ファイル名の後にindex of をつけて絞り込むと早く見つかります。

TimeDateのインストール
cd /usr/local/src
mkdir Perl-modules
cd Perl-modules/
wget http://pkgs.fedoraproject.org/repo/pkgs/perl-TimeDate/TimeDate-1.16.tar.gz/b3cc35a7cabd106ac8829d2f2ff4bd9d/TimeDate-1.16.tar.gz
tar xvzf TimeDate-1.16.tar.gz
cd TimeDate-1.16
perl Makefile.PL
make
make test
make install
cd ..

Time Hiresのインストール
wget http://pkgs.fedoraproject.org/repo/pkgs/perl-Time-HiRes/Time-HiRes-1.65.tar.gz/2d1a744ab6b31b86db1610d091c760ae/Time-HiRes-1.65.tar.gz
tar xvzf Time-HiRes-1.65.tar.gz
cd Time-HiRes-1.65
perl Makefile.PL
make
make test
make install
cd ..

File-Tailのインストール
wget http://backpan.perl.org/authors/id/M/MG/MGRABNAR/File-Tail-0.98.tar.gz
tar xvzf File-Tail-0.98.tar.gz
cd File-Tail-0.98
perl Makefile.PL
make
make test
make install
cd ..
これはmake testに妙に時間がかかりますが異常ではありません。

MIME-BASE-64のインストール
wget http://backpan.perl.org/authors/id/G/GA/GAAS/MIME-Base64-3.05.tar.gz
tar xvzf MIME-Base64-3.05.tar.gz
cd MIME-Base64-3.05
perl Makefile.PL
make
make test
make install
cd ..

Test-Sinmpleのインストール
wget http://backpan.perl.org/authors/id/M/MS/MSCHWERN/Test-Simple-0.47.tar.gz
tar xvzf Test-Simple-0.47.tar.gz
cd Test-Simple-0.47
perl Makefile.PL
make
make test
make install
cd ..

File-ReadBackwardsのインストール
wget http://gitpan.integra.net/backpan/authors/id/U/UR/URI/File-ReadBackwards-1.02.tar.gz
tar xvzf File-ReadBackwards-1.02.tar.gz
cd File-ReadBackwards-1.02
perl Makefile.PL
make
make test
make install
cd ..

DBIのインストール
wget http://pkgs.fedoraproject.org/repo/pkgs/perl-DBI/DBI-1.48.tar.gz/87396e1a9c06d1190f1ca70e1da1163e/DBI-1.48.tar.gz
tar xvzf DBI-1.48.tar.gz
cd DBI-1.48
perl Makefile.PL
make
make test
make install
cd ..
make testで [make: *** [test_dynamic] エラー 255]が出ますが 誰も気にしない 。ちゃんと使えますのでご心配なく。

DBD-Pgのインストール
wget http://pkgs.fedoraproject.org/repo/pkgs/perl-DBD-Pg/DBD-Pg-1.43.tar.gz/1ddefc3cb5f8c0d20eaf6ba7aa11049d/DBD-Pg-1.43.tar.gz
tar xvzf DBD-Pg-1.43.tar.gz
cd DBD-Pg-1.43
perl Makefile.PL
export DBI_DSN='dbi:Pg:dbname=template1;port=5432'
export DBI_USER=postgres
make test
make install
cd ..
Jcodeのインストール
wget http://pkgs.fedoraproject.org/repo/pkgs/perl-Jcode/Jcode-2.03.tar.gz/8d285ebf5e5d4f60938829a2c11bdef6/Jcode-2.03.tar.gz
tar xvzf Jcode-2.03.tar.gz
cd Jcode-2.03
perl Makefile.PL
make test
make install
cd ..

CGIのインストール
wget http://openwebmail.org/openwebmail/download/packages/CGI.pm-3.05.tar.gz
tar xvzf CGI.pm-3.05.tar.gz
cd CGI.pm-3.05
perl Makefile.PL
make test
make install
cd ..

GDのインストール
wget http://pkgs.fedoraproject.org/repo/pkgs/perl-GD/GD-2.23.tar.gz/131a84d37921a18c87e7d994d72165b2/GD-2.23.tar.gz
tar xvzf GD-2.23.tar.gz
cd GD-2.23
perl Makefile.PL
make
make test
make install
cd ..

make test時に[make: *** [test_dynamic] エラー 2]が出るけど 誰も気にしない。 ちゃんと使えますのでご心配なく。
GD-Barcodeのインストール
wget http://ftp.yz.yamagata-u.ac.jp/pub/lang/cpan/modules/by-module/GD/KWITKNR/GD-Barcode-1.15.tar.gz
tar xvzf GD-Barcode-1.15.tar.gz
cd GD-Barcode-1.15
perl Makefile.PL
make
make test
make install
cd ..

このままでは「QRコードのバージョンを指定しなかった場合には自動判別になる」という機能が働かず、QRコードのバージョンを指定しなかった場合に1になってしまうというバグがあるので、以下のように修正します。
chmod 755 /usr/local/share/perl5/GD/Barcode/QRcode.pm
vi /usr/local/share/perl5/GD/Barcode/QRcode.pm
40行目
$oSelf->{Version} = $rhPrm->{Version} || 1;
               ↓
$oSelf->{Version} = $rhPrm->{Version};
ImageMagiclのインストール
他のモジュールのようにソースコードからコンパイルして生成したかったんですけど、うまくいかなくてすいません。rpmパッケージからインストールします。
cd /usr/local/src/RPMS
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/ImageMagick-perl-6.5.4.7-6.el6_2.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/ImageMagick-6.5.4.7-6.el6_2.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/libwmf-0.2.8.4-22.el6.centos.x86_64.rpm
wget ftp://rpmfind.net/linux/centos/6.3/os/x86_64/Packages/libwmf-lite-0.2.8.4-22.el6.centos.x86_64.rpm
rpm -ivh ImageMagick-perl-6.5.4.7-6.el6_2.x86_64.rpm \
ImageMagick-6.5.4.7-6.el6_2.x86_64.rpm \
libwmf-0.2.8.4-22.el6.centos.x86_64.rpm \
libwmf-lite-0.2.8.4-22.el6.centos.x86_64.rpm

CentOSインストール時に「開発」関係を比較的多めに指定したので、依存性の解決がこの程度で済みましたが、インストール時の指定によっては以下のパッケージを要求してくる場合があります。
gd
ghostscript
ghostscript-devel
ghostscript
lcms
lcms-devel
libcroco
libgnomeui
libgnomeui-devel
libgsf
librsvg2
urw-fonts

MySQL

CentOSの最初から入ってるMysqlを削除
DVDからCentOSをインストールする時に「SQLサーバー」や「POSTFIXサーバー」を指定してしまうと、パッケージのMySQLがインストールされてしまうので、まずは削除します。いや、パッケージのままで良いという場合はそのままでも良いのですが、私はPostgreSQLやMySQLはソースからコンパイルして生成する事にしています。
rpm -e mysql-libs-5.1.61-4.el6.x86_64 mysql-devel-5.1.61-4.el6.x86_64 mysql-5.1.61-4.el6.x86_64 postfix-2.6.6-2.2.el6_1.x86_64
この後、いったんtelnetから抜けて入りなおします。(/usr/bin以下にあるmysqlコマンドを読もうとしてしまうため)

ユーザー作成
useradd mysql

コンパイル
cd /usr/local/src/targz
wget http://download.softagency.net/MySQL/Downloads/MySQL-5.0/mysql-5.0.92.tar.gz
tar xvzf mysql-5.0.92.tar.gz
cd mysql-5.0.92
./configure --with-charset=sjis --with-extra-charsets=all --with-mysqld-user=mysql
make
make install

雛型をコピー
cp support-files/my-medium.cnf /etc/my.cnf

ライブラリの場所をシステムに記憶させる
この作業は、DBD::mysqlを使う時に必要になります。
vi /etc/ld.so.conf.d/mysql.conf
/usr/local/lib/mysql
ldconfig

DB初期化
mysql_install_db --user=mysql

MySQL起動スクリプト作成
vi /etc/rc.d/init.d/mysql
#!/bin/bash
#
#       /etc/rc.d/init.d/mysql
#
# Starts the at daemon
#
# chkconfig: 345 95 5
# description: Runs commands scheduled by the at command at the time \
#    specified when at was run, and runs batch commands when the load \
#    average is low enough.
# processname: mysql

# Source function library.
. /etc/init.d/functions

RETVAL=0

start() {
        /usr/local/share/mysql/mysql.server start
}

stop() {
        /usr/local/share/mysql/mysql.server stop
}

restart() {
        /usr/local/share/mysql/mysql.server restart
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart|reload)
        restart
        ;;
  *)
        echo "Usage: mysql {start|stop|restart|reload}"
        exit 1
esac

exit $RETVAL
chmod 755 /etc/rc.d/init.d/mysql
chkconfig mysql on

MySQL起動
/etc/rc.d/init.d/mysql start

ルートパスワード設定
mysql
mysql>set password for (ユーザー名)@localhost=old_password('パスワード');
なんでold_passwordにしてるかというと、PHP4でパスワードを認識しなかったからです。PHP5では未確認です。rootパスワードは、セキュリティーのためには設定しておくべきですが、DBD::mysqlをインストールする時には解除しておかないとmake testで失敗します。

ユーザー追加
mysql>GRANT ALL ON *.* TO (ユーザー名);

データーベースの文字コードをシフトJISにする
vi /etc/my.cnf
[client]
default-character-set=sjis
[mysqld]
default-character-set=sjis
/etc/rc.d/init.d/mysql restart

DBD::mysqlをインストールする際に、文字コードがシフトJISになっているとmake testが失敗するので、DBD::mysqlをインストールする時は文字コード指定をいったん解除してください。

現在のキャラクターセットを確認する
mysql
mysql>SHOW VARIABLES LIKE '%character\_set%';

デフォルトのデーターベースのタイプをInnoDBにする
vi /etc/my.cnf
[mysqld]
default-table-type=InnoDB
/etc/rc.d/init.d/mysql restart

ログを/var/log/mysql以下に残すようにする
mkdir /var/log/mysql
mkdir /var/log/mysql-bin
chown mysql.mysql /var/log/mysql
chown mysql.mysql /var/log/mysql-bin

vi /etc/my.cnf
[mysqld]
log = /var/log/mysql/mysql.log
log-error = /var/log/mysql/mysql-error.log
log-slow-queries = /var/log/mysql/mysql-slow.log
log-bin = /var/log/mysql-bin
sync_binlog=1
expire_logs_days=30
max_binlog_size =1G
/etc/rc.d/init.d/mysql restart

ログのローテーションの設定
vi /etc/logrotate.d/mysql
/var/log/mysql/*log {
        create 660 mysql mysql
        missingok
        sharedscripts
        postrotate
          /usr/local/bin/mysqladmin -uroot -p'ルートパスワード' -hlocalhost flush-logs
        endscript
}
ここで、-p'ルートパスワード'は、設定したパスワードを設定してください。ルートパスワードを設定してない時は-p'ルートパスワード'は不要です。

ログローテーションの設定が終わったら、
logrotate -d /etc/logrotate.conf
でエラーがない事を確認してください。

また、
/usr/local/bin/mysqladmin -uroot -p'ルートパスワード' -hlocalhost flush-logs
の行だけコピペしてコマンドライン上で実行させ、
ps ax | grep mysql
でエラーでデーモンが落ちてないか確認してくだい。

samba

cd /usr/local/src/targz
wget http://www.samba.org/samba/ftp/stable/samba-4.0.3.tar.gz
tar xvzf samba-4.0.3.tar.gz
cd samba-4.0.3
./configure
make
make install

注意:samba3まではsource3以下にあるconfigureスクリプトを実行したのですが、samba4にあるsource3以下のディレクトリは前バージョンのソースを流用するために入っているだけなので、source3以下にあるconfigureスクリプトはここでは使いません。使おうとするとmake installの途中で止まります。展開したディレクトリ直下のconfigureスクリプトを実行してください。

雛形のコピー
cp examples/smb.conf.default /usr/local/samba/etc/smb.conf

注意:samba3までは、smb.confファイルは/usr/local/samba/lib/以下に入れていたのですが、samba4では/usr/local/samba/etc/以下に入れる必要があります。これはエラーログ(/var/log/samba/log.nmbd)を見ると判明します。

ライブラリの場所をシステムに覚えさせる
vi /etc/ld.so.conf.d/samba.conf
/usr/local/samba/lib64
/usr/local/samba/lib
ldconfig

自動起動スクリプトの作成
vi /etc/rc.d/init.d/samba
#!/bin/sh
#
# chkconfig: - 91 35
# description: Starts and stops the Samba smbd and nmbd daemons \
#              used to provide SMB network services.

# Source function library.
if [ -f /etc/init.d/functions ] ; then
  . /etc/init.d/functions
elif [ -f /etc/rc.d/init.d/functions ] ; then
  . /etc/rc.d/init.d/functions
else
  exit 0
fi

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

# Check that smb.conf exists.
[ -f /usr/local/samba/etc/smb.conf ] || exit 0

RETVAL=0


start() {
       # If CUPS is used as printing system, reload smb after a 1 minute delay
       # to allow the printers to appear properly as samba shares.
        if killall -0 cupsd 2>/dev/null; then
         ( sleep 60 && killproc smbd -HUP ) &
       fi
       export TMPDIR="/var/tmp"
        echo -n "Starting SMB services: "
        daemon /usr/local/samba/sbin/smbd -D    
        RETVAL=$?
        echo
        echo -n "Starting NMB services: "
        daemon /usr/local/samba/sbin/nmbd -D 
        RETVAL2=$?
        echo
        [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && touch /var/lock/subsys/smb || \
           RETVAL=1
        return $RETVAL
}       
stop() {
        echo -n "Shutting down SMB services: "
        killproc smbd
        RETVAL=$?
        echo
        echo -n "Shutting down NMB services: "
        killproc nmbd
        RETVAL2=$?
        [ $RETVAL -eq 0 -a $RETVAL2 -eq 0 ] && rm -f /var/lock/subsys/smb
        echo ""
        return $RETVAL
}       
restart() {
        stop
        start
}       
reload() {
       export TMPDIR="/var/tmp"
        echo -n "Reloading smb.conf file: "
        killproc smbd -HUP
        RETVAL=$?
        echo
        return $RETVAL
}       
mdkstatus() {
        status smbd
        status nmbd
}       

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  reload)
        reload
        ;;
  status)
        mdkstatus
        ;;
  condrestart)
        [ -f /var/lock/subsys/smb ] && restart || :
        ;;
  *)
        echo "Usage: $0 {start|stop|restart|status|condrestart}"
        exit 1
esac

exit $?
これはsamba4用です。smb.confの設置場所の変更に伴い、一部がsamba3用とは異なります。

起動
chmod 755 /etc/rc.d/init.d/samba
chkconfig samba on
/etc/rc.d/init.d/samba start

パスを通す
vi /etc/profile.d/samba.sh
PATH="$PATH":/usr/local/samba/bin
いったんtelnetから抜けて入りなおす。

ユーザーの作成
useradd ユーザー名
smbpasswd -a ユーザー名
New SMB password: パスワード
Retype new SMB password: パスワード

チューニング
vi /usr/local/samba/etc/smb.conf
   [global]
   server string = サーバー名
   workgroup = ワークグループ名
   log file = /var/log/samba/%m.log
   max log size = 0
   os level = OSレベル
   domain master = no
   preferred master = no
   load printers = no
   unix charset = EUC-JP
   dos charset = SHIFT_JIS
server stringはWindowsのエクスプローラでいうところの「詳細」欄に表示する名前を指定します。エクスプローラでいうところのサーバー名は、ホスト名が自動的に使われます。

max log sizeは0にしておくと無限に肥大してしまうので、別途logrotatedに設定してローテーションさせます。

os levelは33以上にすればWindows2000Serverの32に勝ってマスターブラウザになります。ただし、他にもsambaサーバーがあってマスターブラウザにしたくない場合は低くしておきます。

domain master、preferred master は、このサーバーをドメインマスターやブラウザーマスターにする場合はyesにします。ここではnoにしています。

load printersはsambaサーバーに接続したプリンターを共有として使うかどうか。使わないのでnoにしています。

display charset はSWATで使う文字コードの指定・・・だったんですが、samba4ではUTF8に固定されたらしく、この指定自体ができなくなりました。

ログの管理
mkdir /var/log/samba
useradd samba
chown samba.samba /var/log/samba
vi /etc/logrotate.d/samba
/var/log/samba/*log /var/log/samba/*mbd {
        create 0644 samba samba
        missingok
        sharedscripts
        postrotate
                /bin/kill -HUP `cat /usr/local/samba/var/run/smbd.pid 2>/dev/null` 2> /dev/null || true
                /bin/kill -HUP `cat /usr/local/samba/var/run/nmbd.pid 2>/dev/null` 2> /dev/null || true
        endscript
}
注意:samba3ではpidファイルは/usr/local/samba/var/locksにあったのですが、samba4では/usr/local/samba/var/runに変更になりました。その関係で一部をsamba4用に変更してあります。(・・・っていうか、こういうのってあまり変えないでほしいよね・・・・)

エラーがない事を確認します。
logrotate -d /etc/logrotate.conf

自作ソフトのインストール

urldec、pg_csv、dump2はけっこう便利なのでインストールします。ほとんどの人は使わないと思いますけど・・・。下記のツールが必要ない方は、ここは飛ばしてくださいね。

urldecのインストール
urldecはurlencodeされた文字列をデコードします。apacheのログを解析する時に使います。
cd /usr/local/src/tatgz
wget http://software.aufheben.info/linux/urldec-1.02.tar.gz
tar xvzf urldec-1.02.tar.gz
cd urldec-1.02
make
make install
cd ..

pg_csvのインストール
pg_csvはPostgreSQLのデーターをCSV形式で出力します。エクセル用に強制文字列指定もできます。
wget http://software.aufheben.info/linux/pg_csv-1.03.tar.gz
tar xvzf pg_csv-1.03.tar.gz
cd pg_csv-1.03
./configure
make
make install
cd ..

hexdump2のインストール
hexdump2はファイルの16進ダンプをMS-DOSのDUMPコマンドふうに表示します。
wget http://software.aufheben.info/linux/hexdump2-1.02.tar.gz
tar xvzf hexdump2-1.02.tar.gz
cd hexdump2-1.02
make
make install

watcher2のインストール

自宅や外出先からサーバーのSMTPを使ってメールする場合、自宅や外出先が固定IPなら良いのですが、動的IPだった場合/etc/mail/access.dbに許可IPを書くことができません。そこで、QPOPPERのログを監視して、POP3が成功したIPアドレスに一定期間メールの送信権を与えます。

まずQPOPPERをwatcher対応にコンパイルします。以前はパッチを当てて対応していたのですが、今は./configure時に --enable-log-login をつけるだけで良いです。

次に公式サイトに行ってwatcher2のv1.6をテキストエディターで開きます。

最初の方を少し変更します。
$popperlog = "/var/log/pop3.log"; # logfile for popper
$popauthlog = "/var/log/popauthlog"; # logfile for myself
$syslogpid = "/etc/syslog.pid"; # syslog pid file
$popauth = "/etc/mail/access"; # sendmail database
$makemap = "/usr/etc/makemap"; # makemap command
$mapclass = "hash"; # database class
これはあくまで例です。お使いの環境に合わせて変更してください。

また、このままの状態では、常にPOP3に成功したIPアドレスのみが許可され、常時許可されるデフォルトのIPアドレス、たとえば、192.168.0などが設定できません。ある程度自分が使いやすいようにカスタマイズする必要があります。たとえば、192.168.0は常時許可させる、といったカスタマイズが必要になると思います。

カスタマイズが終わったら、名前をつけて保存します。名前は、例えばwatcher2dlなどとします。改行コードはLFのみにします。それを、バイナリモードでサーバーにアップします。それを、適当なパス(たとえば、/usr/local/bin)にコピーして、
chmod 755 /usr/local/bin/watcher2d
として実行権限を与えます。

さて、問題はこれをどうやって常駐させるか。CentOS5まではinittabに
pbs:345:respawn:/usr/local/bin/watcher2d
というふうに記述して常駐させていたのですが、CentOS6ではこの手が通用しなくなりました。なぜなら、
# inittab is only used by upstart for the default runlevel.
#
# ADDING OTHER CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
って書いてあるからです。え?意味がわからない?えっと、これには、「inittabは起動時のランレベルを判別するためだけに使います。以降、何書いても効果はありません。」っていう意味です。なので、当然watcher2を常駐させる記載をしても無駄です。

仕方ないので、apacheのapachectrlみたいなのを作りました。以下をwatcher2ctrlとして、改行コードLFのみでセーブした後、バイナリモードでアップロードしてください。
#!/usr/bin/perl

$option1 = shift @ARGV;
$option2 = shift @ARGV;

# 初期設定
# ここをお使いの環境に合わせて変更してください

$WATCHER2="/usr/local/bin/watcher2d";

# 常駐チェック ====================================================================

$jochu_cnt=0;
$line_cnt=0;
$status_str="";
$watcher2_process_id=0;
$watcher2_process_cnt=0;

open(IN, "ps axwwww |");
while (<IN>) {
        $line_cnt++;
        if ( /\s*(\d+)\s.*($WATCHER2)/ ) {
                $jochu_cnt++;
                $watcher2_process_cnt++;
                $watcher2_process_id=$1;
                $status_str.="$&\n";
        }
}
close(IN);

# psコマンド失敗なら終了
if ($line_cnt==0){
        die("psコマンド失敗");
}

# 多重起動チェック ====================================

$dame=0;
if ($watcher2_process_cnt>1){
        $dame=1;
        die("watcher2が多重起動しています");
}

#実行フラグ初期化 ====================================

$done_flg=0;

# ストップモード =====================================

if ($option1 eq "stop") {
        if ($jochu_cnt==0) {
                printf("watcher2は常駐していません\n");
        }
        if ($watcher2_process_id>0){
                system("kill -KILL $watcher2_process_id");
                printf("watcher2を止めました\n");
        }
        $done_flg=1;
}

# リスタートモード =====================================
if ($option1 eq "restart") {
        if ($watcher2_process_id>0){
                system("kill -KILL $watcher2_process_id");
                printf("watcher2を止めました\n");
        }
        sleep 3;
        system("$WATCHER2 &");
        printf("watcher2を起動させました\n");
        $done_flg=1;
}

# スタートモード =========================================
if ($option1 eq "start"){
        if ($watcher2_process_id>0){
                printf("watcher2は既に動いてます - %s\n", $watcher2_process_id);
        } else {
                system("$WATCHER2 &");
                printf("watcher2を起動させました\n");
        }
        $done_flg=1;
}

# ステータス表示 =========================================
if ($option1 eq "status"){
        if ($jochu_cnt>0) {
                if ($watcher2_process_id>0){
                        printf("watcher2は常駐しています - %s\n",$watcher2_process_id);
                } else {
                        printf("watcher2は常駐していません\n");
                }
        } else {
                printf("watcher2は常駐していません\n");
        }
        $done_flg=1;
}

# ヘルプ ==============================================================

if ($done_flg==0){
        printf("使い方:\n");
        printf("watcher2ctrl start または stop または restart または status\n");
}
exit();
これをサーバーの/usr/local/binにコピーして、パーミッションを755にします。あとは、apachectrlみたいに使えます。

例)
watcher2ctrl start ・・・・watcher2を起動させます。
watcher2ctrl stop ・・・・watcher2を終了させます。
watcher2ctrl restart ・・・watcher2を再起動させます。

また、サーバー起動時にwatcher2を起動させるために、/etc/rc.d/init.d/watcher2というスクリプトを作成します。
#!/bin/sh
#
# chkconfig: 345 81 35
# description: Starts and stops the watcher2 daemons
#              used to provide watcher2 network services.

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

CONFIG=/usr/local/bin/watcher2d

# Check that smb.conf exists.
[ -f $CONFIG ] || exit 0

# See how we were called.
case "$1" in
  start)
         echo "Starting watcher2..."
         /usr/local/bin/watcher2d &
        ;;

  stop)
         echo "Stopping watcher2 ..."
         killall watcher2d
        ;;
  restart)
        echo "Restarting watcher2 services: "
        $0 stop
        /bin/sleep 3
        $0 start
        echo "done."
        ;;
  *)
        echo "Usage: watcher2 {start|stop|restart}"
        exit 1
esac
ここで注意してほしいのは、watcher2のデーモンの名前と、このスクリプトの名前を同じにしてはいけないという事です。なぜなら、restartのところでkillall watcher2dとしているからです。ここで、このスクリプトもwatcher2dという名前だとこのスクリプト自体がkillallされて止まってしまいます。必ずwatcher2本体とこの起動スクリプトは別名にしてください。

このスクリプトをviかなんかでコピペして、/etc/rc.d/init.d/watcher2に保存して、
chmod 755 /etc/rc.d/init.d/watcher2
chkconfig watcher2 on
とすると、サーバー起動時にwatcher2が自動起動します。

・さらなるカスタマイズ
watcher2はperlで記述されており、可読性も良いです。なので、さらにカスタマイズする事も可能です。たとえば、access.dbだけでなく、hosts.allowやhosts.denyを生成するようにすれば、POP3認証が成功したIPアドレスに一定時間telnet、ssh、FTPの接続権を与えることができます。ただし、その分セキュリティは脆弱になるので、穴の開け過ぎは禁物です。
スポンサーリンク