1. tackeyy

    Posted

    tackeyy
Changes in title
+Railsでsitemapを自動で生成して定期的に更新するようにする
Changes in tags
Changes in body
Source | HTML | Preview

勉強もかねて自分のブログをrailsで作って運用しています。
http://tackeyy.com/

せっかくなのでSEO対策をしようと思い、その一貫でsitemapを作成して、
定期的にsitemapを最新にする仕組みを導入してみました。
Rails 5.0.2で動作を確認していますが、Rails 4.x.x でも問題ないかと思います。

仕組みを導入といっても以下のGemを組み合わせるだけでかんたんにできます。

  • sitemap_generator

    • その名の通りsitemapを生成するためのGemです。
  • whenever

    • ActiveJobのような記述でサーバー上のcronの設定を簡単に行えるGemです。今回はsitemap_generatorを定期的に実行するために使用します。

今から説明する内容はこちらのコミットにまとまっているので、
ソースを先に見たい方はこちらを確認してみてください。
https://github.com/tackeyy/blog/commit/d7d65b7addb58c9850a7b79be1c176e6b5b7ef35

sitemap_generatorを使ってsitemapを生成する

Gemfileに追記して bundle install します。

# Site map
gem 'sitemap_generator'

gemのインストールができたら以下のコマンドでsitemap.rbを作成します。

gem install sitemap_generator

生成されたsitemap.rbにはこんな感じで自分のサイトの情報を記載してください。
今回の場合は私のブログなので、トップページやカテゴリー、各ポストをsitemapに追加するための設定をします。

# Set the host name for URL creation
SitemapGenerator::Sitemap.default_host = Settings.url

SitemapGenerator::Sitemap.create do
  add root_path            # root_pathをsitemapに追加する
  add categories_path # categories_pathをsitemapに追加する

  # 各投稿をsitemapに追加する
  Post.shipped.each do |post|
    add blog_path(post.friendly_id || post.id), lastmod: post.updated_at
  end
end

記法やオプションは以下から確認できます。
https://github.com/kjvarga/sitemap_generator#a-simple-example

sitemap.rbを記載したらsitemapがきちんと生成されるかどうかを確認するために以下のコマンドでsitemapを作成します。

rake sitemap:refresh:no_ping

rake sitemap:refresh だとサーチエンジンに新しいサイトマップを生成しました、と通知を自動で送ってくれるのですが、
まだローカルでの動作確認だけを行いたいので no_ping オプションをつけています。

こんな感じのログがコンソールに表示されればOKです。

In '/Users/tackeyy/dev/blog/public/':
+ sitemap.xml.gz                                           1 links /  325 Bytes
Sitemap stats: 1 links / 1 sitemaps / 0m00s

毎回サイトマップを作成するのは面倒なのでwhenever x capistranoで自動化する

Gemfileを記載してbundle installします。

 +# Manage crontab
 +gem 'whenever', require: false

Capfileに追記します。

require 'whenever/capistrano'

config/schedule.rbを作成します。
(wheneverのコマンドもありますが、ファイル作成だけなので手動でもOKです)

 +set :output, 'log/crontab.log'
 +
 +every 1.week , roles: %i(app) do
 +  rake '-s sitemap:refresh'
 +end

これで終わりです。

cap production deploybash: bundle: command not found などが出たりする場合は、
以下の記事を参考にしてみてください。

http://qiita.com/zaru/items/348c126a205a2e48b4d6
http://stackoverflow.com/questions/9482298/rails-cron-whenever-bundle-command-not-found

本番環境でsitemapを作成

crontab -l でcronの設定ができているか確認します。
初回のみ本番環境で以下のコマンドを実行してsitemapを生成してあげましょう。

bundle exec rake sitemap:refresh RAILS_ENV=production
In '/var/www/blog/releases/20170429161257/public/':
+ sitemap.xml.gz                                           1 links /  325 Bytes
Sitemap stats: 1 links / 1 sitemaps / 0m00s

Pinging with URL 'http://tackeyy.com/sitemap.xml.gz':
  Successful ping of Google
  Successful ping of Bing

最後は念のためSearchConsoleでsitemapがちゃんと読み込めているか確認します。

https://gyazo.com/a8278ceaba2de06f9d7517b1a29a24f3

サイトマップがちゃんと読み込めているところまで確認できました。