Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張
Search
Hatena
February 25, 2025
Technology
0
390
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張
Hatena Engineer Seminar #32 はてなブログ新機能基盤の開発編 の発表資料です
https://hatena.connpass.com/event/344958/
Hatena
February 25, 2025
Tweet
Share
More Decks by Hatena
See All by Hatena
はてなインターンシップ2024 HTTP, Web, API 講義資料
hatena
0
1.2k
はてなインターンシップ2024 RDBMS ブートキャンプ講義資料
hatena
0
1k
はてなインターンシップ2024 フロントエンドブートキャンプ講義資料
hatena
0
920
はてなインターンシップ2024 コンテナ講義資料
hatena
0
1.1k
はてなインターンシップ2024 コンテナオーケストレーション講義資料
hatena
0
910
はてなインターンシップ2024 インフラ講義資料
hatena
0
940
はてなインターンシップ2024 AI 講義資料
hatena
0
930
はてなインターンシップ2024 ブログライティング講義資料
hatena
6
3.4k
トップダウン・ボトムアップの両面から作るチーム内マトリクス組織
hatena
0
21
Other Decks in Technology
See All in Technology
大規模プロジェクトにおける 品質管理の要点と実践 / 20250327 Suguru Ishii
shift_evolve
0
280
頻繁リリース × 高品質 = 無理ゲー? いや、できます!/20250306 Shoki Hyo
shift_evolve
0
150
移行できそうでやりきれなかった 10年超えのシステムを葬るための戦略 / phper-kaigi-2025-ryu
carta_engineering
0
690
Redefine_Possible
upsider_tech
0
260
バックエンドエンジニアによるフロントエンドテスト拡充の具体的手法
kinosuke01
1
710
Riverpod & Riverpod Generatorを利用して状態管理部分の処理を書き換えてみる簡単な事例紹介
fumiyasac0921
0
110
サーバシステムを無理なくコンテナ移行する際に伝えたい4つのポイント/Container_Happy_Migration_Method
ozawa
1
100
OPENLOGI Company Profile
hr01
0
61k
SaaSプロダクト開発におけるバグの早期検出のためのAcceptance testの取り組み
kworkdev
PRO
0
440
LINEギフトのLINEミニアプリアクセシビリティ改善事例
lycorptech_jp
PRO
0
240
アプリケーション固有の「ロジックの脆弱性」を防ぐ開発者のためのセキュリティ観点
flatt_security
28
10k
ソフトウェア開発におけるインターフェイスという考え方 / PHPerKaigi 2025
k1low
9
3.9k
Featured
See All Featured
Navigating Team Friction
lara
184
15k
Producing Creativity
orderedlist
PRO
344
40k
The Cult of Friendly URLs
andyhume
78
6.3k
Building Flexible Design Systems
yeseniaperezcruz
328
38k
Done Done
chrislema
183
16k
How to Ace a Technical Interview
jacobian
276
23k
For a Future-Friendly Web
brad_frost
176
9.6k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
Making the Leap to Tech Lead
cromwellryan
133
9.2k
How to train your dragon (web standard)
notwaldorf
91
5.9k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
356
30k
Building Applications with DynamoDB
mza
94
6.3k
Transcript
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張 id:nanto_vi (TOYAMA Nao) 2025-02-25 Hatena Engineer Seminar
#32 はてなブログ新機能基盤の開発編 1
アジェンダ • 自己紹介 • はてなCMSで配信されるコンテンツ ◦ 従来のコンテンツの配信 ◦ CMSのコンテンツの配信 •
コンテンツのプレビュー ◦ 従来のプレビューの配信 ◦ CMSのプレビューの配信 2
自己紹介 • id:nanto_vi (TOYAMA Nao) ◦ 株式会社はてな ◦ ブログチーム Webアプリケーションエンジニア
◦ 名古屋出身 ▪ 『メダリスト』に登場するスケートリンクを懐かしみつつ観 ています。 3
はてなCMS 4
配信するコンテンツ 従来のコンテンツ • Perlアプリケー ションから出力 CMSのコンテンツ • Next.jsアプリケー ションから出力 5
従来のコンテンツの配信 6 リバースプロキシ (Nginx) Perl アプリケーション 1 2 3 4
ユーザー ※ CDN、ロードバランサー、キャッシュサーバー(Varnish)などは省略
• URLパスだけでは従来のコンテンツかCMSの コンテンツか判別不能 ◦ リバースプロキシで事前に切り分けられない • 限定公開のサイトの閲覧をどうするか ◦ 従来はPerlアプリケーションで認可 CMSのコンテンツを配信するために
7
CMSのコンテンツの配信 8 リバースプロキシ (Nginx) Perl アプリケーション 1 2 3 6
ユーザー Next.js アプリケーション 4 5
CMSのコンテンツの配信 • CMSのコンテンツ かどうかはPerl アプリケーション で判別 ◦ CMSのコンテンツなら、 Nginxの内部リダイレクト機能を使って配信 •
限定公開の認可はPerlアプリケーションで行う 9 リバースプロキシ (Nginx) Perl アプリケーション 1 2 3 6 ユーザー Next.js アプリケーション 4 5
Nginxの内部リダイレクト機能 A. ユーザーが https://cms. example.com/ foo にアクセス B. Perlアプリケーションが X-Accel-Redirect:
internal_url 応答ヘッダ付きの応答を返す C. Nginxはinternal_url (Next.jsアプリケーション) に要求 を投げ、返ってきた応答をユーザーに返す 10 リバースプロキシ (Nginx) Perl アプリケーション 1 2 3 6 ユーザー Next.js アプリケーション 4 5
CMSでのコンテンツの出力 • Next.jsのビルド済みJSファイルははてなのドメイン (cms.hatena.ne.jp) から配信 ◦ サイトのURLにはサブディレクトリが含まれることが あり、JSファイルのパスを解決できない ◦ Next.jsのassetPrefix設定
• internal_urlが外部から直接アクセスできないよう に、HTTP要求ヘッダの値によるアクセス制限 11
プレビュー機能 • 実際の表示に近づけたい ので、管理画面のドメイン (cms.hatena.ne.jp)では なく、サイトのドメイン (cms.example.com)で 表示 12
プレビュー機能の変化 従来のプレビュー • ページ内のタブ切り 替え、または新規 ウィンドウで開く • プレビューウィンド ウを再読み込みして も内容はそのまま
CMSのプレビュー • 新規タブで開く • プレビューウィンドウ (タブ)を再読み込みす ると、その時点で編集 中の内容がプレビュー される 13
従来のプレビューの配信 1. プレビュー内容を送信 2. トークンとキーを返す ◦ 限定公開のサイトを閲覧 可にする認可トークン ◦ プレビュー内容が勝手に
変更されないためのキー 3. プレビュー内容、トークン、キーを送信 14 1 ユーザー 管理画面のドメイン blog.hatena.ne.jp サイトのドメイン cms.example.com 2 3 4
CMSのプレビューの配信 2., 3. 認可トークンは従来のPerl アプリケーションから取得 4., 5. プレビュー内容そのもの ではなく、内容を指す キーをやり取り
• Nginxの内部リダイレクト およびNext.jsでPOST要求 本体を扱いづらいため 15 1 ユーザー 管理画面のドメイン cms.hatena.ne.jp サイトのドメイン cms.example.com 4 5 6 管理画面のドメイン blog.hatena.ne.jp 2 3
再読み込みへの対応 1. 編集ページからプレビューページを開く 2. プレビューページから編集ページに、 ウィンドウ間通信(postMessage)を 用いて、認可トークンとキーを 問い合わせ 3. iframe内にプレビュー内容を読み込み
◦ プレビューページを再読み込みすると、 2.の手順から再実行することになる 16
まとめ • Nginxの内部リダイレクト機能を使い、 同一ドメイン下で従来のコンテンツ配信と CMSのコンテンツ配信を共存 • 認証・認可は既存の仕組みを流用すること で、従来と同レベルの安全性を確保しつつ 開発工数を節約 17