カテゴリー別アーカイブ: trac

FreeBSDでwsgiを使ったtracがどうもおかしい

FreeBSDでwsgiを使ったtracがどうもおかしい。なんだか重い。もともとfcgiを利用してたんだけれどfcgi版のtrac(というかpythonかな)って重い、なのでwsgiにて動かすことにした。

過去にyubirdたんがdebianで、また別件でcentosにてwsgi版のtracを動かしたけどとっても快調だった。

どうやらapache+pythonでの最近のハヤリはwsgiらしい。ということでテキトウにインストールした。

さて、confの変更もすんで動かしてみたんだけれどどうにも重い。topすればpythonの名前でapacheから独立してプロセスが走り続けてたりする。なんかおかしいな、って。ログを見ると気になる記述が。

[Wed Apr 11 13:37:47 2012] [info] mod_wsgi (pid=1189): Attach interpreter ''.
[Wed Apr 11 13:37:52 2012] [info] mod_wsgi (pid=1189): Cleanup interpreter ''.
[Wed Apr 11 13:37:52 2012] [info] mod_wsgi (pid=1189): Terminating Python.
[Wed Apr 11 13:37:52 2012] [error] Exception KeyError: KeyError(34382823872,) in <module 'threading' from '/usr/local/lib/python2.6/threading.pyc'> ignored

最後の行にあるException KeyError: KeyErrorのあたり。なんかスレッド周りの処理でエラーが出てるらしい。

でググってみるとそれらしき記述を発見。

InstallationOnFreeBSD -  modwsgi - Python WSGI adapter module for Apache. - Google Project Hosting

http://code.google.com/p/modwsgi/wiki/InstallationOnFreeBSD

上記のgoogle codeによるとあれしろコレしろ、ってあるけど、結局最後にはwsgi3.3使ったら直ったよってことが。

調べてみるとwsgiのバージョンは2.8を使ってた。

shell> pkg_info -Ix wsgi
ap22-mod_wsgi-2.8_2 Python WSGI adapter module for Apache
shell> psearch wsgi

www/mod_wsgi              Python WSGI adapter module for Apache
www/mod_wsgi3             Python WSGI adapter module for Apache


どうやらバージョンデュアルツリー(っていう名前を今作った!)らしくて2系がstableで3系は実験的なのかな、両方存在してた。2系をアンインスコして3系を入れる。

shell> pkg_deinstall -f www/mod_wsgi
** No matching package found.
shell> portinstall –c www/mod_wsgi3

以上でちゃんといけたっぽい。めでたしめでたす。

でも早くなったかどうかは微妙、残念。

tracのアップデートを行って動かなくなった時の対処法

1. 始めに

tracのアップデートを行ったら動かなくなった。
ミスった。かなりミスった。
このアップデート中に実は編集中のユーザがいて、コメントを記述し終えてpostで内容を送信した時に問題が発覚。
おかげさまで送信すべきコメントの内容が紛失されてしまった。ブラウザからpostを再送したりしてみたけれどその内容は見つからず、ダメでした。ごめんなさい。 続きを読む tracのアップデートを行って動かなくなった時の対処法

tracで添付ファイルの上限サイズを変更する

tracで添付ファイルの上限サイズを変更する。

tracを利用しててファイルを添付しようとしたんだけど、256KBが上限らしくてダメだった。アップロードしようとしたファイルが7MBぐらいで、アップしたら500インターナルサーバエラーが帰ってきてしまった。せめてサイズ上限だよっていう旨を表示して欲しいな。

さてテキトウにググったら早速有用な情報が出てきた。

trac/conf/trac.iniにあるattachment セクションの max_size という変数を書き換えればいいらしい。

shell> grep -B3 max_size trac.ini
# -*- coding: utf-8 -*-

[attachment]
max_size = 262144
--

[wiki]
ignore_missing_pages = false
max_size = 262144

どうやらwikiの項目とチケットに対する添付ファイルの二つがあるらしい。面倒だから両方とも256MBにしておく。

