はじめに

Rails で sitemap_generator を使って sitemap(sitemap.xml.gz)を作成する方法にについて整理した。

実運用で使うであろう whenever と組み合わせたバッチ処理についても合わせて整理した。

TL;DR

  • Gemfile に sitemap_generator, whenever を追加してインストール
  • [bundle exec] rails sitemap:installconfig/sitemap.rb を作成
    • sitemap.xml.gz に出力したい内容を記述
  • [bundle exec] rails sitemap:refreshpublic/sitemap.xml.gz の作成や更新
  • [bundle exec] wheneverizeconfig/schedule.rb を作成
    • 定期的に処理したい内容(rake 'sitemap:refresh')を記述
  • [bundle exec] whenever --update-crontab で cron ジョブの設定

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. kjvarga/sitemap_generator
      1. インストール
      2. サイトマップ作成
    2. javan/whenever
      1. インストール
      2. セットアップ
      3. ジョブ登録
      4. メモ
      5. Tips: direnv との併用
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ sw_vers
ProductName: Mac OS X
ProductVersion: 10.15.1
BuildVersion: 19B88

$ ruby -v
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin18]

$ rails -v
Rails 5.2.3

$ bundle list | grep -e sitemap_generator -e whenever
* sitemap_generator (6.0.2)
* whenever (1.0.0)

詳細

kjvarga/sitemap_generator

sitemap.xml.gz を簡単に作成できる gem。

インストール

Gemfilegem 'sitemap_generator' を追加して bundle install

1
+gem 'sitemap_generator'
1
$ bundle install
セットアップ

以下コマンドで初期設定、config/sitemap.rb が作成される。

1
$ bundle exec rails sitemap:install

config/sitemap.rb に、sitemap として生成したい内容を記述する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# アプリケーションのドメイン
SitemapGenerator::Sitemap.default_host = "https://your.domain"

# サイトマップとして出力したいページを記述
SitemapGenerator::Sitemap.create do
# https://your.domain/user/{id} を追加する処理
# 50件ずつ処理
User.in_batches(of: 50) do |users|
users.each do |user|
# 更新頻度は日毎、最終更新時刻は User モデルの更新時刻
add user_path(user), changefreq: :daily, lastmod: user.updated_at
end
end
end

参考サイトで add root_path としている例を見るが、root_path はデフォルトで追加されるので気にしなくて良い。

サイトマップ作成

以下コマンドで public/sitemap.xml.gz を作成

1
$ bundle exec rails sitemap:create

いきなり sitemap:refreshsitemap:refresh:no_ping としても問題はない。

1
2
$ bundle exec rails sitemap:refresh
# 更新用のコマンドだが public/sitemap.xml.gz がなければ生成される

javan/whenever

Rails 関連の cron ジョブを簡単に設定できる gem

インストール

Gemfilegem 'whenever' を追加して bundle install

1
+gem 'whenever'
1
$ bundle install

セットアップ

bundle exec wheneverizeconfig/schedule.rb が生成される

1
$ bundle exec wheneverize

config/schedule.rb に定期実行したい内容を記述。今回はサイトマップを更新したいので rake 'sitemap:refresh' を追記。

1
2
3
4
5
# 毎日 13:30 に処理を実行
# sitemap を更新
every 1.day, at: '23:55 pm' do
rake 'sitemap:refresh'
end

ジョブ登録

bundle exec whenever --update-crontab を実行すると cron ジョブとして登録できる

実行前

1
2
$ crontab -l
# 何もなし

ジョブ登録

1
2
$ bundle exec whenever --update-crontab
[write] crontab file updated

実行後は、下記のように登録される

1
2
3
4
$ crontab -l
# Begin Whenever generated tasks for: /path/to/app/config/schedule.rb at: 2019-12-04 03:21:36 +0900
55 23 * * * /bin/bash -l -c 'cd /path/to/app && RAILS_ENV=production bundle exec rake sitemap:refresh --silent'
# End Whenever generated tasks for: /path/to/app/config/schedule.rb at: 2019-12-04 03:21:36 +0900

メモ

ジョブとして登録できるのは command, rake, runnber, script の4つっぽい。

1
2
3
4
5
# https://github.com/javan/whenever#define-your-own-job-types
job_type :command, ":task :output"
job_type :rake, "cd :path && :environment_variable=:environment bundle exec rake :task --silent :output"
job_type :runner, "cd :path && bin/rails runner -e :environment ':task' :output"
job_type :script, "cd :path && :environment_variable=:environment bundle exec script/:task :output"

Tips: direnv との併用

direnv を使って環境変数を設定している場合、別途シェルスクリプトを作成しておいて、それをジョブで実行するようにした方が良い。

1
2
3
#! /bin/bash
cd /path/to/app
/url/local/bin/direnv exec . your_command

※direnv による環境変数の設定はディレクトリに移動したときに有効となるが、cron ジョブなどだと環境変数が有効にならずにエラーになることがある

まとめ

  • Gemfile に sitemap_generator, whenever を追加してインストール
  • [bundle exec] rails sitemap:installconfig/sitemap.rb を作成
    • sitemap.xml.gz に出力したい内容を記述
  • [bundle exec] rails sitemap:refreshpublic/sitemap.xml.gz の作成や更新
  • [bundle exec] wheneverizeconfig/schedule.rb を作成
    • 定期的に処理したい内容(rake 'sitemap:refresh')を記述
  • [bundle exec] whenever --update-crontab で cron ジョブの設定

その他・メモ

Nginx を使っている場合は設定ファイルを更新し、再起動するとアクセスできるようになる(はず)

1
2
3
+location ~ ^/sitemap.xml.gz {
+ root /path/to/app/public;
+}

参考文献

関連記事