Xserver、SixCoreで、拡張子htmlでphp
Xserver、SixCoreのサーバで、拡張子htmlのファイルをphpスクリプトとして認識させるためのhtaccess。
AddHandler x-httpd-php .html
最近はこの記述で通るサーバが多いっぽい。それぞれ独自拡張とか、いろいろあるだろうから仕方ないのだろうけど、普通にしてくれよ、普通に。
Xserver、SixCoreのサーバで、拡張子htmlのファイルをphpスクリプトとして認識させるためのhtaccess。
AddHandler x-httpd-php .html
最近はこの記述で通るサーバが多いっぽい。それぞれ独自拡張とか、いろいろあるだろうから仕方ないのだろうけど、普通にしてくれよ、普通に。
今回の話題はSFTPでなくてFTPS。SSHが絡む方でなくてFTP over SSL。
lftpというソフトウェアを教えていただいた。通常のftpと比較して、より高機能なFTPクライアントだ。評価の高いソフトウェアのようだが、一番気に入ったのはCentOSのリポジトリからyumでインストール出来るところ。下手に他のリポジトリを使ったり、ソースからインストールしたりする手間がない(ソースからインストールするのが嫌なのではなく、インストールしたソフトを生涯管理していくのが嫌)。
インストールはコマンド一発。
yum install lftp
で、実現した方法は以下のとおり。
set ftp:ssl-auth TLS
set ftp:ssl-force true
set ftp:ssl-allow yes
set ftp:ssl-protect-list yes
set ftp:ssl-protect-data yes
set ftp:ssl-protect-fxp yes
open example.com
user username password
lcd /path/to/backup
cd /path/to/source
mget *.gz
mrm *.gz
close
quit
上記をファイルにしておいて、lftp -fの引数にファイル名を与えればOK。
これで共用サーバでもセキュアなバックアップが出来る(まぁ、共用サーバがセキュアでない、と言われるとそれ以上はなんとも言えないけど)。
一つのディレクトリ内にファイルをバックアップしていて、各ファイル名の前には日付(例えば20110412)を付与してある。このとき、例えば20110412で始まるファイル名のファイルの合計サイズを知りたくなった(1日あたりどのくらいの容量が消費されるのか知りたかった)。
du -c 20110412*
おぉーできた。
共用サーバも自動で毎日バックアップを取ることにした。
今回クライアントに提供しているサーバ(VPS)のバックアップを外部サーバに自動バックアップをとるように設定したのだが、その理由は2つ。
過去に何度となくトラブルに遭遇し、その都度痛い目を見ているので、今回はすごく真面目に取り組んでいる(気付くのが遅い・・・)。そしてこれを機に運用中の共用サーバもバックアップをとることにしたというわけ(サーバの停止はそのまま収入の減少にもつながるので)。
まずサーバでバックアップ用のコマンドが使えるかどうかチェック。PHPが使えるのでsystem関数を使ってパスが通っているかどうかをチェックする。
system(‘which mysqldump’);
system(‘which tar’);
system(‘which bash’);
system(‘which gzip’);
system(‘which ssh’);
system(‘which ftp’);
system(‘which expect’);
var_dump(__FILE__);
コマンドがあればパスを吐き出してくれる。うん、うん、だいたい使えそう。
MySQLはmysqldumpで吐き出す。この時、最初は-xオプションでロックをかけようとしていたのだけれど、それだとdumpできなかった。まぁ、共用サーバだからしょうがない。-xオプション無しでdump。そしてそれをパイプに渡してgzip。これでOKだ。現在使っている共用サーバは複数のMySQLデータベースを使用できるのだが、それらのユーザ情報は共通にしてあるので、–all-databasesオプションを使えば一発で全てのDBをdumpできる。
次にファイル。HTMLとかPHPとか画像とか。これはtarで固めてgzip。ただしバックアップファイルの保存先を上手く指定してやらないといけない。あとメールデータとかゴミとか不要なのはデータ領域の無駄なのでバックアップしない。そのためシェルスクリプトを組んで、バックアップをとるデータのリストを作成し、それを引数としてtarに渡すことにした。これでファイルのバックアップもOK。
上記の二つはcronで1日1回処理。これを外部サーバに転送する。上記二つの処理は一つのシェルスクリプト内で記述しているのでそこで完結させたいのだが、外部サーバのログイン情報を共有サーバに保存しておいておくのはとてもイヤ。だからやむなく外部サーバから共有サーバをつつくことになる。今回はFTPにした(しかも非暗号化・・・)。FTPSでコマンドラインでのアクセス方法がわからなかったので仕方なかった。
もうひとつの方法として、共有サーバで圧縮したファイルの保存先を共有SSL領域にしておいて、そこに対して外部サーバからwgetというのも考えた。これでベーシック認証かけてIPアドレスではじいておけば、こちらのほうがベターかも知れない。それはそれで今後の課題とする。
何はともあれ、root権有りサーバも、root権無しサーバも、自動バックアップが出来るようになった。あとは・・・もうちょっと手を加えれば完了。
対象ディレクトリのバックアップを作成し、コマンド一発でリモートサーバに転送する方法を書いたが、この方法だとパスワードを聞かれてしまう。バックアップは定期的かつ自動的に実行されて欲しいのだが、この方法では都度パスワードを入力しなくてはいけないので、自動的という訳にはいかない。パスワードの自動入力にはexpectを使う方法もあるが、そもそも入力しなくてもいいように設定してしまえば楽チンである。
まず事前にアカウントを作成しておくことにする。わかりやすいように、サーバ側(アクセスされる側・バックアップ先)、クライアント側(アクセスする側・バックアップ元)ともにbackupというユーザを作成することにする。当然クライアント側のバックアップしたいファイル群にはbackupの読み取り権限が必要になるので適宜設定しておく。
まずクライアント側で以下のコマンドを実行する。
ssh-keygen -t dsa
秘密鍵・公開鍵を作成する。この時、鍵の置き場所や鍵のパスフレーズを聞かれるが、何も入力せずに改行。でないと、サーバへのアクセス時にパスワードこそ聞かれないけれど、鍵に対するパスフレーズを聞かれることになってしまう(本末転倒)。
するとbackupのホームディレクトリに.ssh/というディレクトリが作成され、その中に以下のファイルが作成される
作ったディレクトリやファイルは誰にも触られないように、アクセス権限を変更しておく。
次に、公開鍵をサーバ側に転送する(何らかのセキュアな方法で)。サーバ側にもbackupというユーザを作成しておいた。backupのホームディレクトリに.ssh/というディレクトリを作成しておく。そして.ssh/authorized_keys2というファイルを作成し、先程の公開鍵の内容をコピペしておく。そして同様にアクセス権限を変更しておく。
以上で設定は終了だ。
いったんクライアント側からサーバ側にsshで接続してみる。最初はknown_hostsの登録がないので、登録するかどうか聞かれるのだが、以後はいきなりログイン出来るようになる。簡単なんだけど、ある意味怖いよね・・・。ま、しょうがないんだけど。