drupalとweb高速化 cdnについて
TRANSCRIPT
Drupalと“WEB高速化“
内部キャッシュと外部キャッシュ
2
ABO
UT M
E
Job : 小さな “CDN会社” レッドボックス※取り扱いトラフィックは約50Gbps前後(2017年時点)
Name: 小川 かつひさ (KATSUHISA OGAWA)
Like : キャッシュ・負荷分散・WEB高速化
https://www.facebook.com/ogawaka
WEB高速化ブログ
Past : いんふら屋さんサーバーやスイッチを設定したり色々やってるアレ
http://blog.redbox.ne.jp
3
WEB表示スピードが世界を変える
レスポンスタイムがWEBサイトにあたえる影響
というお話をご存じでしょうか?
4
WEB表示スピードが世界を変える
Amazonのような巨大なサイトの場合、1秒遅いことが年間約16億ドルの機会損失になる。
つまり、たった1秒の差で16億ドル以上の利益を生み出すということにもなります。
1秒 16億ドル=
読み込み速度が1秒遅くなる↓
ページビューは11%減少
顧客満足度は16%下がる↓
コンバージョン率は7%減少する=
5
WEB表示スピードが世界を変える
伝説のプログラマーが素晴らしいコードで作成したシステム
カリスマデザイナーが神秘的で斬新に描いたイラスト
表示速度が遅ければ価値が低下する。
6
Drupal×WEB高速化
DrupalはWEB高速化フレンドリー
ホスト名に依存しない
マルチドメインで運用する場合、Root/Sites/以下にドメイン名と同一フォルダを作成し、THEME等を配置するだけ。※所謂DBにドメイン名が書き込まれない。 (D7/8共通)
キャッシュしやすいヘッダが出力される
Drupal標準のキャッシュ機能をONにするだけで、Cache-Control Max-age xxヘッダが出力される。D8はPurge・Generic HTTP Purgerを導入するとキャッシュTAGを出力してくれる。
Coreにキャッシュ機能が付属
Drupal Coreにキャッシュする仕組みが実装されている。D8はOPCACHEが組み込まれている。
7
キャッシュが世界をかえるかもしれない
キャッシュ技術をつかってWEBを高速化するお話。
8
Drupal×WEB高速化
キャッシュの種類は主に3つ
内部キャッシュ(インサイド)
Drupalがホストされているサーバー内でキャッシュ
外部キャッシュ(アウトサイド)
Drupalがホストされているサーバー以外でキャッシュする
外部キャッシュ(ユーザーサイド)
ユーザーのブラウザキャッシュなど
{
{ }
}
{ }
9
Drupal×WEB高速化
Drupalの内部キャッシュ
D7 Coreの内部キャッシュ
Drupal7 認証ユーザーのキャッシュ制御がNG。※別途Authcacheモジュールを入れることによって補填可能。
D8 Coreの内部キャッシュ
Dynamic Page CacheモジュールをONにするだけでOK!ユーザー識別はCache contextsというもので識別している。
https://www.drupal.org/docs/8/api/cache-api/cache-contexts
判定順位cookiesheadersiplanguagesrequest_formatsessionthemetimezoneurluser
10
Drupal×WEB高速化
その他のキャッシュ
OPcache
Coreの内部キャッシュを利用できないコンテンツを高速化する場合はOPcacheが有効
これだけでも、まあまあ早くなります。
ブラウザキャッシュ
適切なCacheContolヘッダを付与しユーザーサイドのブラウザキャッシュをきかせる。
11
Drupal×WEB高速化
ある一定のアクセスがあるサイトの場合内部キャッシュだけでは限界がくる。
DBやサーバー・回線の負荷がどんどん上昇していきます!
だいたい、5000req /sec ~ 10000req /sec ぐらい
12
そこで外部キャッシュの出番
外部キャッシュサービス = CDN(Content Delivery Network)
CDNサービスの概要
13
最適な経路選定
初回コンテンツ取得
2回目リクエスト
オリジンへアクセスしない
最適な経路選定
キャッシュ削除
キャッシュ前 キャッシュ後
CDN(エッジサーバー)にコンテンツをコピーし次回以降エンドユーザーに高速に配信。
初回リクエスト
14
外部キャッシュ(CDN)のメリット
外部キャッシュはメリットがいっぱい!
ファイル別にキャッシュ時間を指定
キャッシュさせる・させないコンテンツの指定
個別にキャッシュ削除が可能
トラフィック負荷軽減
サーバー自体の負荷軽減
機能の分離化が可能
15
外部キャッシュ(CDN)のデメリット
登録や設定が一手間かかる
パージする仕組みを考える必要がある
キャッシュルールを明確にする
外部キャッシュの場合、CDNベンダが提供しているAPIとの連携が必須。※内部キャッシュの場合、モジュールなどで連携がしやすい。
外部CDNベンダーとの契約、登録、設定などある程度自分で頑張らないといけない。
外部CDNサービスはDrupalの何をキャッシュすべきで、逆に何をキャッシュしてはいけないのかわからない。そのため、ルールを明確に決めないといけない。
16
外部キャッシュ(CDN)の注意点
以前: 静的コンテンツを配信 = CDN
現在: 動的コンテンツも配信 = CDN
CDNが情報漏洩につながる危険
17
外部キャッシュ(CDN)の注意点
外部CDNベンダの仕様を把握しておく
• CDNベンダの仕様は様々(最低限RFCには準拠はしている)
• キャッシュキーとなる内容(URL、Cookie、クエリ、メソッド等)
• キャッシュしない命令ヘッダや設定の確認(一番重要かも?)
以下のレスポンスヘッダいずれかが付与されている場合
キャッシュしないパターン(弊社の場合)
Cache-Control: max-age=0Cache-Control: no-storeCache-Control: no-cacheCache-Control: privatePragma: no-cache
その他:基本認証が設定されたコンテンツダイジェスト認証が設定されたコンテンツGET/HEAD以外のメソッド
18
外部キャッシュ(CDN)DRUPALの場合
Drupalでキャッシュさせないパス一覧
^/status\.php$^/update\.php^/install\.php^/apc\.php$^/admin^/admin/.*$^/system/files/.*$
^/user^/user/.*$^/users/.*$^/info/.*$^/flag/.*$^.*/ajax/.*$^.*/ahah/.*$
サンプル(正規表現)
課金関係のモジュールが利用しているパスカート関連のモジュールのパスソーシャルログイン関連のパス
その他キャッシュさせない項目
19
次は、がっつりキャッシュさせる
20
最大限キャッシュさせる・キャッシュ順序
キャッシュ時間の優先順位を確認
キャッシュ時間の順序(弊社の場合)
Cache-Control max-ageがある場合 max-ageの期間
Cache-Controlヘッダがない場合 デフォルトTTL(24H)
Cache-Controlmax-age
Cache-Controls-maxageの両方がある場合
s-maxageの期間(ブラウザキャッシュとしてはmax-ageの期間)
Expiresを付与している場合Expiresが未来の場合、その期日まで
Expiresが過去の場合デフォルトTTLが適用
21
最大限キャッシュさせる・キャッシュグループ化
キャッシュグループ化
ユーザーエージェントのパターンは数百種類以上ある。
一般的なCDNは、Vary User-Agentヘッダをみてキャッシュしてしまい
ヒット率が低下する原因の一つ。
そこで、ユーザーエージェント毎にキャッシュをグループ化する。
Future
Phone
Smart
Phone
Other
キャッシュグループユーザーエージェント
AUSoftbankDoCoMo
iphoneandroid
その他(PCブラウザなど)
>
22
最大限キャッシュさせる・正規化チューニング
クエリストリングのソート
リクエストにクエリストリングが付与されている場合、動的ソートしキャッシュヒット率を大幅に向上させる。
http://domainname.com/?cid=123&uid=123&user=000http://domainname.com/?user=000&uid=123&cid=123http://domainname.com/?uid=123&cid=123&user=000
異なる3つのURL
同一
キャッシュ
順番が入れ替わるようなクエリが付与される場合、参照プログラムもそれを考慮しているため問題とならない。
不要なCookieの削除
リクエストに不要なCookieが付与されている場合、CDN側で自動的に削除する。(GAなど削除OKなものに限る)
UID=user1CID=tempcounter=0010
UID=user1CID=tempcounter=0010
Non Cookie
キャッシュ
最大限キャッシュさせる・クエリーチューニング
23
動的コンテンツ対応(Query String)
特定の区切り文字から開始されるパラメーターを除外してキャッシュする。動的にURLが変更となるようなコンテンツであっても、可能な限りキャッシュすることが可能。
http://www.domainname.com/?cid=200&user=1&count=11
クエリカスタマイズの例
cid及びcountから始まる連番は動的に変化するため、これらの値は取り除いてキャッシュする。
http://www.domainname.com/?cid=200&user=1&count=11
http://www.domainname.com/?cid=300&user=1&count=22
結果、異なるURLであっても同じコンテンツとして扱われ、オリジンサーバーの負荷が軽減されます。
異なる2つのURL>
24
最大限キャッシュさせる・Cookieチューニング
動的コンテンツ対応(Cookie)
特定の文字列を取り除いたり、認証情報のみ保持することによってHIT率を高める事が出来る。
UID=user1CID=tempcounter=0010
Cookieカスタマイズの例
結果、異なるCookieの値が付与されていても、効率よくキャッシュすることができ、オリジンサーバーの負荷が軽減されます。
除外処理
UID=user1CID=tempcounter=0010>
25
最大限キャッシュさせる・認証情報のグループ化
Drupalの認証ユーザー向けキャッシュ
Cookieに付与されるセッション情報を取り出す
(S{1,2}ESS[a-z0-9]+|NO_CACHE)=", "; \1=")
CDN側でセッション情報入りのCookieをキャッシュキーにすることにより、
認証ユーザー毎にキャッシュ可能
BigPipe対策( Drupal8 )
(S{1,2}ESS[a-z0-9]+|NO_CACHE|big_pipe_nojs)
26
正直、CDNの設定は大変です。
なので、面倒な設定を詰め込んだCDNサービスを作ってみた。
Rapid START CDNサービス
27
無料で開始 プリセットを用意 マルチプラットフォーム
https://cdn.tokyo※Drupalとエッジサーバーを連携させて開発
「CDN 無料」で検索
Rapid START CDNサービス
28
Rapid STARTの特徴
無料でSTART
DNSを変更するだけでOK
1秒以下の高速キャッシュ削除
DrupalをCDN化するプリセット(7月)
SSL(HTTP/2)配信も可能(7月初旬)
タグベースのパージAPIも提供(する予定)
オリジンサーバーへHOSTヘッダを透過
アクティブドメイン = 113個
まとめ
29
Drupalは他のCMSと比べキャッシュフレンドリーである。
キャッシュの仕組みを十分把握しインシデント防止。
WEBサイトのキャッシュ化は規模に依存しない。
フロントはがっつり、バックエンドは普通がトレンド。
CDNを利用することで、シンプルな構造化が可能。
CDNをもっと身近に
THANK YOU!