fand.jp
Open in
urlscan Pro
104.21.58.110
Public Scan
URL:
https://fand.jp/migrate-from-netlify-to-cloudflare-pages/
Submission: On June 17 via api from US — Scanned from JP
Submission: On June 17 via api from US — Scanned from JP
Form analysis
1 forms found in the DOM/search/
<form action="/search/"><input id="search-input" type="search" name="fand.jp[query]" class="form-control td-search-input" placeholder="Search ..." aria-label="ui-search"></form>
Text Content
* About * IT記事 * WordPress * Notion with Hugo * 技術メモ * 過去を見る * お問い合わせ NETLIFYをやめてCLOUDFLARE PAGESへ移行する【HUGO SSG】 2022年7月17日 投稿 4027文字 Hugo Netlify Cloudflare Cloudflare Pages SSL証明書 info iconこの記事は最終更新日から一定の時間が経過しています。情報が古くなっている可能性があるため注意してください。 Hugo で生成したコンテンツ(静的ウェブサイト)の公開用サーバーとして Netlify (無料プラン)を利用していましたが、若干アクセスが遅い気がしていたのと、Netlifyへのこだわりが強いわけでもなかったので、お引越し気分で Cloudflare Pages を試してみることにしました。 NETLIFY は本当に遅いのか 2020年8月時点の分析記事として、以下のブログが参考になります。 Netlifyが日本からだと遅い - id:anatooのブログ(blog.anatoo.jp) 約2年前ということで、今とは状況が違うかもしれません。そして、2021年5月時点、サポートによると東京ロケーションは High-Performance CDN と位置づけられているので(これは、無料枠ではないと解釈。調べていない)、2022年7月現在でも Netlify 無料枠を使う上では遅い解釈で正しいかもしれません。 Is there a list of where Netlify’s CDN pops are located? - Support - Netlify Support Forums(answers.netlify.com) この記事では “Netlify が遅いから引っ越す” というよりも、”Cludflare Pages への好奇心” の方が移行の動機として大きいため、本件にはこれ以上言及しません。 引っ越しの前提条件 既に Hugo を用いてコンテンツは生成してあるので、生成先ディレクトリ(デフォルトでは public/ )を新たなホスティングへ配置し直すだけです。 この記事では2種類の接続方法を記載してます。 * GitHub と接続し、Commit が発生したら自動で Cloudflare Pages へデプロイする * 公式CLI(wrangler cli)を用いて、ローカルのフォルダを Cloudflare Pages へデプロイする 今回は、Hugoの操作方法については記載していません。また、Cloudfareアカウントは作成済みであるものとします。 CLOUDFLAR PAGES プロジェクトの作り方 * GitHubと接続する過程で作成する * ファイルをブラウザ経由でアップロードする * wrangler cli を使って作成する 今回、最初にGitHubと接続をしたので、そのセットアップ過程でプロジェクトを作成しました。 GITHUBへの接続 GitHubへの接続を選択する。アイコンにある通り、GitHubおよびGitLabと接続できるようです。 次に、ここでプロジェクト名を決定します。作成後も変更画面はありました。(試していません) ここで作成したプロジェクト名が 後に公開されるURLになります。サイトは <your-project>.pages.dev(site-fandjp.pages.dev) として公開されます。 サイト生成のフレームワークも多数選択できました。 フレームワークを選択した後は、ビルドコマンドを指定します。 * ビルドコマンド: hugo --minify * ビルド出力ディレクトリは Hugo 標準: public (変更なし) 必要に応じて、環境変数もここで追加します。マニュアルには記載が見当たりませんが、指定しないと古いバージョンが使われるとのことなので、ローカルで利用している hugo のバージョンと合わせておきます。バイナリは +extended バージョンが利用されるようです。Hugo Modules を使っている場合も大丈夫とのこと。 (参考 Build configuration · Cloudflare Pages docs(developers.cloudflare.com) - Language support and tools) そして設定が完了し、デプロイに移ります。 初デプロイが27秒で完了しました。上出来。 ドメイン(レコード)の切り替え 最後に、ドメインをアクティブにします。(デプロイの後にこの画面が勝手に出てきました) 前提として、自サイトでは既に Cloudflare をドメインのネームサーバとして指定していますので、Cloudflare Pages セットアップの流れで切り替え操作まで完了するフローになっています(と思われます)。 試していないので想像ですが、Cloudflare で管理していないドメインの場合は「このレコードに切り替えてね」といったアナウンス画面になるのではと思います。 ただ、設定するレコードは CNAME で *.pages.dev 向けになりますので、Zone Apex(頭にサブドメインを伴わないドメイン自体を指す)の場合は、一般的には CNAMEレコードが設定できません(RFC 1912 - Common DNS Operational and Configuration Errors(datatracker.ietf.org))。その場合は結局、Cloudflare の管理下に移すことになるでしょう。 Netlify ではまさに、CNAEでNetlifyのロードバランサ用レコードを指す必要があったので、この時に Cloudflare 管理下に置いていました。 参考 CNAMEレコードにZone Apexをマッピングできない件について - サーバーワークスエンジニアブログ(blog.serverworks.co.jp) パフォーマンスを軽くベンチマーク 冒頭で「レスポンスは目的ではなかった」と言いつつも関心はありますので評価してみます。自サーバーではなくサービスプロバイダーの設備ですので、攻撃にならないよう控えめの数字で軽くベンチします。 前提:Apache Bench コマンドを使いますが、この実行環境の MacBook そのものが無線LAN接続なので、負荷評価用の環境としては非常にお粗末です。軽い参考・目安程度でご覧ください。 NETLIFYだった場合のベンチ ab -c 4 -n 100 https://********* Server Software: Netlify Server Hostname: ********* Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-ECDSA-CHACHA20-POLY1305,256,256 Server Temp Key: ECDH X25519 253 bits TLS Server Name: ********* Document Path: / Document Length: 24332 bytes Concurrency Level: 4 Time taken for tests: 12.878 seconds Complete requests: 100 Failed requests: 0 Total transferred: 2466308 bytes HTML transferred: 2433200 bytes Requests per second: 7.77 [#/sec] (mean) Time per request: 515.127 [ms] (mean) Time per request: 128.782 [ms] (mean, across all concurrent requests) Transfer rate: 187.02 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 229 275 54.7 244 432 Processing: 146 179 158.6 151 1723 Waiting: 77 123 140.7 86 1458 Total: 379 453 176.1 420 2117 Percentage of the requests served within a certain time (ms) 50% 420 66% 453 75% 474 80% 493 90% 528 95% 544 98% 583 99% 2117 100% 2117 (longest request) # 2回目(1分後くらいに) Concurrency Level: 4 Time taken for tests: 11.904 seconds Complete requests: 100 Failed requests: 0 Total transferred: 2466400 bytes HTML transferred: 2433200 bytes Requests per second: 8.40 [#/sec] (mean) Time per request: 476.148 [ms] (mean) Time per request: 119.037 [ms] (mean, across all concurrent requests) Transfer rate: 202.34 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 231 291 57.8 270 476 Processing: 146 169 41.9 151 353 Waiting: 76 107 40.4 83 256 Total: 378 460 81.3 437 812 Percentage of the requests served within a certain time (ms) 50% 437 66% 474 75% 495 80% 501 90% 563 95% 585 98% 785 99% 812 100% 812 (longest request) CLOUDFLARE PAGESのベンチ ❯ ab -c 4 -n 100 https://********/ Server Software: cloudflare Server Hostname: ******** Server Port: 443 SSL/TLS Protocol: TLSv1.2,ECDHE-RSA-CHACHA20-POLY1305,2048,256 Server Temp Key: ECDH X25519 253 bits TLS Server Name: ******** Document Path: / Document Length: 23528 bytes Concurrency Level: 4 Time taken for tests: 6.367 seconds Complete requests: 100 Failed requests: 0 Total transferred: 2437464 bytes HTML transferred: 2352800 bytes Requests per second: 15.71 [#/sec] (mean) Time per request: 254.672 [ms] (mean) Time per request: 63.668 [ms] (mean, across all concurrent requests) Transfer rate: 373.87 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 40 112 86.6 77 353 Processing: 36 123 123.8 64 628 Waiting: 31 96 105.9 55 516 Total: 82 234 143.5 158 871 Percentage of the requests served within a certain time (ms) 50% 158 66% 305 75% 336 80% 359 90% 401 95% 498 98% 681 99% 871 100% 871 (longest request) # 2回目 Concurrency Level: 4 Time taken for tests: 14.858 seconds Complete requests: 100 Failed requests: 0 Total transferred: 2437472 bytes HTML transferred: 2352800 bytes Requests per second: 6.73 [#/sec] (mean) Time per request: 594.337 [ms] (mean) Time per request: 148.584 [ms] (mean, across all concurrent requests) Transfer rate: 160.20 [Kbytes/sec] received Connection Times (ms) min mean[+/-sd] median max Connect: 37 453 488.3 91 1220 Processing: 34 91 79.8 64 396 Waiting: 33 68 42.2 56 228 Total: 80 545 491.8 254 1466 Percentage of the requests served within a certain time (ms) 50% 254 66% 1116 75% 1133 80% 1139 90% 1177 95% 1260 98% 1357 99% 1466 100% 1466 (longest request) Connect の時間が大きく改善されました!と言いたいところですが、2回目のブレが多すぎました。 やはり有線LANでやらないとノイズが酷いですが、Netlify の2回平均よりも遥かに良好な値が Cloudflare Pages で一度確認できたので、とりあえず良しとします。 注意 繰り返しますが、とても雑な評価なので参考程度にしてください。Netlifyを不当に悪評価とする意図はありません。 CLOUDFLARE PAGES CLI (WRANGLER) の利用 ローカルディレクトリをアップロードするための操作です。Wrangler そのものは、Cloudflare Workers のためのCLIのようです。 > Wrangler is a command-line tool for building Cloudflare Workers Get started · Cloudflare Workers docs(developers.cloudflare.com) $ npm install -g wrangler $ wrangler login ⛅️ wrangler 2.0.22 -------------------- Attempting to login via OAuth... Successfully logged in. Would you like to help improve Wrangler by sending usage metrics to Cloudflare? (y/n) Your choice has been saved in the following file: ./.wrangler/config/metrics.json. You can override the user level setting for a project in `wrangler.toml`: - to disable sending metrics for a project: `send_metrics = false` - to enable sending metrics for a project: `send_metrics = true` プロジェクト一覧を確認できます。 $ wrangler pages project list Retrieving cached values for account from node_modules/.cache/wrangler ┌──────────────┬───────────────────────┬──────────────┬────────────────┐ │ Project Name │ Project Domains │ Git Provider │ Last Modified │ ├──────────────┼───────────────────────┼──────────────┼────────────────┤ │ *********** │ ***********.pages.dev │ Yes │ 17 minutes ago │ └──────────────┴───────────────────────┴──────────────┴────────────────┘ アップロードの際は、対象ディレクトリとプロジェクト名を指定して実行。 ❯ CLOUDFLARE_ACCOUNT_ID=XXXXXXXXXXXXXXXXX npx wrangler pages publish public --project-name=*********** Retrieving cached values for account_id from node_modules/.cache/wrangler 🌍 Uploading... (287/287) ✨ Success! Uploaded 151 files (136 already uploaded) (3.87 sec) ✨ Deployment complete! Take a peek over at https://d000abcd.***********.pages.dev たったの4秒で完了しました。Netlifyのときは数十秒かかるケースもあったので、地味に嬉しい。 CLIでアップロードした場合は、Web画面上では以下の通りシンプルな表示に。 FUNCTIONS Javascript または Typescript で用意できるみたいです。 Functions (beta) · Cloudflare Pages docs(developers.cloudflare.com) 今回の Hugo コンテンツでも独自のスクリプト(API)を一部で利用していますが、Netlify や Cloudflare Pages などのプロバイダーに依存しないよう別立てしています。おかげで今回、 Netlify への依存機能が無くて移行も1時間とかからなかったので、今後も別のプロバイダーを試す可能性がある場合は、疎結合にしておくのがよいかなと思います。 設定のメモ 最終的に設定した環境変数 本番環境へは HUGO_ENV: production を設定しています。 ***.PAGES.DEV の検索エンジンインデックス回避 カスタムドメイン(独自ドメイン)を割り当てて使うケースも多いと思います。 カスタムドメインを割り当てたとしても、デフォルトで割り当てられる Cloudflare Pages のドメイン( ***.pages.dev )は並列で利用できます。万一検索エンジンBOTがアクセスしてきてインデックスされると重複してしまいますので、以下の通り条件を指定して noindex ヘッダーを返すようにします。 _headers ファイルを最上位(index.html等)の場所に配置し、以下の内容を記載するだけです。これにより、 X-Robots-Tag を理解できるロボットのインデックスを回避できます。 https://<your-project-name>.pages.dev/* X-Robots-Tag: noindex robots メタタグの指定 | Google 検索セントラル | ドキュメント | Google Developers(developers.google.com) ほかのやり方として、 rel=canonical を設定しておくことでも問題ないでしょう。これならば、今後同等の問題が他のプロバイダーで発生しても問題を回避できますね。 重複した URL を正規タグに統合する | Google 検索セントラル | ドキュメント | Google Developers(developers.google.com) まとめ Netlify から Cloudflare Pages へ移行する経緯を記載しました。 もともと Cloudflare を DNS 環境として利用していてアカウントが整っていたというのもありますが、思い立ってから軽く調べてデプロイの完了まで1時間程度で完了したので、この手軽さは素晴らしいと思いました。 パフォーマンスの理由ももちろんですが、DNS と 静的サイト収容、そしてCDNを同一プロバイダーへまとめることができたので、管理画面が統合されたのも嬉しいです。複数の管理画面を行ったり来たりは面倒ですからね。 その他参考 * リダイレクトのやり方 * Redirects · Cloudflare Pages docs(developers.cloudflare.com) * ヘッダーの設定方法 * Headers · Cloudflare Pages docs(developers.cloudflare.com) 関連するかもしれない記事 SUPER PAGE CACHE FOR CLOUDFLARE (WORDPRESS PLUGIN) Cloudflare を利用した WordPress キャッシュのアプローチ2 … [ポートフォリオサイト制作] 静的サイトジェネレーター HUGO での作成手順 独立や副業など、個人のスキルをアピールする機会が増えている時代ですね。案件へ応募するときなど、自身の … HUGO のサイトで BOOTSTRAP 4→5 アップグレードする手順例 Hugo で利用している Docsy テーマのBootstrap 5 対応予定について調べたところで … [HUGO] モバイル検索結果へサムネイル画像を表示 - PAGEMAPデータ Google 検索結果をちょっとリッチにするためのサムネイル画像の指定方法。 Google 検索結果 … JSON-LD 構造化データの作成や更新日の表現方法 公開・更新日時を表現するためのJSON-LD 「T」が日付と時間の区切り。ZがタイムゾーンがUTCと … [HUGO] DOCSY テーマのタグ一覧ページを NOINDEX にする方法 この記事では Docsy テーマを題材としているが、考え方はその他のテンプレートでも適用可能。ただ … 新着記事 [ポートフォリオサイト制作] 静的サイトジェネレーター Hugo での作成手順 独立や副業など、個人のスキルをアピールする機会が増えている時代ですね。案件へ応募するときなど、自身のタレント性やキャリアをアピールするWebサイトがあ … 静的サイトジェネレーターとは何か?WordPress などの動的サイトとの比較と基礎のまとめ 現代のWebサイトの4割に近いサイトが WordPress で作成されているといいます。WordPress はとても優れたソフトウェアであること、そし … Rails で作られた OSSプロジェクト紹介 (Alaveteli, chatwoot, ciao, discourse, Feedbin) 便利なOSSプロジェクトが存在しているのに、類似機能を提供する有料サービスにお金を払っていたり、あるいは知らないことでわざわざ機能が劣るソフトウェアを … [Kubernetes] Prometheus MySQL Exporter インストール方法 Kubernetes (GKE) へ Prometheus の MySQL Exporter をインストールするための情報を記載します。この記事では以 … [Kubernetes] Prometheus Operator を Helm でイントールする方法 先日は Helm および Helmfile の利用手順をまとめることを目的に Prometheus と Grafana のインストールをしましたが、こ … タグ一覧 Kubernetes Hugo WordPress Docker プログラミング Notion Rails Google Cloud Platform (GCP) 静的サイトジェネレーター(SSG) SSL証明書 記事の見出し * Netlify は本当に遅いのか * 引っ越しの前提条件 * Cloudflar Pages プロジェクトの作り方 * GitHubへの接続 * ドメイン(レコード)の切り替え * パフォーマンスを軽くベンチマーク * Netlifyだった場合のベンチ * Cloudflare Pagesのベンチ * Cloudflare Pages CLI (wrangler) の利用 * Functions * 設定のメモ * 最終的に設定した環境変数 * ***.pages.dev の検索エンジンインデックス回避 * まとめ * その他参考 FAND.JP 当サイトは、ITのインフラ技術に関する情報や、その他個人的に関心のあるテーマに関する記事を執筆しています。 サイトの概要は About をご覧ください。 SOFTWARE Noti on Hugo Exporter BLOG CONTENTS IT WordPress Notion General Archives CONTACT About Form Social link: © 2023 fand.jp. Privacy Policy