毎日定時にサイトマップを生成し、GoogleにPingするのは whenever + sitemap_generator でカンタンに実現できるのですが、いくつかの特殊要件を満たすために工夫したことをまとめておきます。
なお、使っている gem の version は以下の通りです。
- rails: 4.2.0
- whenever: 0.9.4
- sitemap_generator: 5.1.0
production のみ whenever を有効に
素直に
every 1.day, at: '10:00 am' do
rake 'sitemap:refresh'
end
と書くと、sandbox や staging 等でも crontab に登録され、Google に Ping されるので避けたいところです。
if @environment.to_sym == :production
every 1.day, at: '10:00 am' do
rake 'sitemap:refresh'
end
end
と書けば、production だけで 有効になります。
See: https://github.com/javan/whenever/wiki/Setting-variables-on-the-fly
S3から sitemap.xml.gz を配信する
一般的には sitemap_generator で生成したサイトマップは Nginx や Apache 等の Web サーバから配信すればいいのですが、事情により Webサーバから配信できないこともあります。
代替手段として最も手軽なのは(たぶん)S3 でのホスティングだと思われます。
sitemap_generator にはアダプターがあり
SitemapGenerator::Sitemap.adapter = SitemapGenerator::S3Adapter.new(fog_provider: 'AWS',
aws_access_key_id: <your-access-key-id>,
aws_secret_access_key: <your-access-key>,
fog_directory: <your-bucket>,
fog_region: <your-aws-region e.g. us-west-2>)
という風に設定することができます。
https://github.com/kjvarga/sitemap_generator/wiki/Generate-Sitemaps-on-read-only-filesystems-like-Heroku
S3 にあるサイトマップをWebマスターツールに登録
Webマスターツールでは所有ドメイン外にあるサイトマップは登録できない(少なくとも調べた範囲では)ので、例えば /sitemap という path を S3 にリダイレクトしてあげればよさそうです。
get '/sitemap' => redirect('https://s3-ap-northeast-1.amazonaws.com/your-bucket/sitemaps/sitemap.xml.gz')
こんな感じで routes.rb を書けば ok。