shell> grep -B3 max_size trac.ini
# -*- coding: utf-8 -*-

[attachment]
max_size = 268435456
--

[wiki]
ignore_missing_pages = false
max_size = 268435456

TracのCommitTicketUpdaterで利用できるコマンド一覧と書き方のまとめ

TracのCommitTicketUpdaterで利用できるコマンド一覧と書き方のまとめ。

Tracでチケットの管理をする際にコミットログからチケットの関連、クローズを管理するときに利用できる書式とコマンドをまとめる。

これってプラグインのところに記述があるんだけど、あれ、なんだったかな、ってなりやすいのでココにメモメモ。

まず書式は以下の二種類。チケットの書き方が#1ってやつと、ticket:1っていう二通りあるみたい。

下は#(たぶんシャープ(ハッシュ)じゃなくてナンバーの方)を使った書き方

command #1
command #1, #2
command #1 & #2 
command #1 and #2

そしてこちらがticket:1方式。

command ticket:1
command ticket:1, ticket:2
command ticket:1 & ticket:2 
command ticket:1 and ticket:2

それぞれにあるコマンドは、チケットの参照、もしくはクローズさせるときに使う。

参照、クローズのコマンドは以下の通り。

クローズ用

close, closed, closes, fix, fixed, fixes

参照用

references, refs, addresses, re, see

英語なのであまり違いがわからないけど、自然な文章で書くためにいくつか用法があるみたいだね!

tracで現在時刻よりすぐ後に期限となるマイルストーンのチケットを取得するクエリ

tracで現在時刻よりすぐ後に期限となるマイルストーンのチケットを取得するクエリ。

SELECT p.value AS __color__,
 id AS ticket, summary, component, version, milestone, t.type AS type, 
 owner, status,
 time AS created,
 changetime AS _changetime, description AS _description,
 reporter AS _reporter
 FROM ticket t
 LEFT JOIN enum p ON p.name = t.priority AND p.type = 'priority'
 WHERE status <> 'closed'
 ORDER BY CAST(p.value AS signed), milestone, t.type, time

tracの導入に当たっての注意点他

FreeBSD7.3-R, 32bit版にtrac-0.12を入れてみた。

長らく使用してたtrac-0.11はマルチリポジトリに対応して無くて、対応するぞーって言ってた0.12を待ってた。ちょくちょくインストールしたりしてたけど、これまでうまくいかなかった。なんとなく動くようになったぽいのでメモ。

FreeBSD7.3-R i386
apache-2.2.16
py26-sqlite3-2.6.5_1
sqlite3-3.6.23.1_1
trac-0.12

fast cgiモード?で動かす
マルチリポジトリ
全部のリポジトリで共通の認証。リポジトリごとに分けたりもできるぞたぶん。

まずリポジトリのおいてあるサーバとtracを稼働させようとしているサーバが違うのでそこをなんとかする。tracは必ずtracを動かしたローカルにリポジトリがないと駄目らしい。

nfsで見れるようにしようかと思ったけど、うちのnfsってだいたいrw出しちゃうから、一方的に読み取りのみの参照&ネットワークの負荷もかけないってことからrsyncしてみる。良いか悪いかわかんないけど。

crontabに下記を追加。先だって一発コマンドを通しておくとknown_hostsがどうのこうのするはず。ディレクトリが無いとか怒られないためにも。

*/10    *       *       *       *       root    /usr/local/bin/rsync -arv -e "ssh -i /usr/home/hogetan/.ssh/id_dsa" [email protected]:/usr/local/repositories/ /usr/local/repositories/ > /dev/null 2>&1

各種必要なパッケージ?はportinstallで適当に入れる。

%sudo portinstall /usr/ports/www/mod_fcgid

公式を見ながら設定する。

まずはapacheのhttpd.conf

LoadModule fcgid_module libexec/apache22/mod_fcgid.so
<IfModule alias_module>
  ScriptAlias /trac "/usr/local/share/trac/cgi-bin/trac.fcgi"
