1. tackeyy

    Posted

    tackeyy
Changes in title
+Railsでsitemapを自動で生成して定期的に更新するようにする
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,121 @@
+勉強もかねて自分のブログをrailsで作って運用しています。
+http://tackeyy.com/
+
+せっかくなのでSEO対策をしようと思い、その一貫でsitemapを作成して、
+定期的にsitemapを最新にする仕組みを導入してみました。
+Rails 5.0.2で動作を確認していますが、Rails 4.x.x でも問題ないかと思います。
+
+仕組みを導入といっても以下のGemを組み合わせるだけでかんたんにできます。
+
+- [sitemap_generator](https://github.com/kjvarga/sitemap_generator)
+ - その名の通りsitemapを生成するためのGemです。
+
+- [whenever](https://github.com/javan/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にはこんな感じで自分のサイトの情報を記載してください。
+今回の場合は私の[ブログ](http://tackeyy.com/)なので、トップページやカテゴリー、各ポストを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 deploy ` で ` bash: 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](https://i.gyazo.com/a8278ceaba2de06f9d7517b1a29a24f3.png)](https://gyazo.com/a8278ceaba2de06f9d7517b1a29a24f3)
+
+サイトマップがちゃんと読み込めているところまで確認できました。