woodyでウェブサーバ
私のメモです。参考になればいいですが、間違っていたらごめんなさい。
戯れ言
--------------------------------------------------------
Thanks to 
これまでVineLinuxでサーバを立てていたが、kernel + base system + apache + Xだけ
入れたいのに、いらないモノがゴッソリ入ってしまう。サーバを選択してインストール
したのに1.2GBも食う。そこで、最小インストールには最適なDebianをCube型PCのサーバ用OSと
した。
○インストール
最近だと雑誌の付録とかに付いてくるようになったが、ADSL環境にあるなら
ネットワークインストールがお奨めである。
Debianのウェブページから辿っていくと、
インターネット経由の Debian GNU/Linux のインストール
に行き着いた。ここからリンクされている最小のCDからISOイメージをダウンロードし、CD-RWに焼いて
インストールした。
インストールは特に難しいこともなく、NorthBridgeにあるPCI to AGP Bridgeを認識
しない以外は全てのデバイスを認識した。リブート後のパッケージの選択では、Xとウェブサーバを
選択してインストールした。インストール後の容量は450MB弱。さすがDebian。。。
Back to MENU
○Xの設定
EPIA-Mシリーズで使われているNorthBrigde CLE266は、まだXでサポートされていない。
しかし、VIAはLinuxへも協力しているようで、
VIA Arenaというサポートページで
Linuxのドライバも公開している(公開場所はここ)。
そこから同じカーネル&Xのバージョンを使っているMandrake8.2用のドライバをダウンロードして
入れてみた。解凍して出てくるInstallation.txt、vinstallを読みながら、手動でインストールして
XF86Config、/etc.modulesを設定したが、カーネルのバージョン(ディストリビューションの
リビジョン含む)が違うためドライバをロードできなかった。
VIAのドライバは使えないので、VESAドライバで立ち上げたところなぜか画面がモニターからはみ出て
しまう。これはなぜかScreen Sectionの8bbp、24bbpを設定しているDisplay Subsectionを削除したら
ちゃんと表示されるようになった。
VESAドライバの割に、i815よりも綺麗である。また、ウェブを見たりした感じでは
不安定という印象は無かった。なかなか良いと思われる。とはいえ、サーバにXは不要なので
/etc/inittabのinitdefaultを3に設定し、/etc/rc3.d/S99xdmをK99xdmにした。
Back to MENU
○apacheの設定
DebianもVine同様にある程度セキュアな設定があらかじめしてあるので、
特に設定を行っていない。但し、SSIとcgiを動かすために、コメントアウトさている次の
行のコメントアウトを解除した。
LoadModule includes_module /usr/lib/apache/1.3/mod_include.so
AddHandler cgi-script .cgi
AddType text/html .shtml
AddHandler server-parsed .shtml
もちろん、SSIを走らせるディレクトリには、OptionにIncludesを追加している。
また、charsetをEUC-JPに指定しているhtmlファイルが文字化けするので、AddDefaultCharset off
に設定した。
Debianではapacheがwww-dataというユーザ権限で動いている。そのため、
公開する文書があるディレクトリ以下は、次のパーミッションに設定した。
- 全ディレクトリ、ファイルをchown www-data、chgrp www-dataにする
- ディレクトリ : chmod 311
- ファイル : chmod 440
- Scriptファイル: 実行内容に応じて最小限の設定をした
ディレクトリに読みとり権限を与えないのは、indexファイルが無かった際にディレクトリ一覧を
表示させないためである。またファイルはwww-dataユーザorグループ以外からは読みとれ無いよう、
最小限の設定にしている。
その他(認証の設定、不要なサービスの停止など)は
VineLinuxの時と同じである。
恐らく、セキュリティ上学ばなくてはならないこと、設定を改善すべきところが
あるのだろうが、取りあえずはこれでまともにウェブページが表示され、SSI、CGIが動くようになった。
Back to MENU
○iptablesの設定
後述にあるように、サーバでsshdを走らせて別のPCからPuTTYで管理するため、
以前よりportが1つ多く空くことになる。VineLinuxでサーバを立ててた時は、iptablesに
ポートを設定していなかった。今回は、ローカルアドレス
からのsshd(port 22)とwww(port 80)、及びインターネット側からのwww(port 80)を
許可することとした。但し、プロトコルを指定しないとportの設定は有効にならないようなので、
合わせてプロトコルも指定した。一例を以下に示す。これは/etc/network/interfaceファイルに
追記されている。
up iptables -F
up iptables -P INPUT DROP
up iptables -P FORWARD ACCEPT
up iptables -P OUTPUT ACCEPT
up iptables -A INPUT -i lo -j ACCEPT
up iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
up iptables -A INPUT -p tcp -i eth0 -s 192.168.0.0/24 --dport 80 -j ACCEPT
up iptables -A INPUT -p tcp -i eth0 -s 192.168.0.0/24 --dport 22 -j ACCEPT
up iptables -A INPUT -p tcp -i eth0 -s xxx.xxx.xxx.xxx/yy --dport 80 -j ACCEPT
|
# 設定の初期化
# INPUTの全てを破棄
# FORWARDの全てを許可
# OUTPUTの全てを許可
# ループバックアドレスは全て許可
# 接続済みのものは全て許可
# ローカルアドレスのwwwを許可
# ローカルアドレスのsshを許可
# インターネットの指定したアドレスのwwwを許可
|
Back to MENU
○sshdの設定
今回、Cube型PC用のモニタやキーボードは買っていないので、
別のPCからリモート管理することになる。セキュアなリモート管理方法として、
telnetの代わりにSSH2(OpenSSH protocol version2)を使った。
下のウェブサイトを参考に、以下の目的で各種設定した。
- sshdにログインするのは限られたクライアントPCとする
- WindowsでPuTTYを使い、鍵による認証でログインする
PuTTYの設定は、Windowsのページを参考のこと。
- /etc/ssh/sshd_configの設定
いろいろ調べた末、sshd_configの設定を下のように変更した
Protocol 2
PermitRootLogin no
RSAAuthentication no
PasswordAuthentication no
|
# sshdが使用するprotocolバージョン。SSH1を使用しないので2のみを記述
# rootでのログインを許可するかどうか。sshログイン用のユーザを作成後に無効にした。
# DSAを使用するためRSAでの認証は許可しない。
# 鍵ではなくパスワード認証によるログインは拒否するのでno
|
但し、PuTTYでPassword認証でログインしながら設定していたため、
ちゃんと鍵のみでログインできるようなってからPasswordAuthenticationはnoにした。
- /etc/hosts.allow、/etc/hosts.denyの設定
sshd_configで認証方法を制限したが、どのアドレスからの接続を許可する
かは設定できないようだ。参考にしたウェブの中にはListenAddressで指定できるという
ものもあるが、実際に設定してもそのような動作はしなかった
(SSH1用なのか?)。
よくよく調べると、ListenAddressはネットワークカードが2枚ある時にどちらか一方だけ
から接続を受け付けるような場合に使うようだ。
さて、sshdへアクセスするホストの制限は、/etc/hosts.allowと
/etc/hosts.denyで設定する。具体的には次のように設定した。
- /etc/hosts.deny
sshd: ALL # hosts.denyで一度全ての接続を拒否。
- /etc/hosts.allow
sshd: 192.168.0.xxx # 接続を許可するPCのアドレス
- ユーザの作成と公開鍵のコピー
sshdで接続するユーザを作成し、~/.ssh/以下に
PuTTYのputtygen.exeで作成した公開鍵をコピーする。(以下はフロッピーにて
コピーをする場合である)
# useradd -m User Name
# mount /floppy
# su User
# mkdir /home/User/.ssh
# cp /floppy/key file /home/user/.ssh/authorized_keys2
# chmod 600 /home/user/.ssh/authorized_keys2
|
# -mはユーザディレクトリ作成&スケルトンコピーのオプション
# 以下はUserとして作業する
# ssh用設定ディレクトリを作成
# ファイル名はSSH2なのでauthorized_keys2とする
# 公開鍵のパーミッションをUser以外は読めないように変更
|
Windowsで作成した公開鍵は、改行文字(^M)が入っていないかを
チェックすること。またputtygen.exeで作成した公開鍵を「Save public key」で保存した
ファイルは、上述のauthorized_key2ではなくSSH1用の鍵(authorized_keys)である。
SSH2での公開鍵は、putygen.exeの
「Public key for pasting OpenSSH authorized_keys2 file」の下に出てくる文字列を
メモ帳にコピー&ペーストしたもので、中身は1行の文字列である。
Back to MENU
○sshで参考にしたウェブページ
○カーネルの再構築
どうせやるなら徹底的にということで、ネットワーク向けにカーネルを
再構築することとした。
# apt-get install kernel-source-2.4.18
# apt-get install kernel-package
# apt-get install libncurses5-dev
# cd /usr/src
# tar jxvf kernel-source-2.4.18
# ln -s kernel-source-2.4.18 linux
# cd /usr/src/linux
# make menuconfig
|
### 安定版の最新カーネル
### Debianのカーネル再構築ツールmake-kpkg用に必要
### make menuconfig用に必要
### ソースのあるディレクトリに移動
### apt-getでインストールされるのはbz2ファイルなので、それを展開
### 展開して出来たディレクトリkernel-source-2.4.18へのシンボリックリンクlinuxを作成
### /usr/src/linuxへ移動
### コマンドラインなのでmake menuconfigを使う
|
設定のポイントは次の通り。
- CPUはCyrixIII/C3を選択
- ネットワークデバイスのVIA Rhineはカーネルに組み込む
- ブートパーティションがext3なのでそれをカーネルに組み込む
- Kernel httpd Accelerationを有効にしてみる
- その他、周辺デバイスは全てモジュールにする
できあがったコンフィグレーションファイルは
これ。
その後は、カーネルを再構築してdpkgコマンドでインストールする。
# make-kpkg --revision 20030211 kernel-image
# cd ..
# dpkg -i kernel-image-2.4.18_20030211_i386.deb
(/etc/lilo.confを確認)
# lilo -v
|
### 適当なリビジョンを設定してカーネルの再構築
### 一つ上のディレクトリに移動。コンパイルに成功しているとkernel-image*.debファイルがあるはず。
### dpkgでインストール。liloをインストールするかと聞かれるが、取りあえずはnoを選択。
### liloの設定を確認した後、新しいカーネルが使えるようにliloをインストール
|
できあがったカーネルで起動したところ、問題なく起動した。但し、woodyインストール
直後のdmesgで認識(?)していた次のモジュールはmodprobeで組み込めなかった。
実際にデバイスが使われていないのでirqが割り振られていないためと思われる。
- 3ware Storage Controller device(3w-xxxx.o)
- Tekram DC390 SCSI Controller(tmscsim.o)
- モデル(MC97 Modem)があるようだが、使う予定がないので無視した
○カーネルの再構築(ATA133対応)
VIA Arenaの
VIA EDEN用ドライバのページ
から、North Bridge "VT8235"用のLinuxドライバパッチファイルがあることを知った。
早速パッチを当ててみる。
まず、Linux Arena
へ行き、Linux用IDEドライバパッチ
をダウンロードする。後は以下の手順でパッチを当ててカーネル再構築を行う。
# mkdir {適当なディレクトリ}
# cd {適当なディレクトリ}
# wget http://downloads.viaarena.com/drivers/IDE/ATA133-Linux-PatchFile-V20.zip
# unzip ATA133-Linux-PatchFile-V20.zip
# gunzip mdk8.2-patch-2.4.18-vpide.gz
# cp mdk8.2-patch-2.4.18-vpide /usr/src/
# cp /usr/src/linux/drivers/ide/ide-timing.h /usr/src/linux/drivers/ide/ide-timing.h.back
# cp /usr/src/linux/drivers/ide/via82cxxx.c /usr/src/linux/drivers/ide/via82cxxx.c.back
# cp /usr/src/linux/include/linux/pci_ids.h /usr/src/linux/include/linux/pci_ids.h.back
# patch -p0 < mdk8.2-patch-2.4.18-vpide
|
### 作業用に適当なディレクトリを作成
### 作成したディレクトリに移動
### wgetでパッチをダウンロードする
### unzipコマンドで解凍
### 解凍された*.gzファイルをgunzipで解凍する。ここではMandrake用のパッチを使った
### パッチを/usr/srcディレクトリにコピーする。
### mdk8.2-patch-2.4.18-vpidでパッチの当たるファイルのバックアップをとる(計3つ)。
### どのファイルにパッチが当たるかは、mdk8.2-patch-2.4.18-vpidをvi等で見ると分かる。
### "diff"で始まる行にパッチが当たるファイルが記述されている。
### パッチを当てる。
|
パッチを当てると、1カ所パッチが当たらない部分があり、via82cxxx.c.rejと言う
ファイルが/usr/src/linux/drivers/ide/以下に作成される。内容を見ると、削除する「via_80w = 0;」
という行がオリジナルファイルに無いためにエラーになっている。元々削除するものだったので、
このエラーは問題ないだろう。
後は上述のようにカーネルを再構築すればVT8235を認識し、ATA33→ATA100になり、
PIO→DMAになる。確認等は、パッチを当てる前後で
# hdparm -i /dev/hda
とするとDriver Supportの行にATA-6(UltraATA133)が表示されることで分かる。
(或いはhdparm -t /dev/hdaとして、ベンチマークをしてみると分かる。パッチを当てないと
4MB/sだった転送速度が30MB/s強になるはずである。)
参考
○Samba
によるCD-ROMの共有
最近では雑誌の1年分の記事がDVDになることが多い。
これをサーバに置いておけば、自分のPCから見ることが出来る上、自分のPCのCD-ROMドライブを
空けて置くことができる。そこで、Samba
を使ってCD-ROMをWindows PCから見れるように設定した。
- Sambaのインストール
これは、apt-get isntall sambaでOK
- smb.confの設定
- global setting
日本語を扱う※ので、codingの設定を2つ追加した。
※ CD-ROMの日本語表示に対応していないカーネルでは
この設定だけでは日本語フォルダ/ファイル名を表示できない。
- coding system = euc
- codepage = 932
- cdrom setting
/etc/samba/smb.confを編集してCD-ROMセクションを設定した。
とは言え、サンプルの設定でほぼOKであるため、コメントアウト「;」を
外すだけで良い。但し、CD-ROMを取り替える可能性があるので、
preexec、postexecのコメントアウトも外した
- iptablesの設定
Samba関係のportを空けるため、/etc/network/interfaceに次の設定を追加した。
- up iptables -A INPUT -p tcp -i eth0 -s 192.168.0.0/24 --dport 137:139 -j ACCEPT
- up iptables -A OUTPUT -p tcp -o eth0 -d 192.168.0.0/24 --sport 137:139 -j ACCEPT
ちなみにmount -t smbfsを使ってWindowsの共有フォルダをLinuxにマウントするには、次の設定
が必要である。
- apt-get install smbfs
- up iptables -A OUTPUT -p tcp -o eth0 -d 192.168.0.0/24 --dport 139 -j ACCEPT
これでmount -t smbfs -o {Options} //{ServerName}/{ShareFolder} /{Mount Point} でマウント
できるようになる。
○DynamicDNSと
DiCE
Yahoo!BBの仕様が変わったようで、12〜24hに1回グローバルIPアドレスが
変更されてしまう。そのたびに友達にIPアドレスを教えるのが面倒なので、
DynamicDNSを利用することにした。
- DynamicDNSの登録
いろいろ探した結果、
ZiVE
に決定した。理由は次の2つ。
- メールアドレスだけで登録できる
- 日本語のサイトである
- DiCE
の導入
ZiVEでは、サーバ管理者がIPアドレスが変更するたびに設定しなくては
ならない。それを自動で行うのがDiCEである。インストール方法などは、
GA PO さんの
DiCE,DynamicDNS設定
に書かれた通りである。その他の設定のポイントは次の通り。
- DiCE for Linuxは日本語が表示できる端末が必要。
サーバ機のXで設定するならkterm、
Windowsのターミナルエミュレータからリモートで設定するなら
日本語表示できるPuTTY
を使うと良い
- 上記の端末を使っても日本語が表示できない
次のコマンドでLinuxのlocaleをja_JP.eucJPに設定する。
# dpkg-reconfigure locales
このとき、defaultのlocaleはCでOKである。また、日本語表示可能な
PuTTYを使っている場合は、「ウィンドウ」→「変換」で「受信データは
次の文字セットとみなす」を”EUC-JP"にする必要がある。
○
DiCEの
動作とiptablesの追記
- DICEの動作
iptablesに次のチェーンを追加する。
- iptables -A OUTPUT -d ! 192.168.0.0/24 -j LOG --log-level info --log-prefix 'iptables.log '
- iptables -A INPUT -s ! 192.168.0.0/24 -j LOG --log-level info --log-prefix 'iptables.log '
上記の設定は、OUTPUT(INPUT)チェーンで、送信先(受信元)の
IPアドレスがローカルのもの以外を/var/log/messegeファイルにログを記録する。
LOGのオプションの--log-levelによってログを取るレベル(ここではinfo)を、
--log-prefixによってLOGに残す文字列を指定している。
チェーンを追加後、DiCEでZiVEの更新を行うイベントを実行する。
イベント後、
# cat /var/log/messeges |grep iptables.log
を実行して、どこに接続しているかを見ると、次の順で接続していた。
- 自分のDNSサーバ
- IPアドレス検出スクリプトのあるサーバ(beta.dyndns.org又はhi-ho.ne.jp)
- ZiVE
後は上記iptablesに追加するだけである。
ちなみに、上述のDiCEの動作は、次の通りと思われる。
- LANカードのIPアドレスをDNSサーバに問い合わせ
これはLANカードにグローバルIPアドレスが
割り振られている時に有効
- 1で検出できない場合、外部スクリプトによりIPアドレスを検出
ブロードバンドルータを使ってLAN内にサーバが有る
場合に使用される。
- 上記で検出したIPアドレスをZiVEに通知して更新
ちなみに、2のスクリプトのURLは、DiCEをインストールした
ディレクトリにあるipcheck.datファイルに記述されている。
- iptabelsのチェーンの追加
上記のログに記述されたIPアドレスを追加した。
- INPUTチェーンの例
- iptables -A INPUT -p tcp -i eth0 -s IP Address --sport 80 -j ACCEPT
又は
- iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- OUTPUTチェーンの例
- iptables -A OUTPUT -p tcp -o eth0 -d IP Address --dport 80 -j ACCEPT
接続要求は必ず自分のサーバからtcpのport 80(= www)で行われる。
そのため、INPUTに接続を保持するチェーン(2つ目のチェーン)がある場合は、
改めてチェーン(1つ目)を追加する必要はない。
○USB2.0のHDD増設
ハードウェアのCube型PCの「HDDの増設」
に書いたように、Cube型PCに250GBのUSB2.0外付けHDDを増設した。このHDDを新しいWeb公開領域にするため、
次の手順でLinuxの設定を行った。
- カーネルの再構築
USB2.0でHDDを認識するように、EHCIドライバを有効にする。make menuconfigで
「USB support」→「EHCI HCD (USB2.0) support」を有効(M、又は*)にする。
その後、カーネルを再構築&インストールをする。
- murasakiの設定
モジュールとして組み込む場合、murasakiの設定を行う。
/etc/murasaki/murasaki.preloadにehci-hcdを追記する。
- 再起動後、USB HDDを挿す
挿すだけで/dev/sdaのSCSIディスクとして認識される。
/var/log/messagesには次のように出力された。
Cube kernel: hub.c: new USB device 00:10.3-1, assigned address 3
Cube kernel: usb.c: USB device 3 (vend/prod 0x7f7/0x118) is not claimed by any active driver.
Cube kernel: Initializing USB Mass Storage driver...
Cube kernel: usb.c: registered new driver usb-storage
Cube kernel: scsi0 : SCSI emulation for USB Mass Storage devices
Cube kernel: Vendor: HDS72252 Model: 5VLAT80 Rev: V36O
Cube kernel: Type: Direct-Access ANSI SCSI revision: 02
Cube kernel: Attached scsi disk sda at scsi0, channel 0, id 0, lun 0
Cube kernel: SCSI device sda: 488397168 512-byte hdwr sectors (250059 MB)
Cube kernel: sda: sda1
Cube kernel: USB Mass Storage support registered.
- パーティションの作成
USB2.0のHDDとして認識したので、まずfdiskでExt3の領域を確保する。
# fdisk /dev/sda
Command (m for help): d
Partition number (1-7): 1 (Windowsで作成したNTFS領域を消去)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-30401, default 1):(Return)
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-30401, default 30401):(Return)
Using default value 30401
Command (m for help): w
- フォーマット、マウント、ファイルのコピー
Ext3でフォーマット、その後マウントして、Webとして公開しているディレクトリ
(/var/www/html)以下のファイルをコピーする。
# mkfs -t ext3 /dev/sda1
# mount -t ext3 /dev/sda1 /mnt/temp
# cp -Rp /var/www/html /mnt/temp --- ファイルの属性を変更しないようpを付ける
# umount /mnt/temp --- /dev/sda1をマウント解除
- /var/wwwの入れ替え
/dev/sda1に/var/www/html以下がコピーされたので、元々/var/wwwに
マウントしてた/dev/hda6をアンマウントし、/var/wwwに/dev/sda1をマウントする。
# /etc/init.d/apache stop --- 起動しているapacheを止める
# umount /var/www
# mount -t ext3 /dev/sda1 /var/www
# /etc/init.d/apache start --- apache再開
- /etc/fstabの更新と起動スクリプトの作成
最後に、リブートした後にもちゃんと/dev/sda1がマウントされるよう設定
する。僕はEHCIをモジュールで組み込んでしまったので、murasaki起動後にUSB HDDをマウント
する超簡単なスクリプトを書いた。
スクリプトの前に元々/var/wwwにマウントしていた/dev/hda6を
/etc/fstabから削除(コメントアウト)する。
修正前:/dev/hda6 /var/www ext3 defaults 0 0
修正後:#/dev/hda6 /var/www ext3 defaults 0 0
次に/etc/init.d/にusb_hdd_mounterという名前の簡単なスクリプトを
作成した。
#!/bin/bash
HDD=/dev/sda1
FLAGS="defaults 99"
test -b $HDD || exit 0 #ブロックデバイス/dev/sda1があることを確認(普通はある)
RUN_SERVER=1
case "$1" in
start)
if [ $RUN_SERVER = 1 ]
then
echo "Mounting USB HDD..."
mount -t ext3 $HDD /var/www
fi
;;
stop) # stop,restartを引数で渡された際は、手動で行うよう促すのみ
echo "Sorry, please stop by hand..."
echo "If running apach, then stop by hand after stoppin apach..."
;;
force-reload|restart)
echo "Sorry, please restart by hand..."
;;
*)
echo "Usage: /etc/init.d/$0 {start|stop|restart}"
exit 1
;;
esac
exit 0
上記のスクリプトをupdate-rc.dコマンドを実行することによって
/etc/rcX.d/にシンボリックリンクを貼る。
# update-rc.d usb_hdd_mounter defaults 99 (実行するのが最後になるよう99を指定)
これで設定完了。時間が有れば、起動スクリプトを修正しよう。。。
ちなみに、640MBのデータをIDE HDDからUSB HDDにコピーした際の時間は43秒、
IDE HDDからIDE HDDにコピーした際の時間は46秒であった。意外と早いのにはビックリ。