drupalとweb高速化 cdnについて

30
DrupalとWEB高速化内部キャッシュと外部キャッシュ

Upload: katsuhisa-ogawa

Post on 23-Jan-2018

226 views

Category:

Engineering


5 download

TRANSCRIPT

Page 1: DrupalとWEB高速化 CDNについて

Drupalと“WEB高速化“

内部キャッシュと外部キャッシュ

Page 2: DrupalとWEB高速化 CDNについて

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

Page 3: DrupalとWEB高速化 CDNについて

3

WEB表示スピードが世界を変える

レスポンスタイムがWEBサイトにあたえる影響

というお話をご存じでしょうか?

Page 4: DrupalとWEB高速化 CDNについて

4

WEB表示スピードが世界を変える

Amazonのような巨大なサイトの場合、1秒遅いことが年間約16億ドルの機会損失になる。

つまり、たった1秒の差で16億ドル以上の利益を生み出すということにもなります。

1秒 16億ドル=

読み込み速度が1秒遅くなる↓

ページビューは11%減少

顧客満足度は16%下がる↓

コンバージョン率は7%減少する=

Page 5: DrupalとWEB高速化 CDNについて

5

WEB表示スピードが世界を変える

伝説のプログラマーが素晴らしいコードで作成したシステム

カリスマデザイナーが神秘的で斬新に描いたイラスト

表示速度が遅ければ価値が低下する。

Page 6: DrupalとWEB高速化 CDNについて

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が組み込まれている。

Page 7: DrupalとWEB高速化 CDNについて

7

キャッシュが世界をかえるかもしれない

キャッシュ技術をつかってWEBを高速化するお話。

Page 8: DrupalとWEB高速化 CDNについて

8

Drupal×WEB高速化

キャッシュの種類は主に3つ

内部キャッシュ(インサイド)

Drupalがホストされているサーバー内でキャッシュ

外部キャッシュ(アウトサイド)

Drupalがホストされているサーバー以外でキャッシュする

外部キャッシュ(ユーザーサイド)

ユーザーのブラウザキャッシュなど

{ }

{ }

Page 9: DrupalとWEB高速化 CDNについて

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

Page 10: DrupalとWEB高速化 CDNについて

10

Drupal×WEB高速化

その他のキャッシュ

OPcache

Coreの内部キャッシュを利用できないコンテンツを高速化する場合はOPcacheが有効

これだけでも、まあまあ早くなります。

ブラウザキャッシュ

適切なCacheContolヘッダを付与しユーザーサイドのブラウザキャッシュをきかせる。

Page 11: DrupalとWEB高速化 CDNについて

11

Drupal×WEB高速化

ある一定のアクセスがあるサイトの場合内部キャッシュだけでは限界がくる。

DBやサーバー・回線の負荷がどんどん上昇していきます!

だいたい、5000req /sec ~ 10000req /sec ぐらい

Page 12: DrupalとWEB高速化 CDNについて

12

そこで外部キャッシュの出番

外部キャッシュサービス = CDN(Content Delivery Network)

Page 13: DrupalとWEB高速化 CDNについて

CDNサービスの概要

13

最適な経路選定

初回コンテンツ取得

2回目リクエスト

オリジンへアクセスしない

最適な経路選定

キャッシュ削除

キャッシュ前 キャッシュ後

CDN(エッジサーバー)にコンテンツをコピーし次回以降エンドユーザーに高速に配信。

初回リクエスト

Page 14: DrupalとWEB高速化 CDNについて

14

外部キャッシュ(CDN)のメリット

外部キャッシュはメリットがいっぱい!

ファイル別にキャッシュ時間を指定

キャッシュさせる・させないコンテンツの指定

個別にキャッシュ削除が可能

トラフィック負荷軽減

サーバー自体の負荷軽減

機能の分離化が可能

Page 15: DrupalとWEB高速化 CDNについて

15

外部キャッシュ(CDN)のデメリット

登録や設定が一手間かかる

パージする仕組みを考える必要がある

キャッシュルールを明確にする

外部キャッシュの場合、CDNベンダが提供しているAPIとの連携が必須。※内部キャッシュの場合、モジュールなどで連携がしやすい。

