On 19/09/2011 16:13, TADA Tadashi wrote:
> 2011年9月19日19:31 SHIBATA Hiroshi <shibata.hiroshi@...>:
>> 'tdiary.conf' ではダメかどうかというと、index.rb のラッパーを使う場合や symlink を使う場合
>> で上手いこと動くのであればどちらでもかまいませんが、tdiary.conf を配置する場所は
>> tdiary.rb と同じ場所なのか、実行する index.rb(update.rb)と同じ場所なのかどうかは
>> 方針として決めておいた方が良いと思います。
>
> tdiary.rbと同じ場所というのはありえないですね。複数日記を同一インストール
> イメージで運用する場合のことを考えれば自明です。なので現状では「index.rb
> / update.rbと同じ場所」が正解になります。
公式ドキュメント「同一サーバで複数のtDiaryを運営する方法」
http://www.tdiary.org/20021205.html
に書いてある方法だと上記のようになりますね。
> 「現状では」と書いたのは、今後(今も?)の環境変化で、index.rbのような実行
> ファイルをトリガーにしなくてもWebアプリがキックできる状況があるかも知
> れないから。そういう場合はむしろ「tdiary.confがある場所がその日記のrootで
> ある」という解釈をした方が良いと思います。つまり本質的にはindex.rb / update.rb
> とも独立であるべきです。
>
> #でもchdirを使うのはスジが悪い気がするね。
前の投稿とか http://kazuhiko.tdiary.net/20110918.html#p01 に書いたよ
うに一つのFastCGIで複数日記を運用する方法だと、index.rbも各ディレクトリ
に置く必要はなさそうです。
ただ、この方法は、$PROGRAM_NAMEを内部で書き換えているのが、ちょっと気持
ち悪いといえば気持ち悪いけれど。
また、素のindex.fcgiでも、$PROGRAM_NAMEを参照する現在のコードでは、chdir
する必要はありませんね。index.rbの位置を明示したければ、
index.fcgi(symlinkの場合はそれの実体)と同じディレクトリでいいはずです
し。モバイル対応の差分とあわせたら、こんな感じでOK。
--- a/index.fcgi
+++ b/index.fcgi
@@ -12,6 +12,13 @@ require 'fcgi'
# workaround untaint LOAD_PATH for rubygems library path is always tainted.
$:.each{|path| path.untaint if path.include?('fcgi') && path.tainted? }
+if FileTest::symlink?( __FILE__ ) then
+ org_path = File::dirname( File::readlink( __FILE__ ) ).untaint
+else
+ org_path = File::dirname( __FILE__ ).untaint
+end
+load "#{org_path}/tdiary/patch/fcgi_patch.rb"
+
FCGI.each_cgi do |cgi|
begin
ENV.clear
@@ -19,10 +26,7 @@ FCGI.each_cgi do |cgi|
define_method(:new) {|*args| cgi }
end
- dir = File::dirname( cgi.env_table["SCRIPT_FILENAME"] )
- Dir.chdir(dir) do
- load 'index.rb'
- end
+ load "#{org_path}/index.rb"
ensure
class << CGI
remove_method :new
というわけで、chdirはスジが悪いというのは同意で、tdiary.confのディレクト
リを指示方法として$PROGRAM_NAMEがベストかどうかは、よく分からないという
感想です。
かずひこ
|