週末には少しPerlを。

Perlスクリプトの学習日記です。

CentOS 6.3にMovable Type 5.2.3をインストールして女子との出会いの確率を上げる

Movable Typeの世界は女子率が高いとの話 を先日のKansai.pm 第15回ミーティングにて聞きましたので 将来あるかも知れないMT女子との合コンの機会に備えて インストールくらいしておこうと思ったわけです。

ダウンロード

公式サイトから個人無償版をダウンロードします。 と、言いたいところですが、メールアドレスを送信してもなかなか ダウンロード用URLを記したという自動返信メールが来ませんので、 公式サイトの指示に従って ECバイヤーズのサイト からダウンロードします。

個人無償版は一人につき1インストールまでの制限あり。アフィリエイトブログに使用可能。

設置

インストール方法

インストール方法は公式サイトのドキュメント に記されています。

今回はアプリケーションディレクトリを /var/www/mt5 とすることにし、 ダウンロードした MT-5_2_3.zipを解凍したものをそのまま /var/www/mt5 にmvします。

これとは別にブログを公開するディレクトリとして /var/www/html/mt5pub をmkdirしておきます。

Apacheの設定

WebサーバーはCentOS 6にyumで入るApacheを使います。

/etc/httpd/conf.d/mt5.conf を作成し、CGIを動作させるための設定を記します。

Alias /mt5 /var/www/mt5
<Directory "/var/www/mt5">
    Options +ExecCGI
    AddHandler cgi-script .cgi
</Directory>

パーミッションの設定

公式ドキュメントには「権限を777に」などと書かれている箇所もあるのですが、 ちと乱暴だと思うので、とりあえず以下のディレクトリのオーナーをapacheにしておきます。

  • /var/www/html/mt5pub
  • /var/www/mt5
  • /var/www/mt5/mt-static/support

データベース

以前のバージョンのMTでは他の選択肢もあったようですがMT5ではMySQL 5が必須です。 これもCentOSにデフォルトで入っているものを使います。

あらかじめMT用の空のデータベースと これにフルアクセスできる専用のユーザーを作成しておきます。

インストールウィザードの実行

http://127.0.0.1/mt5 にアクセスするとサインイン画面が表示されます。 「はじめてお使いになる方へ」として書かれているシステムチェックを実行すると、 いくつか黄色の警告表示が出つつも最後に 「システムのチェックを完了しました。Movable Typeを利用できます。」 の表示。 ここでDBD::SQLiteやDBD::Pgの不足を警告してくるのは過去バージョンのなごりでしょうね。

サインインすると使用言語「日本語」の確認のあと再度システムチェックで 「必要なPerlモジュールは揃っています。」の表示あり。

そのあとデータベースの設定と接続テスト, メール設定と送信テストと進みます。

MTの管理者アカウントを設定し、「最初のウェブサイト」を作成して インストールウィザードは終了です。

Net::OpenSSH 0.60 のタイムアウト時の動作を眺める

Net::OpenSSH

Kansai.pm 第15回ミーティングでの @shiba_yu36 さんの Cinnamon の紹介を聞いて、Cinnamonの中で使われているという Net::OpenSSH に興味を持ちました。

リモートのサーバーにSSH接続してコマンドを実行するための モジュールですが、気になるのは異常系の動作です。 たとえば

  • リモートのサーバーが重くて返事が返ってこないとき
  • 通信経路上にトラブルがあったとき

どのように振る舞うか気がかりです。 簡単な実験をしてみました。

タイムアウトを設定してみる

サーバーA からサーバーB に ssh するとして、まずサーバーB に 以下のスクリプトを準備します。

#!/bin/sh
echo 'hoge'
touch hoge
sleep 60
echo 'fuga'
touch fuga

これをサーバーA から実行します。

my $ssh = Net::OpenSSH->new( );
$ssh->error and
    die "Couldn't establish SSH connection: ". $ssh->error;

my $cmd = '~/hogefuga.sh';

