2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Rails] sitemap_generator使ってsitemap作成、GAEにデプロイ

Posted at

sitemapとは

GoogleやYahooなどの検索エンジンに、サイトの登録をする際に必要なファイル。
Search Console(Google検索登録サービス)で、聞かれるやつ。
中身は主に、検索で表示させたいページの情報が載っている。

sitemap_generator追加

Gemfileに追記。※ Githubはこちら

Gemfile
gem 'sitemap_generator'

gemをインストール

$ bundle install

sitemap.rbを作成

下記コマンドを実行すると、config/sitemap.rbが生成される。

$ rails sitemap:install

生成された、config/sitemap.rbを編集していく。
SitemapGenerator::Sitemap.default_host は、本番でのhostを入れる。
SitemapGenerator::Sitemap.createの中に、検索に登録したいページを記述していく。

config/sitemap.rb
require 'rubygems'
require 'sitemap_generator'

SitemapGenerator::Sitemap.default_host = "http://www.example.com"
SitemapGenerator::Sitemap.create do
  add '/', changefreq: 'weekly', priority: 0.9
  add '/about', changefreq: 'weekly', priority: 0.5

  User.all.each do |user|
    add user_path(user), lastmod: spot.updated_at
  end
end

ローカルで、実行してみる。

$ rails sitemap:refresh

sitemapの更新と検索エンジンに通知が走る。
検索エンジンに、通知したくない場合は、no_pingをつける。

$ rails sitemap:refresh:no_ping

実行すると、public/sitemap.xml.gzが生成されていることが確認できる。
http://localhost:3000/sitemap.xml.gz よりダウンロードできる。

[GCP] cron job 設定

sitemap.xml.gzはUserが作成されるたびに、更新をする必要があるので、cron jobにて一日ごとに定期実行する。
そのためのエンドポイントを追加。

cron_jobs_controller.rb
class CronJobsController
  def refresh
    logger.info `bundle exec rails sitemap:refresh`
    head :ok

  rescure StandardError => e
    logger.error e.full_message
    head :internal_server_error
  end
end
routes.rb
Rails.application.routes.draw do
  ...

  resources :sitemaps, only: [:index]
end

cron.yamlに設定を追加。

cron.yaml
cron:
- description: sitemap
  url: /cron_jobs/sitemaps
  timezone: Asia/Tokyo
  schedule: every day 03:00

cron jobsの設定をデプロイ。

$ gcloud app deploy cron.yaml --project=target-project

これでcron jobsによる定期実行の設定が完了です。

[GCP] sitemap.xml.gzをGCSに上げるよう設定

本番環境のGAEでは、スケールアウトのため3インスタンスを扱っている。
このため、動的にファイルを生成してインスタンスに置いた場合1/3の確率でしかファイルがヒットしない。

そもそもPaaS環境下でインスタンスに生成ファイルを置くことがアンチパターンである。
外部ストレージ(GCS)にアップすることが良い。
Computed Engineなどを使っている場合は問題ない。

sitemap_generatorのドキュメントにあるように、GCSの設定をconfig/sitemap.rbに追加する。

SitemapGenerator::GoogleStorageAdapter
Uses Google::Cloud::Storage to upload to Google Cloud storage.
You must require 'google/cloud/storage' in your sitemap config before using this adapter.
An example of using this adapter in your sitemap configuration with options:

by https://github.com/kjvarga/sitemap_generator#upload-sitemaps-to-a-remote-host-using-adapters

config/sitemap.rb
require 'rubygems'
require 'sitemap_generator'
require 'google/cloud/storage'

SitemapGenerator::Sitemap.default_host = ENV['BASE_URL']
SitemapGenerator::Sitemap.sitemaps_host = "https://storage.googleapis.com/#{ENV['GOOGLE_BUCKET']}"
SitemapGenerator::Sitemap.adapter = SitemapGenerator::GoogleStorageAdapter.new(
  credentials: ENV['GOOGLE_CREDENTIAL'],
  project_id: ENV['GOOGLE_PROJECT_ID'],
  bucket: ENV['GOOGLE_BUCKET']
)
SitemapGenerator::Sitemap.create do
  add '/', changefreq: 'weekly', priority: 0.9
  add '/about', changefreq: 'weekly', priority: 0.5

  User.all.each do |user|
    add user_path(user), lastmod: spot.updated_at
  end
end

https://domain/sitemap.xml.gzでアクセスが来た際に、GCS上のsitemap.xmlにredirectさせるルーティングを追加。

routes.rb
Rails.application.routes.draw do
  ...

  get '/sitemap.xml.gz', to: redirect("https://storage.googleapis.com/#{ENV['GOOGLE_BUCKET']}/sitemap.xml.gz", status: 301)
end

これで、再度GAEのインスタンスデプロイをすれば設定完了。
cron jobが動いた後に、https://domain/sitemap.xml.gzでアクセスすれば、sitemap.xml.gzをダウンロードできる。

参考

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?