Sunday, July 4, 2010

php5+mysql4のインストール

インストール順序があるらしい・・のか、php5を最初にインストールしようとしたら、解決できないものが多くて何度やっても入らなかった。

  1. mysql4
  2. apache2
  3. php5

の順序でインストールしたらうまくいった。

  1. #aptitude install mysql-server
  2. #apaitude install apahce2
  3. #aptitude install php5

sources.listにはjaistを設定して、特に躓くこともなくインストール完了。sslを使うときは更にopensslをインストールする。

#aptitude install oepnssl

apache2の設定と起動

編集するファイルは、/etc/apache2/以下で、

  • site-avairable/default
  • site-avairable/ssl (copy from default-ssl)

/etc/apache2/site-avairalbe/default を編集。ちなみに似たような名前のsite-enabledはavarirableのシンボリックリンクになっている。
編集内容はwwwのディレクトリの変更とcgi-binディレクトリ変更など。

<VirtualHost *:80>
        ServerAdmin MAILADDRESS ←★
        DocumentRoot /mnt/share/www/  ←★
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /mnt/share/www/>  ←★
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>

        ScriptAlias /cgi-bin/ /mnt/share/www/cgi-bin/  ←★
        <Directory "/mnt/share/www/cgi-bin">  ←★
                AllowOverride None
                Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
                Order allow,deny
                Allow from all
        </Directory>

        ErrorLog /var/log/apache2/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog /var/log/apache2/access.log combined

#    Alias /doc/ "/usr/share/doc/"    ←★ここから</Directory>までコメントアウト
#    <Directory "/usr/share/doc/">
#        Options Indexes MultiViews FollowSymLinks
#        AllowOverride None
#        Order deny,allow
#        Deny from all
#        Allow from 127.0.0.0/255.0.0.0 ::1/128
#    </Directory>

Option Indexes を設定すると、そのディレクトリにアクセスした時ファイル一覧が見える。sslも使いたいので

#cp default-ssl ssl

としてオリジナルを残してからsslを編集。

sslのモジュールを有効にして、

#a2enmod ssl

これのみだと以下のようなエラーが出る。

SSL received a record that exceeded the maximum permissible length.

(エラーコード: ssl_error_rx_record_too_long)

sslの設定も有効にして、apache2を再起動。

#apache2ctl restart

個人で使う以外の運用は考えていないので証明書は設定しない。

php5の設定

場所は/etc/php5/apache2/php.ini 。文字コードの設定などを行う。特に何もしなくても実行出来るので割愛。

必要ならapacheでphpモジュールを有効にする。

#a2enmod php5

通常はこれだけで、phtml,phpという拡張子のファイルからphpが実行できる。(.htmlでは実行できない)

