Hatena::ブログ(Diary)

Lazy Technology

2008-02-12

[]リンクするaprのバージョンを0.9xから1.2xに

WebDAV(=Apache)でリポジトリにアクセスすると、500が返ってきてログにも何も残らないと言う現象に遭遇する。で、色々調べていくうちのSubversionApacheのaprのバージョンの不整合が原因と言う事が分かった。

なお、Apache HTTP Server 2.0系で利用されているAPR 0.9系と、Apache HTTP Server 2.2系で利用されているAPR 1.2系では、互換性がないことに注意されたい。

http://builder.japan.zdnet.com/news/story/0,3800079086,20361867,00.htm

トラブルシューティングの手順を残しておく。


まず、Apacheのログに何も残っていないので、telnetから直接WebDAVのリクエストを投げる。参考: Subversionによるバージョン管理 (2/3):Apache 2.0でWebDAV(後編) - @IT

$ telnet localhost 80
OPTIONS /svn/ HTTP/1.1
Host: hostname
Authorization: Basic ===============

すると、xmlでエラーの詳細が返ってくる。

HTTP/1.1 500 Internal Server Error
Date: Fri, 08 Feb 2008 02:43:28 GMT
Server: Apache
Content-Length: 290
Connection: close
Content-Type: text/xml; charset="utf-8"

<?xml version="1.0" encoding="utf-8"?>
<D:error xmlns:D="DAV:" xmlns:m="http://apache.org/dav/xmlns" xmlns:C="svn:">
<C:error/>
<m:human-readable errcode="22">
Can't set position pointer in file '/path/to/repos/db/revs/2406': Invalid argument
</m:human-readable>
</D:error>
Connection closed by foreign host.

ポイントは以下。

Can't set position pointer in file '/path/to/repos/db/revs/2406': Invalid argument

これでググる401 Unauthorizedでaprのバージョンが原因と書いてある。

Subversionはそのままだと同梱のAPR(0.9.7)を使ってしまうので、Apache 2.2.0に同梱のAPR(1.0)を使わせるため「--with-apr」と「--with-apr-util」を指定する。

指定しなくてもコンパイルもできてApacheもしっかり起動するが、アクセスするときに

Can't set position pointer in file '/var/lib/svn-repos/db/revs/0': Invalid argument

みたいなこと言われてハマる

http://saikyoline.jp/wiki/index.php?%A5%E1%A5%E2%2FWebDAV%A4%C7Subversion


aprのバージョンを確認するにはlddを使う。まずはSubversion(mod_dav_svn)。

$ ldd /usr/local/apache2/modules/mod_dav_svn.so
        libaprutil-0.so.0 => /usr/lib/libaprutil-0.so.0 (0x008f9000)
        libapr-0.so.0 => /usr/lib/libapr-0.so.0 (0x00270000)
        (snip)

$ ll /usr/lib/libapr*.0
lrwxrwxrwx  1 root root 18  1月 25 14:57 /usr/lib/libapr-0.so.0 -> libapr-0.so.0.9.17
lrwxrwxrwx  1 root root 22  1月 25 14:57 /usr/lib/libaprutil-0.so.0 -> libaprutil-0.so.0.9.17


恐らく0.9.17。次にApache

$ ldd /usr/local/apache2/bin/httpd
        libaprutil-1.so.0 => /usr/local/apache228/lib/libaprutil-1.so.0 (0x0078a000)
        libapr-1.so.0 => /usr/local/apache228/lib/libapr-1.so.0 (0x00b5d000)


$ ll /usr/local/apache228/lib/libapr*.0
lrwxrwxrwx  1 root root 18  2月  6 16:03 /usr/local/apache228/lib/libapr-1.so.0 -> libapr-1.so.0.2.12
lrwxrwxrwx  1 root root 22  2月  6 16:03 /usr/local/apache228/lib/libaprutil-1.so.0 -> libaprutil-1.so.0.2.12


恐らく1.2.12。確かにバージョンが違う。

と言うわけで、再々度Subversionコンパイル。この際なので色々オプションを調べて自分なりのconfigureを作る事に。