外部CDNベンダーとの契約、登録、設定などある程度自分で頑張らないといけない。

外部CDNサービスはDrupalの何をキャッシュすべきで、逆に何をキャッシュしてはいけないのかわからない。そのため、ルールを明確に決めないといけない。

Page 16: DrupalとWEB高速化 CDNについて

16

外部キャッシュ(CDN)の注意点

以前: 静的コンテンツを配信 = CDN

現在: 動的コンテンツも配信 = CDN

CDNが情報漏洩につながる危険

Page 17: DrupalとWEB高速化 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以外のメソッド

Page 18: DrupalとWEB高速化 CDNについて

18

外部キャッシュ(CDN)DRUPALの場合

Drupalでキャッシュさせないパス一覧

^/status\.php$^/update\.php^/install\.php^/apc\.php$^/admin^/admin/.*$^/system/files/.*$

^/user^/user/.*$^/users/.*$^/info/.*$^/flag/.*$^.*/ajax/.*$^.*/ahah/.*$

サンプル(正規表現)

課金関係のモジュールが利用しているパスカート関連のモジュールのパスソーシャルログイン関連のパス

その他キャッシュさせない項目

Page 19: DrupalとWEB高速化 CDNについて

19

次は、がっつりキャッシュさせる

Page 20: DrupalとWEB高速化 CDNについて

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が適用

Page 21: DrupalとWEB高速化 CDNについて

21

最大限キャッシュさせる・キャッシュグループ化

キャッシュグループ化

ユーザーエージェントのパターンは数百種類以上ある。

一般的なCDNは、Vary User-Agentヘッダをみてキャッシュしてしまい

ヒット率が低下する原因の一つ。

そこで、ユーザーエージェント毎にキャッシュをグループ化する。

Future

Phone

Smart

Phone

Other

キャッシュグループユーザーエージェント

AUSoftbankDoCoMo

iphoneandroid

その他(PCブラウザなど)

Page 22: DrupalとWEB高速化 CDNについて

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

キャッシュ

Page 23: DrupalとWEB高速化 CDNについて

最大限キャッシュさせる・クエリーチューニング

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>

Page 24: DrupalとWEB高速化 CDNについて

24

最大限キャッシュさせる・Cookieチューニング

動的コンテンツ対応(Cookie)

特定の文字列を取り除いたり、認証情報のみ保持することによってHIT率を高める事が出来る。

UID=user1CID=tempcounter=0010

Cookieカスタマイズの例

結果、異なるCookieの値が付与されていても、効率よくキャッシュすることができ、オリジンサーバーの負荷が軽減されます。

除外処理

UID=user1CID=tempcounter=0010>

Page 25: DrupalとWEB高速化 CDNについて

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)

Page 26: DrupalとWEB高速化 CDNについて

26

正直、CDNの設定は大変です。

なので、面倒な設定を詰め込んだCDNサービスを作ってみた。

Page 27: DrupalとWEB高速化 CDNについて

Rapid START CDNサービス

27

無料で開始 プリセットを用意 マルチプラットフォーム

https://cdn.tokyo※Drupalとエッジサーバーを連携させて開発

「CDN 無料」で検索

Page 28: DrupalとWEB高速化 CDNについて

Rapid START CDNサービス

28

Rapid STARTの特徴

無料でSTART

DNSを変更するだけでOK

1秒以下の高速キャッシュ削除

DrupalをCDN化するプリセット(7月)

SSL(HTTP/2)配信も可能(7月初旬)

タグベースのパージAPIも提供(する予定)

オリジンサーバーへHOSTヘッダを透過

アクティブドメイン = 113個

Page 29: DrupalとWEB高速化 CDNについて

まとめ

29

Drupalは他のCMSと比べキャッシュフレンドリーである。

キャッシュの仕組みを十分把握しインシデント防止。

WEBサイトのキャッシュ化は規模に依存しない。

フロントはがっつり、バックエンドは普通がトレンド。

CDNを利用することで、シンプルな構造化が可能。

CDNをもっと身近に

Page 30: DrupalとWEB高速化 CDNについて

THANK YOU!