Apache2/mod_rubyでtDiaryを動かそうと思ったけど、エラーが出て動かなかった。どうやらrhtmlをERBでパースする所で出てるみたい。
今日はこの不可解な問題と向き合ったお話。
まずはmod_rubyをインストールするに当たりバイナリを取ってきたけどDLLのエントリポイントが見つからないとエラーが出たのでビルドする。
svn co http://svn.modruby.net/repos/mod_ruby/trunk mod_ruby
で最新を取って来て、以下のパッチを当てる。
Index: bucket.c
===================================================================
--- bucket.c (revision 141)
+++ bucket.c (working copy)
@@ -28,6 +28,10 @@
#include "mod_ruby.h"
#include "apachelib.h"
+#ifdef _WIN32
+# undef read
+#endif
+
#ifdef APACHE2
VALUE rb_cApacheBucket;
そして以下のMakefile.w32をmod_ruby直下に置く
APACHE_ROOT=C:\Program Files\Apache Software Foundation\Apache2.2
RUBY_ROOT=C:\Ruby
SRCS = \
apache_cookie.c \
apache_multipart_buffer.c \
apache_request.c \
apachelib.c \
array_header.c \
bucket.c \
connection.c \
cookie.c \
error.c \
mod_ruby.c \
multival.c \
paramtable.c \
request.c \
ruby_config.c \
ruby_shared_stub.c \
server.c \
table.c \
upload.c \
uri.c
OBJS = $(SRCS:.c=.obj)
CFLAGS=/I"$(APACHE_ROOT)\include" /I"$(RUBY_ROOT)\lib\ruby\1.8\i386-mswin32" /DWIN32 /nologo
LDFLAGS=/LIBPATH:"$(APACHE_ROOT)\lib" /LIBPATH:"$(RUBY_ROOT)\lib"
LIBS= libapr-1.lib libaprutil-1.lib libhttpd.lib msvcrt-ruby18.lib
.SUFFIXES: .c .obj
all : mod_ruby.so
.c.obj:
cl /c $(CFLAGS) /Fo$@ $<
mod_ruby.so : $(OBJS)
link /nologo /DLL /OUT:$@ /EXPORT:ruby_module $(OBJS) $(LDFLAGS) $(LIBS)
clean :
-@del /Q *.obj *.so
パス等は環境に合わせて修正して下さい。コマンドラインからnmakeでビルド(mingw32の場合はもう一工夫いります)。出来上がったmod_ruby.soをApacheのmodulesディレクトリに配置。httpd.confは適当に設定。 次にtDiary。最新版を
svn co https://tdiary.svn.sourceforge.net/svnroot/tdiary/trunk/core tdiary
で取得して設定を済ませる。デフォルトの.htaccessはCGI版になっているので
Options +ExecCGI
# if you run tDiary with symbolic link, use settings below.
#Options +FollowSymLinks
# if making anchor style as 'YYYYMMDD.html', add some settings below.
# SEE header of html_anchor.rb plugin.
#AddHandler cgi-script .rb
AddHandler ruby-script .rb
DirectoryIndex index.rb
AddType application/xml .rdf
<Files "*.rhtml*">
deny from all
</Files>
<Files "tdiary.*">
deny from all
</Files>
<Files update.rb>
AuthName tDiary
AuthType Basic
AuthUserFile /home/foo/.htpasswd
Require user foo
SetHandler ruby-object
RubyHandler Apache::RubyRun.instance
</Files>
<Files index.rb>
SetHandler ruby-object
RubyHandler Apache::RubyRun.instance
</Files>
以上の様に修正する。さて実行...とまでは良かったが冒頭で書いたエラーが発生。色々調べている内にERBのresult(binding)メソッドでエラーが発生している事が分かった。しかもコマンドラインから実行すると現象は発生しないけど、Apacheから動かすとエラーが発生する。さらに調べた所、rhtmlファイル内にあるタブ文字(0x09)が影響している事が分かり、tDiaryのskelディレクトリ内にある全てのrhtmlファイルに対してタブ文字からスペースに置き換える作用を行うと正しく動作する。
これでようやくApache2/mod_rubyで動くtDiaryが完成した。
ただ、どうしてもタブ文字でおかしくなる原因が分からない。RubyKanjiCodeを指定しても駄目。お手上げです。
誰か原因知りませんか?