./configure \
--with-apr=/usr/local/apache2 \
--with-apr-util=/usr/local/apache2 \
--with-apxs=/usr/local/apache2/bin/apxs \
--with-swig=/usr/local/bin/swig \
--with-neon=/usr/local/ \
PERL=/usr/local/bin/perl \
PYTHON=/usr/local/bin/python \
RUBY=/usr/local/bin/ruby \
--with-ssl \
--without-berkeley-db

これでインストールしたらWebDAVで無事アクセスできた。いい加減これで全部かなー。

2007-10-18

[][]インストールモジュールを確認する

bin/httpd -M 2>&1 | sort
 actions_module (static)
 alias_module (static)
 asis_module (static)
 auth_basic_module (static)
 authn_default_module (static)
 authn_file_module (static)
 authz_default_module (static)
 authz_groupfile_module (static)
 authz_host_module (static)
 authz_user_module (static)
 autoindex_module (static)
 cgid_module (static)
 core_module (static)
 dir_module (static)
 env_module (static)
 expires_module (static)
 filter_module (static)
 headers_module (static)
 http_module (static)
 include_module (static)
 log_config_module (static)
 mime_module (static)
 mpm_worker_module (static)
 negotiation_module (static)
 proxy_ajp_module (static)
 proxy_balancer_module (static)
 proxy_connect_module (static)
 proxy_ftp_module (static)
 proxy_http_module (static)
 proxy_module (static)
 rewrite_module (static)
 setenvif_module (static)
 so_module (static)
 status_module (static)
 userdir_module (static)
Loaded Modules:
Syntax OK

Apacheのコマンドよりも標準エラーを標準出力にリダイレクトさせるコマンドが覚えられない…。

参考

リダイレクトとパイプ

2007-08-07

[][][]Apache(mod_proxy_balancer) + mongrelで運用するときの注意点

Railsをproduction環境で運用していると、こんなエラーが頻発していることに気が付いた。

Processing ApplicationController#index (for ::1 at 2007-08-07 15:51:09) [GET]
  Session ID: 006a27e09f46dfe1bd6f6cc2258cfa8e
  Parameters: {}


ActionController::RoutingError (no route found to match "/" with {:method=>:get}
):
    /vendor/rails/actionpack/lib/action_controller/routing.rb:1292:in `recognize
_path'
    /vendor/rails/actionpack/lib/action_controller/routing.rb:1282:in `recognize
'
    /vendor/rails/railties/lib/dispatcher.rb:40:in `dispatch'
    /usr/local/lib/ruby/gems/1.8/gems/mongrel-1.0.1/lib/mongrel/rails.rb:78:in `
#=> 長いので省略

今のシステムではmongrelに対してルートにアクセスする事はない。原因が分からなくてかなり困る。


Processing ApplicationController#index (for ::1 at 2007-08-07 15:51:09) [GET]

forの後ろにある「::1」と言う値には本来ホスト名やIPが入るはずなのだが…。謎なんだけど、記号だからググる事も出来ない。


とりあえず仮受け用にroutes.rbを編集してrequest.envを出力するアクションを作って結果を見ると、UserAgentにこんな値が。

"HTTP_USER_AGENT"=>"Apache (internal dummy connection)

Apacheから?

今度はググれそうなのでググって見ると原因を解説しているサイトを発見。

When the Apache HTTP Server manages its child processes, it needs a way to wake up processes that are listening for new connections.

http://wiki.apache.org/httpd/InternalDummyConnection

mod_proxyなどで子供のサーバをぶら下げていると、Apacheは死活監視用のHTTPリクエストを送るらしい。


Railsはデフォルトのままでルートにアクセスするとdispacherがpublic/index.htmlに読み替えてWelcome Abord画面を表示するんだけど、これが不要だったからpublic/index.htmlを削除していた。これが直接的な原因っぽい。

空ファイルでも良いのでindex.htmlを置いておけばエラーは出なくなるはず、という事でやってみた結果、エラーは出なくなった。


という事で、Apacheでmod_proxy_balancerを使用しているときはproxy先で死活監視のHTTPアクセスを忘れないこと。

とりあえず空のindex.htmlを置いておくのが一番良いと思う。