</IfModule>
<IfModule mod_fcgid.c>
  AddHandler fcgid-script .fcgi
</IfModule>
<LocationMatch "/trac/login">
  AuthType Basic
  AuthName "Trac"
  AuthUserFile /var/trac/.htpasswd
  Require valid-user
</LocationMatch>

scriptaliasを書く位置に注意。あとは.htpasswdが読めないと後で怒られる。.htpassswdの作成とかconfの参考とかは公式
TRAC_ENVはtrac.fcgiに直接書く。なんか理由があったけど忘れた。公式のどこかに書いてあった気がする。

basic認証させるディレクトリの記述に注意。公式通りだと/trac/hogehoge/loginしか受け付けなかったりする。

%sudo ee /usr/local/share/trac.fcgi
import os
os.environ['TRAC_ENV'] = "/var/trac"
os.environ['PYTHON_EGG_CACHE'] = "/tmp"

ここの設定で、TRAC_ENVを書くとそこのディレクトリにあるconf/trac.iniを読もうとするみたい。ここをマルチリポジトリだから~、って、TRAC_ENV_PARENT_DIRを設定すると、そのディレクトリから一つしたのディレクトリをそれぞれの独立したtracのプロジェクトと認識してしまうっぽかった。

(/var/trac/hogeproject/conf/trac.ini, /var/trac/hoge2project/conf/trac.ini, …)と、どんどん参照しちゃうみたい。ここでちょっとはまった。というか以前こんなことやってたけど、それぞれのディレクティブをhttpd.confに書いたりしてた・・・。これを知ってれば、ってかんじ。

次にtracのなんとかディレクトリ?(tracディレクトリとでも呼ぶのかな)、TRAC_ENVで設定されたディレクトリを作成してやる、tracのフォーマットで。

%sudo trac-admin /var/trac initenv

これでできる。nfsだとエラー。ミスったら消して直せば良い。気にくわなければ消して直せば良い。

.htpasswdは個人的な好みで/var/trac直下に。作り方は割愛。このファイルが残っててもinitenvできない。うざい。

次にconf/trac.iniを編集。

Trac 0.12b1が出たね - watawata日記
[repositories]
hoge1.dir=/usr/local/repositories/hoge1
hoge2.dir=/usr/local/repositories/hoge2
hoge3.dir=/usr/local/repositories/hoge3

こんな感じで列挙。元サイトにはtypeとかdescriptionとかあったけど、desc書いたらごちゃごちゃしちゃったし、typeはデフォルトでsvnなので今回はdirのみ定義。下記のコード+適当に選び出すでおk。

%php -r '$h = opendir("/usr/local/repositories"); while($f = readdir($h)){ print basename($f).".dir = /usr/local/repositories/$f\n";}'

そろそろ見て確認してみる。対象サーバのURLにscriptaliasで名付けた/tracとか付ける。


パーミッションとかよく怒ってくるので適当に対処。pythonのエラーは見慣れないので困ったら泣く。結構同じエラーにはまってる人とか少なかったりして泣ける。

tracの管理者権限をそれっぽいユーザに付与。これするとtrac画面の一番右端の方にadminってのが出てきて管理ができるらしい。

%sudo trac-admin /var/trac permission list
%sudo trac-admin /var/trac permission add tracadminisry TRAC_ADMIN

ログインしてTracを使う - へたれプログラマな日々

このあと、adminの画面の一番左下の方にあるrepositriesをクリック。
リポジトリが複数あるかチェック

これだとまだ利用できない。同期?が必要らしい。でも何を同期するんだろう。他にはどんなタイミングで同期すれば良いんだろう。

%sudo trac-admin /var/trac repository resync '*'
%sudo trac-admin /var/trac changeset added '*'

リビジョンが多いと結構時間がかかる。
これが終わったらさっきの管理画面でリビジョンが出てたりする。そんでなんかうまくいけたっぽい。

ここから先はこれから試す。

以上