あるシステム管理者の日常 このページをアンテナに追加 RSSフィード

2010-02-05 Zopeがエラーを返すとき

Zopeがエラーを返すとき

| Zopeがエラーを返すとき - あるシステム管理者の日常 を含むブックマーク はてなブックマーク - Zopeがエラーを返すとき - あるシステム管理者の日常

ウェブの動作監視でZABBIXを使っています。バックエンドで動作しているZopeインスタンスの動作をチェックするために、ZMI画面へhttpアクセスし、一定のタイムアウト時間までにHTTPコード200が帰ってきたらOK。それ以外だとNGとしてインスタンス再起動という仕掛けをいれていました。

大体の場合はこれでうまくいくのですが、AttributeErrorとかData.fsからオブジェクトをちゃんと取り出せない場合には、HTTPとしては200で返しているのですが、アプリケーションレベルだとエラーってなケースがあるようです。

ZABBIXのウェブ監視では、特定のURLへリクエストして帰ってきたコンテンツ中に指定した文字列が入っているかどうかっていうチェックも可能なので、その設定を追加。うまくいくといいのですが。

f:id:rougeref:20100205161221p:image

2010-01-14 Apache2のキャッシュが怪しい動作

Apache2のキャッシュが怪しい動作

| Apache2のキャッシュが怪しい動作 - あるシステム管理者の日常 を含むブックマーク はてなブックマーク - Apache2のキャッシュが怪しい動作 - あるシステム管理者の日常

私が管理しているウェブサーバではフロントエンドのApacheでリバースキャッシュをかけた上で、バックエンドにリクエストを流しています。

先日来、コンテンツの一部で404になることがあるという現象が報告されました。

Apacheのログをチェックすると、確かに404でクライアントに返しています。バックエンドの方はどうかとチェックすると、同じ時間にはバックエンドにはリクエストが来ていません。おそらくApacheキャッシュにないってことでそれで返してしまっている模様。

そこでCacheRootを変更して、Apache再起動ネガティブキャッシュ*1をクリア。それでも時折404が帰ります。大多数のリクエストは正常に処理しているのですが。

コネクション数が4桁を越えているので、httpdのパフォーマンスを調整する必要があるのかもしれません。

*1Squidにはあるけど、Apache2のキャッシュにそれがあるかどうかは不明

2010-01-08 php.iniでmemory_limitが効かない

php.iniでmemory_limitが効かない

| php.iniでmemory_limitが効かない - あるシステム管理者の日常 を含むブックマーク はてなブックマーク - php.iniでmemory_limitが効かない - あるシステム管理者の日常

ZABBIXのサーバを1.6.4から1.8へバージョンアップしたのですが、その際に必要条件のチェックが動いて、phpのmemory_limitが引っかかった。

どうも128MB必要らしいのですが、64MBだよって表示されている。それとpost_max_sizeも16M必要らしい。

なのでphp.iniを編集。

memory_limit = 128M
post_max_size = 16777216

これでApache再起動。post_max_sizeのチェックは通ったが、memory_limitの値が64MBのまま。編集しているphp.iniが違うわけでもない。変だなぁ。

zabbixのソースもチェックしたがよくわからない。あんまり時間を無駄にするのもしゃくなので、zabbixのソース中に少々手を入れることにした。

手を入れたのはinclude/setup.inc.phpで、memory_limitの値を取り込んでチェックしているところ。189行めあたり。

                        ini_set('memory_limit','128M') ; ← ここ
                        $memory_limit = str2mem(ini_get('memory_limit'));
                        $table->addRow($this->get_test_result(
                                $final_result,
                                'PHP Memory limit:',
                                function_exists('memory_get_usage') ? mem2str($memory_limit) : 'unlimited',
                                $memory_limit >= 128*1024*1024 || !function_exists('memory_get_usage'),
                                '128M is a minimal PHP memory limitation'));

まぁアドホックではある。今のところ支障はでてない。

2009-12-07 Ploneの認証をLDAPへ

Ploneの認証をLDAPへ

| Ploneの認証をLDAPへ - あるシステム管理者の日常 を含むブックマーク はてなブックマーク - Ploneの認証をLDAPへ - あるシステム管理者の日常