ちなみに::1と言うのはループバック用のアドレスらしい。

死活監視用のリクエストヘッダは以下のようになっている。

"REMOTE_ADDR"=>"::1"
"HTTP_X_FORWARDED_FOR"=>"::1"

でもなんでループバック用のアドレスになってるんだろ…。

2007-05-26

[]Tracインストール成功 & カスタマイズ

Apache2.0.59 + mod_python + 基本認証で動いた。Apache2系+FastCGIはRailsで懲りているので動かす気は起きない。

これだけでもアクセス権限で躓いたりと、結構な時間を食ってしまった。


mod_pythonでTracを動かすhttpd.confの内容。最後にコピペすればOK。

LoadModule python_module modules/mod_python.so

<Location /trac-project>
   SetHandler mod_python
   PythonHandler trac.web.modpython_frontend
   PythonOption TracEnv /path/to/trac
</Location>

<Location "/trac-project/login">
  Require valid-user
  AuthType Basic
  AuthName "認証ダイアログで表示される文字列"
  AuthUserFile /path/to/htpasswd
</Location>

こちらのサイトからほとんど丸パクリさせていただきました。感謝。

インストール - cooldaemonの備忘録


後はカスタマイズ。

チケットタイプ・優先度・重要度のカスタマイズ(日本語化)

優先度priorityコマンド
重要度severityコマンド
チケットタイプticket_typeコマンド

となる。

如何にフレンドリーかつ実用的な名前を付けられるかがTrac導入成功の分水嶺になる可能性が高いので、慎重に考える。

参考例

Trac - 鈍重な開発を俊敏にしていく日記 - agileグループ


ここは定型的なタスクになると思うので後述のWebAdminPluginを入れてブラウザからポチポチやるよりもバッチ化した方が良いと思う。

こんな感じ。

trac-admin /tmp/tractest/test priority change blocker やらないと休めない
trac-admin /tmp/tractest/test priority change critical やらないと帰れない
trac-admin /tmp/tractest/test priority change major ちゃんとやる(期限決定・優先度中)
trac-admin /tmp/tractest/test priority change minor あとでやる(期限決定・優先度低)
trac-admin /tmp/tractest/test priority change trivial いつかやりたい(期限未決定)
trac-admin /tmp/tractest/test severity add 社運にかかわる
trac-admin /tmp/tractest/test severity add サービスにかかわる
trac-admin /tmp/tractest/test severity add 髪の毛にかかわる
trac-admin /tmp/tractest/test severity add ボーナスにかかわる
trac-admin /tmp/tractest/test ticket_type change defect バグ報告
trac-admin /tmp/tractest/test ticket_type change enhancement 機能拡張要求
trac-admin /tmp/tractest/test ticket_type change task タスク

管理者のアカウントにTRAC_ADMIN権限を割り当て

TRAC_ADMIN権限は後述のWebAdminPluginを使う際に必要。

permission add username TRAC_ADMIN

WebAdminPluginをインストール

Trac0.9だとパッケージで提供されているが、0.10系だとsvnからチェックアウトしてセットアップしなければいけないようだ。

しかもPython-Eggと言う形式にしなければならないらしい。(Javaで言うjarのようなもの?)

で、Python-Eggの作成にはsetuptoolsと言うパッケージが必要。

Trac公式に導入手順が書かれていたのでそのままやったら入った。

TracPlugins ? The Trac Project


確認はやっぱりpythonコマンドで。

>>> import setuptools
>>> #=>エラーが起こらない

Python-Eggなパッケージ(ただのZip?)を作るにはsetup.py buildではダメらしい。

setup.pyのオプションをbdist_eggとする必要がある。

python setup.py bdist_egg
python setup.py install

これでインストール完了。ログに

Installed /usr/local/lib/python2.5/site-packages/TracWebAdmin-0.1.2dev_r4429-py2.5.egg

こう書かれていたので安心。2.3の方に入らないでちゃんと2.5の方に入っている。


後はTrac.iniに以下を追記する。

[components]
webadmin.* = enabled

