Googleにいち早くインデックスしてもらうのはSEOを考えると重要です。
Railsで作成している私のブログでは毎日sitemapを作成した後に検索エンジンに対して通知を飛ばしていますが、
投稿したブログがインデックスされるまでに少し時間がかかってしまいます。
ブログを投稿後にPubSubHubbubにPOSTリクエストをすればより早くインデックスしてもらいやすくなるため、今回対応してみました。
この記事は個人ブログでも掲載しています。
http://tackeyy.com/blog/send-post-request-to-pubsubhubbub
PubSubHubbubとは
PubSubHubbub (パブサブハブバブ) とは、更新情報を Google にリアルタイムで通知することができるプロトコルです。略して、PuSH (プッシュ) とも呼ばれます。Pub は Publisher (配信)、Sub は Subscriber (購読) を意味しており、その間に Hub というサービス (中間サーバ) があるため、このような名前になっています。配信側がコンテンツを更新すると、Hub が購読側に通知を行います。購読側は更新情報をすぐに知ることができるため、リアルタイムの情報配信が実現できる仕組みになっています。
PubSubHubbubについて調べたのですが、引用させていただいた上記の記事が一番わかりやすかったので、目を通しておくと良いです。
PubSubHubbubにPOSTリクエストを送る
今回実装するのはこのブログなので、記事が公開されたタイミングでPubSubHubbubに対して投稿した記事のURLをPOSTします。
URLをPOSTするだけなので自前で実装できそうですが、車輪の再発明になりそうなのでGemを探してみました。
PubSubHubbub対応に使えるGems
Star数も多くPubSubHubbubが鉄板なようです。
pubsubhubbubはマストドンの人が作ってるGemで、フィードなどがある場合は使い勝手が良さそうです。
今回はPubSubHubbubとnagareboshiを比較して以下の3点の理由からnagareboshiを採用しました。
- シンプル
-
Nagareboshi::Sender.publish("http://example.com/")
でOK
- 名前が良い
- PubSubHubbubは
EventMachine.run
ですが、Nagareboshi::Sender.publish
の方が個人的にわかりやすい(EventMachineってなんやねんと思う) - shooting_starもいいですねw
- 自分でメンテできそう
- star数が少なくてメンテされてなさげですが、コード量も少なくやっていることもシンプルなので何かあっても自分でメンテできそうです
nagareboshi(Gem)を使ってPubSubHubbubにPOSTする
nagareboshiでPubSubHubbubにPOSTする対応をした以下のコミットを簡単に説明します。
- Gemfileにnagareboshiを追加
Gemfile
+# PubSubHubbub
+gem 'nagareboshi'
- nagareboshiの設定を追加
config/initializers/nagareboshi.rb
+Nagareboshi.configure do |config|
+ config.send = Rails.env.production?
+end
- ブログ投稿後にPubSubHubbubにURLをPOST
app/models/post.rb
+ after_create :post_pubsubhubbub
+ private
+
+ def post_pubsubhubbub
+ return if wip?
+ # modelではRailsのヘルパーが使えないので *_path じゃなくてべた書き
+ Nagareboshi::Sender.publish("#{Settings.url}/blog/#{friendly_id}")
+ end
PubSubHubbubにPOSTが成功したら204が返るので2xx系じゃなければエラーとしたり、Slack通知したりすれば良いと思います。(個人のSlackチーム作ってないし、エラーだと投稿できずにだるいのでいったん未対応です)
[1] pry(#<Post>)> Nagareboshi::Sender.publish("http://example.com/")
=> #<Net::HTTPNoContent 204 No Content readbody=true>
以上です。
最後に
上記の対応を行った後に記事を投稿して30分経っても、インデックスが確認できず・・・
以下のように site:url
でインデックスされているかの確認ができます。
site:http://tackeyy.com/blog/how-to-make-github-issue-and-pull_request-template