先日作成したPacketiXを利用したインタネットVPN環境でせっかくOpenLDAPのディレクトリを作ったので、これを積極利用。ということでPloneサイトがいくつかあるんですが、これの認証をOpenLDAPに任せてみたい。

pythonでldapが使えるかどうかチェック

こんなワンライナーで確認。

$ python -c "import _ldap"

なにもエラーがでなければ、問題なし。インポートできないとかなんとかいってきたら、適当にインストールしてあげてください。

インスタンスへLDAP関連のプロダクトを追加

昔の本をみると、わざわざダウンロードしてプロダクトを追加なんてことをやっているみたいですが、近頃のPloneでは同梱されているみたい。Ploneプロダクトを解凍したところにPloneLDAPってディレクトリがあり、その下にPloneLDAP,LDAPUserFolder,LDAPMultiPluginの3つのプロダクトがあるのでこれをインスタンスのProduct以下へリンク。そしてインスタンス再起動

コントロールパネルのProductでこれらのプロダクトが有効になっていることを確認します。

Ploneのacl_userにPlone LDAP pluginを追加

Ploneサイト中のacl_usersをクリック。そこへ右上のプルダウンからPlone LDAP pluginを追加。

f:id:rougeref:20091207173106g:image

設定値入力

baseDNとか、LDAP中のどこ項目をuseridとして扱うかとか、サーバ情報などなど適当に入力して、OK。

ユーザオブジェクトタイプは、自分の環境だとinetOrgPersonだったのでそのように指定。


なにを有効にするか

認証とユーザとしてのエミュレーションをさせたいので、Open LDAP pluginのactivateタブで、AuthenticationとUseremulationをチェック。他は、、よくわからないな。

テスト

OpenLDAPpluginのコンテンツタブからacl_users(LDAP)をクリック、ユーザタブで任意のユーザを検索できます。

LDAPにマルチバイトのコンテンツが含まれていると、latin-1で云々てエラーが帰ってきます。

'latin-1' codec can't encode characters in position 20-32: ordinal not in range(256)

この時は、LDAPUserFolder中のutils.pyで文字コードを既定しているところがあるので、これをutf-8にすればOK。

#encoding = 'latin1'
encoding = 'utf-8'

utils.pycを削除してインスタンス再起動

これでOpenLDAP中のユーザで認証できました。でもまだロールとかグループとかなにも設定していないので、なにもできないのだ。

2009-09-28 Zopeがフリーズする

Zopeがフリーズする

| Zopeがフリーズする - あるシステム管理者の日常 を含むブックマーク はてなブックマーク - Zopeがフリーズする - あるシステム管理者の日常

先週から起きているウェブの不調。一次的な原因はバックエンドZopeインスタンスがリクエストに対する回答を返さないこと。単純に観察していると、Zopeが沈黙したように見える。

インスタンス再起動すると、一旦は復活するもののしばらくすると同じ現象になります。

フロントエンドを遮断して、外部からのリクエストがこないようにすると現象が発生しないことから、なにか外部からの特徴的なリクエストがトリガーになっているものと推測できるのですが、Z2.logなど眺めてみてもどれがきっかけなんだかわかりっこない。

そこでいろいろ調べてみると、Zopeが現在処理しているスレッドの内容をダンプしてくれるツールがあることを発見しました。

DeadLockDebuggerというプロダクトがそうです。このプロダクトを動作させるためにはpythonパッケージのthreadframeが必要です。

treadframeをインストール

上記サイトからダウンロード、展開して

# python setup.py install


DeadLockDebuggerをインストール

通常どおりProductディレクトリへコピー(またはリンク)。プロダクト中の custom.py を編集。

ACTIVATED=True
SECRET='mysecret'

と編集してから、該当Zopeインスタンス再起動

スレッドのダンプを参照

スレッドのダンプはこんなURLで見えます。

http://hostname:port_number/manage_debug_threads?mysecret

これでスレッドの状態をチェック。先週から起きている現象は、クローラが検索に該当するURLをバンバンとリクエストしてくれていることが原因と判明しました。

しかも、該当URLはCMSプロダクトのバグで検索範囲がとてつもなく広く指定されているもので、とても回答に時間がかかるものでした。このため、リクエストがどんどんたまってスレッドを食い尽くしているということが判明。

ログだけじゃ解らない情報もあるんだということを認識しました。