varnishにキャッシュさせるrubyのメモ

サーバースペックがしょぼいのでできるだけのことはやらないとダメ。
304,max-age,expire等をレスポンスヘッダに適切に作ればノンアクセスでページを描画してくれる(いままで無頓着だった。)+varnish併用の状態でキャッシュ戦略を考えている。プログラム的には都度データソースを読む動的な性質だが、db内容は一日に一回のcronでの更新以外には変更されない静的なものなので静的なものとして扱いましょう、とか。
試行錯誤の途上です。今のところ
例)
/flesh/ =>キャッシュさせないでpassする。
/search/ => 12時間ぐらいはttlする。
/stat/ => 統計周りとしてpassとか(未実装)
subsonicが遅すぎるので始めた音楽系ファイルの自作も貧弱なサーバーとは思えない感じになってきている。
varnish => apache2 => passenger => sinatra => mongodbでwebを作り、mongodbにファイルシステムをクロールした結果を書き込んでいる。
apache2 focusedな周辺のいろんなプログラムが使いたいのでnginxではないかなと。
書き込みは無いプログラムなのでvarnishがあればunicornはいらないかな、と。
index + jsonAPIでの作成なのでrailsの「激重routeだけどページは異様に作りやすい」よりもsinatraが適切。
indexを適切に作ったmysqlはmongodbと同じぐらい速いらしいけどmongodbのスキーマレスの魅力には贖えまいて。トランザクションいらない。

で、
深夜にcronでmongoに書き込んだあとでweb経由でアクセスしておけばvarnishが動いてくれて幸福実現となりそう。

#! /usr/bin/env ruby
# -*- coding:utf-8 -*-

load File.dirname(__FILE__) + '/models.rb'

require 'mechanize'
require 'json'
require 'uri'

def get(args)
  agent = Mechanize.new #省メモリ(but低速)を期待,ガベージコレクタが都度破棄してくれれば...
  agent.user_agent_alias = 'Windows IE 7'
  args[:p] ||=1
  args[:per]||= 5000
  # 192.168.110.7:3128はsshトンネルで東京modeverv.a.lisonl.com:3128のsquidになっており外側からの接続となる。
  agent.set_proxy('192.168.110.7', 3128)   if(args[:useproxy])
  url = "#{args[:uri]}?p=#{args[:p]}&per=#{args[:per]}&qs=#{URI.encode(args[:qs])}"
  puts url
  agent.get url
  pj = JSON.parse agent.page.body
  if pj[0].next == "yes"
    return get({
                 useproxy:true,
                 uri:args[:uri],
                 p:args[:p] + 1,
                 per:args[:per],
                 qs:args[:qs],
               })
  else
    puts "end of search #{args[:qs]}"
  end
rescue => ex
  puts ex
  puts "end this qs attempt : #{args[:qs]}"
end

def main_genre(useproxy)
  # memo http://modeverv.dyndns.org/musicdb/api/search_by_genre?p=2&per=5000&qs=VOCALOID
  args = {}
  if useproxy
    args[:uri] ||= "http://modeverv.dyndns.org/musicdb/api/search_by_genre"
    args[:useproxy] = true
  else
    args[:uri] ||= "http://192.168.110.7/musicdb/api/search_by_genre"
  end
  Genremodel.all.only(:name).to_a.each do |g|
    args[:qs] = g.name
    get(args)    
  end
end

main_genre(false)
main_genre(true)
# ruby /Volumes/smb/seijiro/sinatra/musicdb/varnish_atack.rb 

こんなイメージで幸せになれるだろう。
TODO purgeリクエストした上でアクセスすべき。
TODO スクレイピング系もやっちゃえばよいですか。
http://modeverv.dyndns.org/musicdb
http://modeverv.dyndns.org/musicdb/file/4e9f62a99ef02f5fd0000001/%E5%85%AD%E7%AD%89%E6%98%9F%E3%81%AE%E5%A4%9C/%E5%85%AD%E7%AD%89%E6%98%9F%E3%81%AE%E5%A4%9C/Aimer
http://modeverv.dyndns.org/musicdb/files?midskey=4ea9159f9ef02f2855000004