ApacheのsuEXECを設定。suEXECは各ユーザーの権限でApacheが動作する機能で、nobody権限でApacheが動作する場合だとサーバー内の他のユーザーでもファイルにアクセスできてしまうので設定した。
VirtualHostで機能させるにはsuexecのディレクトリ情報を正しく設定する必要があるのだけど、これにはソースからmakeする必要があるみたい。で、configureとmakeをやってみた。
そのままインストールするとApacheも置き換わってしまうので、正しく設定したsuexecだけをもとのsuexecの場所にコピー。今のところちゃんと動いている様子。
jcode.plの後継であるJcode.pmをサーバーにインストール。インストールしなくても各自のディレクトリにJcode関連のファイルを置けば使えるのだけど、use Jcode;と書くだけで使えたほうがスマートだしね。
apt-get install libjcode-pm-perl
で、インストールできた(と思う)。
長い間(1年間くらい?)ルートサーバーがダウンしていたCFドメイン(中央アフリカ共和国)が、いつの間にか復活していた。実はここのドメインを1つ持っているんだけど、取得したときはルートサーバーが長期間ダウンするなんて考えてもみなかったなぁ。
ちょっと改良。proxyサーバーを経由していたのを、直接接続するようにしてみた。UNIXのPerlでも、気長に待てばSOCKET接続でタイムアウトしてくれるみたいだし。
#!/usr/local/bin/perl
# Usage: is_alive_http.pl server
use strict;
my $host = $ARGV[0] or die;
my $mail = '○○'; # 携帯のアドレス
main();
# ◆
sub main {
if (!is_alive_http($host)) {
print "$host is down\n";
system("echo '$host is down' | mail $mail");
}
}
# ◆
sub is_alive_http {
my $target = shift;
my @result;
my $addr = (gethostbyname($target))[4];
my $name = pack("S n a4 x8", 2, 80, $addr);
socket(SOCKET, 2, 1, 0);
connect(SOCKET, $name) or return 0;
binmode(SOCKET);
select(SOCKET); $| = 1; select(STDOUT);
print SOCKET "OPTIONS * HTTP/1.0\n\n";
@result = <SOCKET>;
close(SOCKET);
return (join('', @result) =~ /200 OK/ ? 1 : 0);
}
いつもは買い物を近くのスーパーで済ませているのだけど、少し離れたところにある青果店へ足を運んでみた。スーパーでの値段を見慣れているためか、野菜の安いこと、安いこと。これからはちょくちょく寄ってみよう。
プライベートで運営しているサーバーが外部から接続できない状態になっていて、メールで教えてもらって気がついた。設定ミスが原因で、自宅からだと直接サーバーに繋がるので気がつかなかった。利用者のみなさまには大変ご迷惑をお掛けしましたm(_ _)m
きちんと確認していれば防げたことなので、未熟さを実感。まさかこんな単純なミスをするとは・・。再発防止のために定期的に外部のサーバーから監視するスクリプトでも書こう。毎回の確認もきちんと。
httpサーバーが動いているか監視して、ダウンしている場合はメールで知らせてくれるスクリプトを書いた。運営中のサーバーも、安定性は並のレンタルサーバーくらいを目指したいな。
#!/usr/local/bin/perl
# Usage: is_alive_http.pl server
use strict;
my $host = $ARGV[0] or die;
my $mail = '○○'; # メールアドレス
my $proxy_host = '○○'; # proxyサーバー
my $proxy_port = 80; # proxyのポート
main();
# ◆
sub main {
if (!is_alive_http("http://$host/")) {
print "$host is down\n";
system("echo '$host is down' | mail $mail");
}
}
# ◆
sub is_alive_http {
my $target = shift;
my @result;
my $addr = (gethostbyname($proxy_host))[4];
my $name = pack("S n a4 x8", 2, $proxy_port, $addr);
socket(SOCKET, 2, 1, 0);
connect(SOCKET, $name);
binmode(SOCKET);
select(SOCKET); $| = 1; select(STDOUT);
print SOCKET "OPTIONS $target HTTP/1.0\n\n";
@result = <SOCKET>;
close(SOCKET);
return (join('', @result) =~ /200 OK/ ? 1 : 0);
}
cronで定期的に実行すればOK。
0,20,40 * * * * /path/to/script target.com