Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張
Search
Hatena
February 25, 2025
Technology
760
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
【詳説】コンテンツ配信 システムの複数機能 基盤への拡張
Hatena Engineer Seminar #32 はてなブログ新機能基盤の開発編 の発表資料です
https://hatena.connpass.com/event/344958/
Hatena
February 25, 2025
More Decks by Hatena
See All by Hatena
Androiderを育成する「高速道路」と 実戦を経て辿り着いた現在地 / DroidKaigi 2026
hatena
0
200
60分で学ぶクラウドとSRE・サービス運用 / GeekCAMPAcademia 2026-05
hatena
1
140
エンジニアリング マネージャーの育成と評価軸の考え方
hatena
0
730
Perlブートキャンプ
hatena
0
5.7k
はてなサマーインターンシップ2025 Web API 講義資料
hatena
0
1.8k
はてなサマーインターンシップ2025 フロントエンド 講義資料
hatena
21
11k
はてなサマーインターンシップ2025 コンテナ + Kubernetesハンズオン 講義資料
hatena
0
850
はてなサマーインターンシップ2025 クラウドと運用 講義資料
hatena
0
890
はてなサマーインターンシップ2025 RDBMSの基礎 講義資料
hatena
0
1k
Other Decks in Technology
See All in Technology
二歩目のフロントエンド・ウェブアクセシビリティ
camiha
2
330
Jetson Orin Nanoとk3sとローカルLLMで音声文字起こしシステム作ってみた
y_sera15
0
120
Kiro Crewをはじめよう
kizawa2020
1
130
go-sqletch
moznion
0
130
[AWS 秋のクラウドオペレーション祭り 2026]AWS DevOps Agentで変わるリリースと運用対応 ~リリース管理機能と Directed actions のご紹介~
furuton
4
1.2k
「事実」を「計測」して、「解釈」する 〜AWS Lambdaのメモリ最適解の見つけ方〜
maimyyym
0
130
自作バイナリを動かす「入口」8選
puhitaku
2
1.3k
freeeらしさをAIとともに作る / Creating the freee Experience with AI
ymrl
0
220
オブザーバビリティを高める AI エージェント体験を考える / Designing AI Agent Experiences That Enhance Observability
aoto
PRO
2
330
ビジネスを止めない技術的負債の返済のための戦略とその手法 - 技術的負債と向き合う / Complexity and Simplicity
soudai
PRO
3
680
More Freedom on the Same Shared GPU Cluster: A Small Team’s Experience with vCluster
nttcom
0
150
Deep Data Security 機能解説
oracle4engineer
PRO
2
760
Featured
See All Featured
世界の人気アプリ100個を分析して見えたペイウォール設計の心得
akihiro_kokubo
PRO
74
42k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
930
Designing for humans not robots
tammielis
254
26k
Test your architecture with Archunit
thirion
2
2.4k
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
590
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
18k
How to Think Like a Performance Engineer
csswizardry
28
2.9k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
520
Optimising Largest Contentful Paint
csswizardry
37
4k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
Ten Tips & Tricks for a 🌱 transition
stuffmc
1
260
Max Prin - Stacking Signals: How International SEO Comes Together (And Falls Apart)
techseoconnect
PRO
0
480
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