Tsukiji Systems
RSS1.0


googleで
サイト内検索
このブログ
を検索!
  help

巻き戻し中。

2013年
11月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30


2013-11-10(日) tDiary4.0.1+静的HTML出力 [長年日記]

_ PC てすと

静的HTMLの出力テスト

_ PC 残課題

細かい日記のエラーは、過去8年分ざっと見直したつもり。*1

残るは

・へぇボタンの数値が記録されない

・image-gallery.rbが動かない

・ソーシャルへのリンクが項目ごとだとウザイかな?

ってところ。

*1 先週末はそれで徹夜(;´Д`)

_ PC 静的出力

tDiary4.0.1で2.2の手法がまんま使えるとは思わないのだけど、負荷対策:静的 HTML 化とかtDiaryを最新エントリまで静的出力する方法とか参考に始めてみる。

微妙に変数とか変わってるのが面倒だw

tDiaryのファイル構成も大幅に変わって、tdiary/dispatcherの配下のファイルを弄る。

index_main.rbとupdate_main.rbの差分はこんな感じ。

cgiの権限で書き込める「【tDiaryのパス】/static」は先に掘っておく事。

*** index_main.rb.org   Sun Nov 10 04:25:44 2013
--- index_main.rb       Sun Nov 10 16:30:03 2013
*************** module TDiary
*** 52,57 ****
--- 52,75 ----
                                                                head['Cache-Control'] = 'no-cache'
                                                                head['X-Frame-Options'] = conf.x_frame_options if conf.x_frame_options
                                                        end
+ # Add for static HTML 20131110 start
+                 if !request.mobile_agent? then
+                 if params['date'] then
+                         if /^\d{8}$/ =~ params['date'] then
+                                 File.open("【tDiaryのパス】/static/#{@params['date']}.html", "w") {|f|f.write body
+                                 File.open("【tDiaryのパス】/static/cache.log", "a+") {|f|
+                                 f.write "#{Time.now} static cache written(#{@params['date']}.html).\n"
+                                 }
+                         }
+                         end
+                 elsif params['category'] then
+                         else
+                                 File.open("【tDiaryのパス】/index.html", "w") {|f|
+                         f.write body
+                         }
+                 end
+                 end
+ # Add for static HTML 20131110 end
                                                        head['cookie'] = tdiary.cookies if tdiary.cookies.size > 0
                                                        TDiary::Response.new( body, ::TDiary::Dispatcher.extract_status_for_legacy_tdiary( head ), head )
                                                end
*************** module TDiary
*** 83,88 ****
--- 101,122 ----
                        def create_tdiary
                                begin
                                        if params['comment']
+ # add for static index 20131110
+                 cache = "【tDiaryのパス】/index.html"
+                 if FileTest.exist?(cache) then
+                         File.delete(cache)
+                 end
+ # add for static index 20131110 end
+ # Add for static HTML 20131110 start
+                         date_string = params['date']
+                         cache = "【tDiaryのパス】/static/#{date_string}.html"
+                         if FileTest.exist?(cache) then
+                                 File.delete(cache)
+                                 File.open("【tDiaryのパス】/static/cache.log", "a+") {|f|
+                                  f.write "#{Time.now} static cache cleared(#{date_string}.html).\n"
+                                 }
+                         end
+ # Add for static HTML 20131110 end
                                                tdiary = TDiary::TDiaryComment::new( cgi, "day.rhtml", conf )
                                        elsif params['plugin']
                                                tdiary = TDiary::TDiaryPluginView::new( cgi, '', conf )

_ 【update_main.rb.patch】

*** update_main.rb.org  Thu Aug 29 17:53:52 2013
--- update_main.rb      Sun Nov 10 15:47:41 2013
***************
*** 2,7 ****
--- 2,8 ----
  module TDiary
        class Dispatcher
                class UpdateMain
+
                        def self.run( request, cgi )
                                new( request, cgi ).run
                        end
*************** module TDiary
*** 15,23 ****
--- 16,46 ----
                                @params = request.params
                        end
+ # Add for static output 20131110 start
+ def delete_cache(request)
+       cache = "/home/www/htdocs/rewind/index.html"
+               if FileTest.exist?(cache) then
+       File.delete(cache)
+       end
+       # date_string = '20121004'
+       # date_string = params['date']
+       date_string = sprintf("%04d%02d%02d", cgi['year'], cgi['month'], cgi['day'])
+       # date_string = sprintf("%04d%02d%02d", @params['year'], @params['month'], @params['day'])
+       # date_string = sprintf("%04d%02d%02d", @request['year'], @request['month'], @request['day'])
+       cache = "/home/www/htdocs/rewind/static/#{date_string}.html"
+       if FileTest.exist?(cache) then
+               File.delete(cache)
+               File.open("/home/www/htdocs/rewind/static/cache.log", "a+") {|f|
+               f.write "#{Time.now} static cache cleared(#{date_string}.html).\n"
+       }
+       end
+ end
+ # Add for static output 20131110 end
+
                        def run
                                @tdiary = create_tdiary
                                begin
+
                                        head = {}; body = ''
                                        if request.mobile_agent?
                                                body = conf.to_mobile( tdiary.eval_rhtml( 'i.' ) )
*************** module TDiary
*** 63,78 ****
--- 86,116 ----
                        def create_tdiary
                                begin
                                        if params['append']
+ # Add for static output 20131110 start
+                                               delete_cache(@cgi) # For static
+ # Add for static output 20131110 end
                                                tdiary = TDiary::TDiaryAppend::new( cgi, nil, conf )
                                        elsif params['edit']
+ # Add for static output 20131110 start
+                                               delete_cache(@cgi) # For static
+ # Add for static output 20131110 end
                                                tdiary = TDiary::TDiaryEdit::new( cgi, 'update.rhtml', conf )
                                        elsif params['replace']
+ # Add for static output 20131110 start
+                                               delete_cache(@cgi) # For static
+ # Add for static output 20131110 end
                                                tdiary = TDiary::TDiaryReplace::new( cgi, nil, conf )
                                        elsif params['appendpreview'] or params['replacepreview']
+ # Add for static output 20131110 start
+                                               delete_cache(@cgi) # For static
+ # Add for static output 20131110 end
                                                tdiary = TDiary::TDiaryPreview::new( cgi, 'preview.rhtml', conf )
                                        elsif params['plugin']
                                                tdiary = TDiary::TDiaryFormPlugin::new( cgi, 'update.rhtml', conf )
                                        elsif params['comment']
+ # Add for static output 20131110 start
+                                               delete_cache(@cgi) # For static
+ # Add for static output 20131110 end
                                                tdiary = TDiary::TDiaryShowComment::new( cgi, 'update.rhtml', conf )
                                        elsif params['saveconf']
                                                tdiary = TDiary::TDiarySaveConf::new( cgi, 'conf.rhtml', conf )

_ PC httpd側は

.htaccessを↓な感じで追加設定。*1

要するに、通常はキャッシュがあればそっち。

携帯からのアクセスは整形されるので動的生成。

検索エンジンさんは強制的に静的htmlに飛ばして負荷軽減。

各個別の日付じゃない、一覧表示はキャッシュがないので動的生成。

もしかすると、今回から正式にfcgi使ってるので論理矛盾があるかもしんない。

【.htaccess】

*1 他にもspam避けとか沢山設定されてるw

Options +ExecCGI
Options -Indexes
Options +FollowSymLinks
RewriteEngine on
 
# If mobile, use index.rb
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/([0-9]+)\.html$
RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [OR]
RewriteCond %{HTTP_USER_AGENT} ^J-PHONE [OR]
RewriteCond %{HTTP_USER_AGENT} ^MOT- [OR]
RewriteCond %{HTTP_USER_AGENT} ^KDDI- [OR]
RewriteCond %{HTTP_USER_AGENT} ^Vodafone [OR]
RewriteCond %{HTTP_USER_AGENT} ^UP\.Browser [OR]
RewriteCond %{HTTP_USER_AGENT} ^SoftBank
RewriteRule .* index.fcgi?date=%1 [L]
 
# If mobile, use index.rb
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/$
RewriteCond %{QUERY_STRING} ^$
RewriteCond %{HTTP_USER_AGENT} ^DoCoMo [OR]
RewriteCond %{HTTP_USER_AGENT} ^J-PHONE [OR]
RewriteCond %{HTTP_USER_AGENT} ^MOT- [OR]
RewriteCond %{HTTP_USER_AGENT} ^KDDI- [OR]
RewriteCond %{HTTP_USER_AGENT} ^Vodafone [OR]
RewriteCond %{HTTP_USER_AGENT} ^UP\.Browser [OR]
RewriteCond %{HTTP_USER_AGENT} ^SoftBank
RewriteRule .* index.fcgi [L]
 
# If search engine, goto html focebily
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/?date=([0-9]+$)
RewriteCond %{HTTP_USER_AGENT} msnbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} psbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot/2 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot/1 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Yahoo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Yahoo! [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Y!J-SRD
RewriteRule .* static/%1.html [L]
 
# If search engine, goto index.rb.org "Non static" focebily
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/$
RewriteCond %{HTTP_USER_AGENT} msnbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} psbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot/2 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot/1 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Yahoo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Yahoo! [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Y!J-SRD
RewriteRule .* index.fcgi [L]
 
# If search engine, goto update.rb.org "Non static" focebily
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/update.rb$
RewriteCond %{HTTP_USER_AGENT} msnbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} psbot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot/2 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Googlebot/1 [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Yahoo [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Yahoo! [NC,OR]
RewriteCond %{HTTP_USER_AGENT} Y!J-SRD
RewriteRule .* update.fcgi [L]
 
# If there is cache, output from cache
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/([0-9]+\.html$)
RewriteCond 【tDiaryの場所(絶対パス)】/static/%1 -f
RewriteRule .* static/%1 [L]
 
# If there is no cache, output from cgi
RewriteRule ^([0-9]+)\.html$ index.fcgi?date=$1 [L]
RewriteRule ^([0-9]+[-]+[0-9]+)\.html$ index.fcgi?date=$1 [L]
 
# If it is comment, go to index.rb
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/$
RewriteCond %{REQUEST_METHOD} ^POST$
RewriteRule .* index.fcgi [L]
 
# If selecting a category, go to index.rb
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/$
RewriteCond %{REQUEST_METHOD} ^GET$
RewriteCond %{QUERY_STRING} ^.+$
RewriteRule .* index.fcgi [L]
 
# If there is no caache for top, go to index.rb
RewriteCond %{REQUEST_URI} ^\/【tDiaryの場所】\/$
RewriteCond %{QUERY_STRING} ^$
RewriteCond 【tDiaryの場所(絶対パス)】/index.html !-f
RewriteRule .* index.fcgi [L]

_ PC ツール

テーマを変えたり、設定変更したときに過去のキャッシュは自動じゃ変更されない。

なので、当日から日記を開始した2004年の12月31日まで週1回キャッシュを削除しながらツールで自動的に/dev/nullへwgetする。

と言っても、UserAgentとReferrerはちゃんと付けないと弾かれる。

所要時間は8年分で10分ほど。

今まではツールからtelnetでport80叩いていたんだけど、いろんな動作をちゃんとエミュレートしないとコメント欄が無いキャッシュができたりしたので改良。

本日のツッコミ(全1件) [ツッコミを入れる]
_ わし (2013-11-11(月) 01:01)

ツッコミのテストw



アクセスカウンター!
累計:
本日:
昨日:
最近のツッコミ