cgiと同じく実行ディレクトリを制限したい場合は、CGI版を使うらしい。(参考:aki-web PHP質問用BBS

(次のテストスクリプトを実行できず、必要であれば拡張子PHPのファイルをPHPだと認識させるため、site-avairable/defaultに下記追加する。

<FilesMatch \.php$>
    SetHandler application/x-httpd-php
</FilesMatch>

site-avairable/sslにはデフォルトで以下が記述されている。

<FilesMatch "\.(cgi|shtml|phtml|php)$">
               SSLOptions +StdEnvVars
       </FilesMatch>

設定を変えたらapache2を再起動。

テストスクリプトの実行

phpのスクリプトは、<?  ?>で囲んで書く。

#cat /mnt/share/www/test.php

<?

phpinfo();

?>

ブラウザでアクセスしてPHPの情報が表示されたらOK。

Hatena タグ: ,,,

【玄箱】cronのログ出力先変更

debian5.0(lenny)では、syslogdではなくrsyslogdが使われている。rsyslogd.confを編集。
  1. *.*;auth~ で始まる行にcron.noneを追加し、cron.*行をコメントアウトして有効にする
  2. /etc/init.d/rsyslog restart
#
# First some standard log files.  Log by facility.
# auth,authpriv.*                 /var/log/auth.log
*.*;auth,authpriv.none;cron.none                -/var/log/syslog
cron.*                          /var/log/cron.log

参考:。。。わからなくなってしまった。。
Hatena タグ: ,

【玄箱】/etc,/home,/varのバックアップ

/etc, /home, /varをバックアップ。方針は
  1. /etc,/home,/varを/root/backupにコピー(rsync)
  2. コピーした/root/backup以下のファイルを一時保存ディレクトリにtarアーカイブする
  3. 作ったtarアーカイブを保存先のマシンに移動。(samba)
やることは、以前書いたLANDISKから玄箱へのデータバックアップとほとんど同じで、rsync,samba,cronを使う。今回はマシン間を移動するものがtarアーカイブというところが違う程度。
以下設定。
保存先マシン=$SERVERDIR
玄箱の一時保存ディレクトリ= $TMPDIR
tarアーカイブの名前=backup.tar.gz

以下shスクリプト。
#!/bin/sh
#cd /root/backup (rsync -acouv --stats --delete /etc /home /var ./ && tar czf /$TMPDIR/backup.tar.gz /root/backup/ && echo 'etc files bakup sccess.')||echo 'etc files backup failed.'
cd /$TMPDIR
 (mount -t cifs //$SERVERDIR/ /mnt/$SERVERDIR/ -o iocharset="utf8",credentials=/etc/samba/smb_credentials && cp /$TMPDIR/backup.tar.gz /mnt/$SERVERDIR/$DISTDIR && echo 'mount and copy succeed.')||echo 'mnt and copy failed.'
umount /mnt/$SERVERDIR/ rm /$TMPDIR/backup.tar.gz

rsyncで差分がなければ、以下の作業はすべて実行する必要がないが、rsyncの実行結果は常にファイル数などの表示なので、if文の引数にすることは出来ない。したがって、rsyncとtarアーカイブをグループ化し、mountとcpをグループ化して、残りは実行してもしなくても問題ないものだけ残した。 頻度は週1なので、もしcronのログが増えてうるさいと思えたら、その時にまた修正する。

Monday, May 24, 2010

LANDISKを玄箱にバックアップする

うちでは、IO-DATAのLANDISKに写真やデータなどを置き、自宅内の共有ディレクトリとしています。そのデータを玄箱にバックアップしたときのメモです。

やり方の方針:

  1. LANDISKの共有ディレクトリを、玄箱(debian)のディレクトリ構造にマウント
  2. rsyncを使って、マウントしたディレクトリから、玄箱のバックアップ用ディレクトリにデータをバックアップ
  3. バックアップが終わればumount
  4. 1~3の作業をcronで1週間に一度動かす

大きく4つに分かれます。まず、LANDISKはsamba(2.2らしい?)でディレクトリを公開しています。これを玄箱でマウントして、ローカルにあるディレクトリやファイルと同じように扱えるようにします。マウントせず、sshを使ってrsyncする方法もありますが、LANDISKはなるべく買ってきた時の状態のまま、hackなどせず使いたいので、マウントする方法をとります。
次に、rsyncでデータのバックアップを取ります。ここは文字化けに悩んだところです。
終わったらumountして、これを週に一度実行するようcronに書きます。

以下は具体的なやりかたです。

LANDISKの共有ディレクトリを玄箱debianのディレクトリ構造にマウント




LANDISKのホスト名を仮に、ここではLANDISK-SERVERとします。
LANDISKの共有ディレクトリ、玄箱debianのマウントポイント、バックアップディレクトリは次の通り。やることは2つ。

  1. 玄箱のマウントポイントと、バックアップ先ディレクトリを作成
  2. mountコマンドはroot権限で実行するので、玄箱側につくるディレクトリの所有者権限は、ユーザーroot、グループrootにする

LANDISK-SERVERの共有ディレクトリ
photo
music
data

玄箱(debian)側のマウントポイント(mkdirで作る。ユーザーroot、グループroot)
/mnt/LANDISK-SERVER/photo
/mnt/LANDISK-SERVER/music
/mnt/LANDISK-SERVER/data

バックアップ先のdebian側のディレクトリ(mkdirで作る。ユーザーroot、グループroot)
/mnt/backup/LANDISK-SERVER/photo
/mnt/backup/LANDISK-SERVER/music
/mnt/backup/LANDISK-SERVER/data

一方、マウントするときのsambaユーザーとパスワードは
smb_credentials
というファイルを作って保存することにする。ファイルの内容は次の2行。
#vi smb_credentials
username="USERNAME"
password="PASSWORD"

cronで実行するときのために、実行ユーザーであるrootのみ読み書き可、所有者とグループも変更する。
#chmod 600 smb_credentials
#chown root.root smb_credentials


作ったファイルを/etc/sambaに置く。(ここがふさわしいかどうかは分かりません)
#mv smb_credentials /etc/samba/


以上より、mount実行コマンド※は次のようになる。たとえば共有ディレクトリがphotoの場合。
#mount -t cifs //LANDISK-SERVER/photo /mnt/LANDISK-SERVER/photo -o
iocharset=utf8,credentials=/etc/samba/smb_credentials

(smb_credentialsファイルを使わずにマウントしたいとき:
#mount -t cifs //LANDISK-SERVERNAME/music /mnt/LANDISK-SERVERNAME/music -o
iocharset=utf8,username=****,password=*****,credentials=/etc/samba/smb_credentials


※マウントにはsmbmountを使う方法もあるが、どうしても文字化けが解消できなかったのでmount -t cifsを使う。cifsはsmbを包括したプロトコルらしく、コチラのほうがオススメだとか読んだ。文字化けが解消出来なかった話についての詳細は、この記事の続きに書いておくので、何かの役に立てばいいなと。

実際にマウントをテストしてみて、文字化けするようなら次を試す。

玄箱のsambaサーバの設定を編集 smb.conf
[global]
dos charset = CP932
unix charset = UTF8
display charset = UTF8
ロケールがちゃんと設定されているか調べる。ここではUTF8
#dpkg-reconfigure locales
ja-jpUTF8を選択。suのときの「パスワード」など日本語が表示されればOK。

ここでなぜ、mountの文字化けにsambaサーバの設定が関係するのかわからないが、今の時点で調べる必要性がなく、他にやりたいこともあるので、とりあえずこのままにしておく。

rsyncでバックアップ



次に、マウントしたディレクトリをバックアップ用ディレクトリにrsyncでバックアップするコマンド。 たとえばmusic。
#rsync --verbose --progress --recursive --times --perms --compress --delete
/mnt/LANDISK-SERVERNAME/music/ /mnt/backup/LANDISK-SERVERNAME/music/


オプション説明
verbose 転送情報を詳しく表示
progress 転送中の情報を表示
recursive ディレクトリで再帰的に実行
times タイムスタンプを維持
perms パーミッションを維持
compress 受信側に送信されるデータを圧縮する
delete 送信側に存在しない受信側にあるファイルを削除

rsyncの詳細はここを参照。
http://www.infoscience.co.jp/technical/rsync/rsync.html

ここで、バックアップ元の最後の「/」だが、これの有無で挙動が変わるので注意。
もし「/」がある場合は、musicの下にあるファイルをバックアップする。
スクリプト:
/mnt/LANDISK-SERVERNAME/music/

実行結果:
#ls /mnt/backup/LANDISK-SERVERNAME/music/
music01.mp3
music02.mp3

「/」がない場合、musicを含めてその下にあるディレクトリをバックアップする。
スクリプト:
/mnt/LANDISK-SERVERNAME/music

実行結果:
#ls /mnt/backup/LANDISK-SERVERNAME/music/
music

付け忘れに注意。楽しようと思って/LANDISK-SERVER/をいきなりマウントしようとしてみたが、これはできなかった。

cronでスケジュール化するためにスクリプトを準備する



バックアップしたいディレクトリを列挙したLANDISK-backupdir.txtを作成。
#vi ~root/LANDISK-backupdir.txt
photo
music
data
video/movie
web


スクリプトを書く。ファイル名は、LANDISK-backup。
#cd /etc/cron.monthly/
#vi LANDISK-backup

#
# LANDISK backup script
#
#!/bin/sh
SERVER="サーバの名前"
for dn in `cat ~root/$SERVER-backupdir.txt`
do
(mount -t cifs //$SERVER/$dn /mnt/$SERVER/$dn -o iocharset="utf8",credentials=/etc/samba/smb_credentials && rsync --verbose --progress --recursive --times --perms --compress --delete --iconv=. /mnt/$SERVER/$dn/ /mnt/backup/$SERVER/$dn/ && umount /mnt/$SERVER/$dn && echo 'backup success.')||echo 'backup failed!'

基本的に、マウントする、rsyncする、umountする、を繋げただけ。成功・失敗はechoで表示するようにした。

mountコマンドを実行出来るのはrootだけなので、このスクリプトはrootが実行する。
#chmod 755 LANDISK-backup

スクリプトの中で、もし、mount、rsyncコマンドを1行ずつに分けて書くと、最初のマウントの成功如何に関わらず、rsyncを実行してしまうことになる。そのため、万一マウントに失敗すれば、バックアップしたデータが全部消えてしまう。
実際、最初は1行ずつ書いていた。その上、「rsyncを使うのはバックアップ専用ユーザーがいいですよ」という記事を見かけて、backup用ユーザーを作ったはいいが、実行してみればrootじゃないのでマウントに失敗し、それなのに1行ずつ書いているのでrsyncが実行され、空っぽのディレクトリをバックアップ元だと思ったrsyncが、2日かけてバックアップしたデータを全部消してしまった。orz。

だから、上ではmountに成功したら次へすすむようにしている。
chkmount=`mount~~`のような感じに、結果の成否を変数に入れられればif文が使えてわかりやすくなっていいなと思ったが、これで代入されるのは実行結果なので使えなかった。結局このような長い1行に。

cronでスケジュール化


長々と書いてきたが、結局、作成したファイルは次の3つ。

  • /etc/samba/smb_credentials(LANDISKの共有ディレクトリを見るためのユーザー名とパスワード)
  • ~root/LANDISK-backupdir.txt(LANDISKの共有ディレクトリを列挙したもの)
  • /etc/cron.monthly/LANDISK-backup(スクリプト)

スケジュールはWebminの。「システム→予定済みCron作業」から設定。
(手動でやる場合は、/etc/crontab。*印が左から順に、「分」「時」「日」「月」「曜日」。
* * * * * [実行コマンド]
参考:http://www.server-memo.net/tips/crontab.html)

以上。

おまけ