my ($out, $err) = $ssh->capture2($cmd);
$ssh->error and die "remote command failed:".$ssh->error;

print "out :\n$out\n";
print "err :\n$err\n";

コマンドを叩いてじっと1分待つと以下の出力が得られます。

[user@servera ~]$ ./ex.pl
out :
hoge
fuga

err :

サーバーB で ls -l すると確かにファイル hoge, fuga が 1分の間をおいて作成されています。

サーバーB のファイル hoge, fuga を削除し、今度は タイムアウトを指定して実行してみます。

my $timeout = 3;

my ($out, $err) = $ssh->capture2(
    {timeout => $timeout},
    $cmd,
);
$ssh->error and die "remote command failed:".$ssh->error;
print "out :\n$out\n";
print "err :\n$err\n";

出力はこうなります。

[user@servera ~]$ ./ex2.pl
remote command failed:ssh slave failed: timed out at ./ex2.pl line **.

ブログにこのように書くと上手くタイムアウトが働いたように見えますが、 実はコマンドを叩いてからエラーメッセージが出るまで1分かかっています。 また、サーバーB には前回同様にファイル hoge, fuga の両方が作成 されており、コマンドは最後まで実行されているようです。

途中でファイアーウォールで通信を遮ってみる

サーバーB の iptables の設定ファイルにサーバーA からの パケットをすべて DROP するルールを書いておきます。 サーバーA で前記のタイムアウト指定なしのスクリプトを 実行してからサーバーB の iptables を起動して 通信を遮断するとどうなるでしょうか。

[user@servera ~]$ ./ex.pl
Timeout, server not responding.
remote command failed:child exited with code 255 at ./ex.pl line **.

今度はたっぷり3分待たされました。 今回もサーバーB のファイル hoge, fuga の両方が作成されています。

kill_ssh_on_timeout

本当にタイムアウトを指定通りに実現するには Net::OpenSSH->new するときに kill_ssh_on_timeout を指定するしか方法がないようです。 これを指定して前記の ex2.pl を実行すると3秒でエラーが表示され、 サーバーB では hoge のみが作成され fuga は作成されなくなります。

ただし perldoc Net::OpenSSH の文書は次の警告をしています。

This action may leave the remote process running, creating a remote orphan
so Net::OpenSSH does not use it unless the construction option kill_ssh_on_timeout is set.

TO DO として次の記載がありますのでタイムアウト時の振る舞いは将来の バージョンで変わっていくかもしれません。

better timeout handling in system and capture methods

おまけ

Net::OpenSSH->new でパスワードも指定するときは IO::Pty をインストールしておくこと。

Kansai.pm 第15回ミーティングに参加しての感想など

Kansai.pm 第15回ミーティングに話を聞きに行ってきました。 こういう勉強会への参加は初めてでしたが興味深い話が聞けて 楽しく過ごせました。

「ブログに書くまでがKansai.pm」とのことなので、以下感想とメモを 記します。

『Webサービスのつくり方』のつくり方

ゲストスピーカー @yusukebeさんによるお話 http://www.slideshare.net/yusukebe/web-16710062

元々はそんなつもりはなかったのですが、ありがたいことに 持っていった本にサインをいただきました。

テーマの出版の話よりも「ボケて」の運用の話を興味深く聞きました。 AWSへの移行の苦労話なんか機会があればもっと聞いてみたい。

他のトークから、印象に残ったことのメモ

Inside Movable Type

  • MTのコミュニティは女子率が高い(?)
  • 非商用版あり。
  • Web製作においてMTは分業をやりやすい

Cinnamonの紹介

  • 小さいデプロイツール(コマンド実行のみを行う、デプロイ方法は提供しない)
  • ネーミングは(株)はてなの会長犬から。
  • Net::OpenSSHを使っている。

LTから。

  • VimScriptにPerlスクリプトを埋め込める。CPANモジュール(Acme::AjiFryなど)が使えるメリット。
  • HTTPのコードを暗記できない人のhttpstatus
  • Acme::Nyaa, ネコと和解せよ。bounceHammer