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