Apacheを再起動してTRAC_ADMIN権限を持つユーザでログインすれば、右端のタブに「Admin」メニューが追加されている。

2007/5/27 追記

環境によってはApacheプロセスがPython-Eggのキャッシュの保存先にアクセスできないと言うエラーが発生するらしい。こちらに対処方が書いてある。

no title

Apacheの該当箇所のディレクティブを引用させていただく。

<Location /projects>

SetHandler mod_python

PythonHandler trac.web.modpython_frontend

PythonOption TracEnvParentDir /home/trac

PythonOption TracUriRoot /projects

SetEnv PYTHON_EGG_CACHE /home/trac/.python-eggs ←--この行を追加

</Location>

http://blog.denden-cafe.com/blog/2006/08/webadmin_c01a.html

Tracのプラグインに関する公式ドキュメントは TracPlugins ? The Trac Project にある。

日本語版のドキュメント、インストールすれば読めるんだけど、どっかネットに公開されてたりしないのかな。

文字コードの設定

Tracは文字コードを自動で識別する機構を備えているためか、Trac.iniのデフォルト文字コードは

default_charset = iso-8859-15

となっている。

これだと自分の環境では文字化けしたのでUTF-8に変更。

default_charset = UTF-8

文字コードの自動判別の技術的な情報については

ヤマロぶろぐ : Tracでファイルの文字コードを自動判定 - livedoor Blog(ブログ)

rubricks.org -&nbspこのウェブサイトは販売用です! -&nbsprubricks リソースおよび情報

辺りが参考になる。

Trac Wikiの強化

他のTracなサイトを見ているとほぼ必ずあるのが「Table of Contents」と言う目次っぽい存在。

なんだろうと思って探してみると、TocMacroと言うpluginで実現しているらしい。

no title

インストール手順も上記のサイトで詳しく書かれている。ついでにTracNavも入れる事に。

自分がやった手順は若干違ったのでメモしておく。

TocMacroのインストール
svn co http://trac-hacks.org/svn/tocmacro
cd tocmacro/0.10/
python setup.py bdist_egg
python setup.py install
TracNavのインストール
svn co http://svn.ipd.uka.de/repos/javaparty/JP/trac/plugins/tracnav
cd tracnav/
python setup.py bdist_egg
python setup.py install
Trac.iniの設定
[components]
...
tractoc.* = enabled
tracnav.* = enabled
Apacheの再起動(必須)

希望

  1. 担当者・関係者をユーザ一覧のコンボボックスにしたい。
  2. .rhtmlなファイルがリポジトリブラウザでシンタックスハイライトされない(SilverCityの問題)。ただし、0.11からはPygmentsが推奨されるようだ( SilverCity ? The Trac Project )。

参考

プラグイン webadmin をインストール - cooldaemonの備忘録

TracPlugins ? The Trac Project

WebAdminPlugin - 気の向くままに・・・ - Seesaa Wiki(ウィキ)

ソフト/Bug Tracking/trac/WebAdminPlugin - discypus

2007-05-23

[] Apacheインストールされているモジュールを確認する

httpd -l

とすると以下のような実行結果が返る。

./bin/httpd -l

Compiled in modules:

core.c

mod_authn_file.c

mod_authn_default.c

mod_authz_host.c

mod_authz_groupfile.c

mod_authz_user.c

mod_authz_default.c

mod_auth_basic.c

mod_include.c

mod_filter.c

mod_log_config.c

mod_env.c

mod_setenvif.c

mod_proxy.c

mod_proxy_connect.c

mod_proxy_ftp.c

mod_proxy_http.c

mod_proxy_ajp.c

mod_proxy_balancer.c

mod_ssl.c

prefork.c

http_core.c

mod_mime.c

mod_status.c

mod_autoindex.c

mod_asis.c

mod_cgi.c

mod_negotiation.c

mod_dir.c

mod_actions.c

mod_userdir.c

mod_alias.c

mod_rewrite.c

mod_so.c

preforkとかもモジュール扱いなんだろうか…?

コンパイルオプションで変更できるものはすべてモジュールなのかな。

参考

Apacheに組み込まれているモジュール一覧が知りたい - ITmedia エンタープライズ