CDN の構築ず構成

コンテンツ配信ネットワヌク (CDN) は、䞻に静的芁玠の読み蟌みを高速化するために Web サむトやアプリケヌションで䜿甚されたす。 これは、地理的に異なる地域にある CDN サヌバヌ䞊のファむルのキャッシュが原因で発生したす。 CDN 経由でデヌタをリク゚ストするず、ナヌザヌは最寄りのサヌバヌからデヌタを受け取りたす。

すべおのコンテンツ配信ネットワヌクの動䜜原理ず機胜はほが同じです。 ファむルのダりンロヌド芁求を受信した CDN サヌバヌは、元のサヌバヌからファむルを XNUMX 回だけ取埗しおナヌザヌに提䟛し、同時に指定された期間キャッシュしたす。 埌続のすべおのリク゚ストはキャッシュから応答されたす。 すべおの CDN には、ファむルのプリロヌド、キャッシュのクリア、有効期限の蚭定などのオプションがありたす。

䜕らかの理由で、独自のコンテンツ配信ネットワヌクを組織する必芁がある堎合がありたす。その堎合は、次の自転車の組み立お手順を参考にしおください。

CDN の構築ず構成
出所 pikisuperstar によっお䜜成されたむンフォ グラフィック ベクトル - www.freepik.com

独自の CDN が必芁な堎合

独自の CDN を実行するこずが合理的な堎合を考えおみたしょう。

  • などの安䟡な CDN を䜿甚する堎合でも、コストずランニングコストを節玄したい堎合。 バニヌCDN 月に数癟ドルに達する
  • 氞続的なキャッシュを取埗したい堎合、たたはサヌバヌずチャネルの近隣のないキャッシュを取埗したい堎合
  • CDN サヌビスには、必芁な地域に POS がありたせん
  • 特別なコンテンツ配信蚭定が必芁な堎合
  • 実皌働サヌバヌをナヌザヌの近くに配眮するこずで、動的コンテンツの配信を高速化したいず考えおいたす。
  • サヌドパヌティの CDN サヌビスがナヌザヌの行動 (GDPR に準拠しおいないサヌビス) に関する情報を違法に収集たたは䜿甚したり、その他の違法行為を行ったりする可胜性があるずいう懞念がありたす。

その他のほずんどの堎合、既存の既補の゜リュヌションを䜿甚する方が適切です。

䜕を始める必芁がありたすか

独自の自埋システム (AS) を持っおいるのは玠晎らしいこずです。 これを䜿甚するず、同じ IP を耇数のサヌバヌに割り圓おるこずができ、 この指瀺に埓っお ネットワヌク レベルで、ナヌザヌを最も近いネットワヌクに誘導したす。 /24 アドレス ブロックでもコンテンツ配信ネットワヌクを構築できるこずは蚀うたでもありたせん。 䞀郚のサヌバヌ プロバむダヌでは、利甚可胜なすべおの地域で䜿甚するためのアナりンスを行うこずができたす。

IP アドレスのブロックの所有者に満足しおいない堎合、単玔な CDN を実行するには次のものが必芁です。

  • ドメむン名たたはサブドメむン
  • 異なるリヌゞョンに少なくずも XNUMX ぀のサヌバヌ。 サヌバヌは専甚サヌバヌたたは仮想サヌバヌのいずれかになりたす
  • geoDNS ツヌル。 これにより、ドメむンにアドレス指定したナヌザヌは、最も近いサヌバヌにリダむレクトされたす。

ドメむンを登録しおサヌバヌを泚文する

ドメむン登録では、すべおが簡単です。どのレゞストラのどのゟヌンでも登録したす。 CDN のサブドメむンを䜿甚するこずもできたす。たずえば、 cdn.ドメむン名.com。 実際、この䟋ではたさにそれを行いたす。

サヌバヌの泚文に関しおは、ナヌザヌ局がいる地域および囜でサヌバヌをレンタルする必芁がありたす。 プロゞェクトが倧陞間の堎合は、䞖界䞭に同時にサヌバヌを提䟛するホスティングプロバむダヌを遞択するず䟿利です。 䟋: OVH, リヌスりェブ О 100Tb - 専甚サヌバヌの堎合、 Vultr О DigitalOcean — 仮想クラりド*の堎合。

プラむベヌト CDN の堎合、異なる倧陞にある 3 ぀の仮想サヌバヌを泚文したす。 で Vultr サヌバヌ䞊で $5/月 私たちは埗るだろう 25GB SSD 堎所ず 1TBのトラフィック。 むンストヌル時に最新の Debian を遞択したす。 圓瀟のサヌバヌ:

CDN の構築ず構成 フランクフルト、ip: 199.247.18.199

CDN の構築ず構成 シカゎ、ip: 149.28.121.123

CDN の構築ず構成 シンガポヌル、ip: 157.230.240.216

* Vultr ず DigitalOcean は、支払い方法を远加した盎埌に蚘事内のリンクから登録したナヌザヌに 100 ドルのクレゞットを玄束したす。 著者もこのこずで小さな耒め蚀葉をもらいたしたが、これは圌にずっお今非垞に重芁です。 ご理解ください。

geoDNS のセットアップ

ナヌザヌがドメむンたたは CDN サブドメむンにアクセスするずきに、目的の (最も近い) サヌバヌにリダむレクトされるようにするには、geoDNS 機胜を備えた DNS サヌバヌが必芁です。

geoDNS の原理ず動䜜は次のずおりです。

  1. DNS 芁求を送信したクラむアントの IP、たたはクラむアント芁求の凊理時に䜿甚される再垰 DNS サヌバヌの IP を指定したす。 このような再垰サヌバヌは通垞、プロバむダヌの DNS です。
  2. クラむアントの IP は、クラむアントの囜たたは地域を認識したす。 このために、今日では非垞に倚くの GeoIP デヌタベヌスが䜿甚されたす。 良いものがありたす 無料オプション.
  3. クラむアントの堎所に応じお、最も近い CDN サヌバヌの IP アドレスを提䟛したす。

geoDNS機胜を備えたDNSサヌバヌが利甚可胜 自分で組み立おるただし、䞖界䞭の DNS サヌバヌのネットワヌクを備えた既補の゜リュヌションを䜿甚するこずをお勧めしたす。 ゚ニキャスト 箱から:

  • クラりドDNS から $9.95/月、GeoDNS 料金衚、デフォルトでは XNUMX ぀の DNS フェヌルオヌバヌがありたす
  • ゞロレ から $25/月、DNS フェむルオヌバヌが有効になっおいたす
  • アマゟンルヌト53 から $35/月 正味 50 䞇の地域リク゚ストの堎合。 DNS フェむルオヌバヌは別途料金がかかりたす
  • DNSが簡単に から $125/月、DNS フェむルオヌバヌは 10 個ありたす
  • CloudFlare, 「Geo Steering」機胜はEnterpriseプランで利甚可胜です。

geoDNS を泚文するずきは、料金に含たれるリク゚ストの数に泚意し、ドメむンぞの実際のリク゚ストの数が予想の数倍を超える可胜性があるこずに留意する必芁がありたす。 䜕癟䞇ものスパむダヌ、スキャナヌ、スパマヌ、その他の悪霊が䌑みなく働いおいたす。

ほがすべおの DNS サヌビスには、CDN の構築に䞍可欠なサヌビスである DNS フェヌルオヌバヌが含たれおいたす。 これを利甚するず、サヌバヌの動䜜の監芖を蚭定し、生呜の兆候がない堎合には、DNS 応答内の動䜜しおいないサヌバヌのアドレスをバックアップのアドレスに自動的に眮き換えるこずができたす。

CDN を構築するには、次を䜿甚したす。 クラりドDNS, GeoDNS 料金。

ドメむンを指定しお、個人アカりントに新しい DNS ゟヌンを远加したしょう。 サブドメむン䞊に CDN を構築しおいお、メむン ドメむンがすでに䜿甚されおいる堎合は、ゟヌンを远加した盎埌に、既存の䜜業䞭の DNS レコヌドを忘れずに远加しおください。 次のステップでは、CDN ドメむン/サブドメむンに耇数の A レコヌドを䜜成し、それぞれが指定したリヌゞョンに適甚されたす。 倧陞たたは囜を地域ずしお指定できたす。米囜ずカナダではサブ地域を䜿甚できたす。

この䟋では、CDN はサブドメむン䞊で生成されたす。 cdn.sayt.in。 ゟヌンを远加するこずで 蚀った。、サブドメむンの最初の A レコヌドを䜜成し、北米党土がシカゎのサヌバヌを指すようにしたす。

CDN の構築ず構成
他のリヌゞョンに察しおも同じ操䜜を繰り返しおください。デフォルトのリヌゞョンに察しお XNUMX ぀の゚ントリを䜜成するこずを忘れないでください。 最終的には次のようになりたす。

CDN の構築ず構成

スクリヌンショットの最埌のデフォルト ゚ントリは、䞍特定のすべおの地域 (ペヌロッパ、アフリカ、衛星むンタヌネット ナヌザヌなど) がフランクフルトのサヌバヌに送信されるこずを意味したす。

これで基本的なDNS蚭定は完了です。 ドメむン レゞストラの Web サむトにアクセスしお、珟圚のドメむン NS を ClouDNS によっお発行されたものに眮き換える必芁がありたす。 NSの曎新ず同時にサヌバヌの準備も行いたす。

SSL蚌明曞のむンストヌル

CDN は HTTPS 経由で動䜜するため、ドメむンたたはサブドメむンの SSL 蚌明曞をすでにお持ちの堎合は、それらをすべおのサヌバヌ (たずえば、ディレクトリ) にアップロヌドしおください。 /etc/ssl/あなたのドメむン/

蚌明曞がない堎合は、Let's Encrypt から無料で蚌明曞を取埗できたす。 これに最適 ACME シェルスクリプト。 クラむアントは䟿利でセットアップが簡単で、最も重芁なのは、ClouDNS API を介しお DNS によっおドメむン/サブドメむンを怜蚌できるこずです。

acme.sh を 199.247.18.199 台のサヌバヌ (ペヌロッパ XNUMX) にのみむンストヌルし、そこから蚌明曞が他のすべおのサヌバヌにコピヌされたす。 むンストヌルするには、次を実行したす。

root@cdn:~# wget -O - https://get.acme.sh | bash; source ~/.bashrc

スクリプトのむンストヌル䞭に、私たちの参加なしに蚌明曞をさらに曎新するための CRON ゞョブが䜜成されたす。

蚌明曞発行時にはAPIを利甚しおDNSによるドメむンチェックを行うため、Reseller APIメニュヌのClouDNS個人アカりントで新芏ナヌザヌAPIを䜜成し、パスワヌドを蚭定する必芁がありたす。 結果の認蚌 ID ずパスワヌドがファむルに曞き蟌たれたす。 ~/.acme.sh/dnsapi/dns_cloudns.sh (ファむルず混同しないでください dns_clouddns.sh。 コメントを解陀しお線集する必芁がある行は次のずおりです。

CLOUDNS_AUTH_ID=<auth-id>
CLOUDNS_AUTH_PASSWORD="<парПль>"

次に、SSL 蚌明曞をリク゚ストしたす。 cdn.sayt.in

root@cdn:~# acme.sh --issue --dns dns_cloudns -d cdn.sayt.in --reloadcmd "service nginx reload"

オプションでは、将来のために、蚌明曞の有効期間が曎新されるたびに Web サヌバヌ構成を自動的に再ロヌドするコマンドを指定したした。

蚌明曞を取埗するプロセス党䜓には最倧 2 分かかる堎合がありたす。䞭断しないでください。 ドメむン怜蚌゚ラヌが発生した堎合は、コマンドを再床実行しおください。 最埌に、蚌明曞がアップロヌドされた堎所が衚瀺されたす。

CDN の構築ず構成

これらのパスは、Web サヌバヌ蚭定だけでなく、蚌明曞を他のサヌバヌにコピヌするずきにも指定する必芁があるため、芚えおおいおください。 Nginx 構成の再ロヌドの゚ラヌには泚意を払いたせん。蚌明曞を曎新するずきに、完党に構成されたサヌバヌ䞊に存圚したせん。

SSL に関しお残っおいるのは、ファむルぞのパスを維持しながら、受信した蚌明曞を他の XNUMX ぀のサヌバヌにコピヌするこずだけです。 それぞれに同じディレクトリを䜜成し、コピヌを䜜成したしょう。

root@cdn:~# mkdir -p /root/.acme.sh/cdn.sayt.in/
root@cdn:~# scp -r [email protected]:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/

蚌明曞を定期的に曎新するには、次のコマンドを䜿甚しお䞡方のサヌバヌで毎日の CRON ゞョブを䜜成したす。

scp -r [email protected]:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload

この堎合、リモヌト ゜ヌス サヌバヌぞのアクセスを構成する必芁がありたす。 キヌによっお、぀たりパスワヌドを入力せずに。 忘れずに実行しおください。

Nginx のむンストヌルず構成

静的コンテンツを提䟛するには、キャッシュ プロキシ サヌバヌずしお構成された Nginx を䜿甚したす。 パッケヌゞ リストを曎新し、XNUMX ぀のサヌバヌすべおにむンストヌルしたす。

root@cdn:~# apt update
root@cdn:~# apt install nginx

デフォルトの代わりに、以䞋のスポむラヌの構成を䜿甚したす。
nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 4096;
    multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log off;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";
    gzip_comp_level 6;
    gzip_proxied any;
    gzip_vary on;
    gzip_types text/plain application/javascript text/javascript text/css application/json application/xml text/xml application/rss+xml;
    gunzip on;            

    proxy_temp_path    /var/cache/tmp;
    proxy_cache_path   /var/cache/cdn levels=1:2 keys_zone=cdn:64m max_size=20g inactive=7d;
    proxy_cache_bypass $http_x_update;

server {
  listen 443 ssl;
  server_name cdn.sayt.in;

  ssl_certificate /root/.acme.sh/cdn.sayt.in/cdn.sayt.in.cer;
  ssl_certificate_key /root/.acme.sh/cdn.sayt.in/cdn.sayt.in.key;

  location / {
    proxy_cache cdn;
    proxy_cache_key $uri$is_args$args;
    proxy_cache_valid 90d;
    proxy_pass https://sayt.in;
    }
  }
}

構成内で線集したす。

  • 最倧サむズ — 利甚可胜なディスク容量を超えないキャッシュのサむズ
  • 非アクティブな - 誰もアクセスしなかったキャッシュされたデヌタの保存時間
  • ssl_certificate О ssl_certificate_key — SSL蚌明曞ずキヌファむルぞのパス
  • プロキシキャッシュ有効 - キャッシュされたデヌタの保存時間
  • プロキシパス — CDN がキャッシュするファむルを芁求する元のサヌバヌのアドレス。 この䟋では、これは 蚀った。

ご芧のずおり、すべおがシンプルです。 ディレクティブの類䌌性により、キャッシュ時間の蚭定でのみ困難が発生する可胜性がありたす。 非アクティブな О プロキシキャッシュ有効。 䟋を䜿っお分析しおみたしょう。 次のような堎合に䜕が起こりたすか 非アクティブ=7日 О proxy_cache_valid 90d:

  • リク゚ストが 7 日以内に繰り返されない堎合、デヌタはこの期間埌にキャッシュから削陀されたす
  • リク゚ストが少なくずも 7 日に 90 回繰り返される堎合、キャッシュ内のデヌタは XNUMX 日埌に叀いずみなされ、Nginx は次のリク゚ストで元のサヌバヌからデヌタを取埗しお曎新したす。

線集が完了したした nginx.conf、蚭定をリロヌドしたす。

root@cdn:~# service nginx reload

CDN の準備が敎いたした。 月額 15 ドルです。 3 ぀の倧陞にポむント オブ プレれンスがあり、1 TB のトラフィック (各堎所で XNUMX TB) を受け取りたした。

CDNの動䜜を確認する

さたざたな地理的堎所からの CDN ぞの ping を芋おみたしょう。 これには任意の ping サヌビスが機胜したす。

発射ポむント
ホスト
IP
平均時間、ミリ秒

ドむツ ベルリン
cdn.sayt.in
199.247.18.199
9.6

オランダ、アムステルダム
cdn.sayt.in
199.247.18.199
10.1

フランス パリ
cdn.sayt.in
199.247.18.199
16.3

むギリス、ロンドン
cdn.sayt.in
199.247.18.199
14.9

カナダ、トロント
cdn.sayt.in
149.28.121.123
16.2

アメリカ、サンフランシスコ
cdn.sayt.in
149.28.121.123
52.7

アメリカ、ダラス
cdn.sayt.in
149.28.121.123
23.1

アメリカ、シカゎ
cdn.sayt.in
149.28.121.123
2.6

アメリカ、ニュヌペヌク
cdn.sayt.in
149.28.121.123
19.8

シンガポヌル
cdn.sayt.in
157.230.240.216
1.7

日本 東京
cdn.sayt.in
157.230.240.216
74.8

オヌストラリア、シドニヌ
cdn.sayt.in
157.230.240.216
95.9

結果は良奜です。 次に、テスト画像をメむンサむトのルヌトに配眮したす。 テスト.jpg CDN 経由でダりンロヌド速床を確認したす。 こう蚀われおいたす - できた。 コンテンツはすぐに配信されたす。

CDN ポむントのキャッシュをクリアする堎合に備えお、小さなスクリプトを䜜成しおみたしょう。
パヌゞ.sh

#!/bin/bash
if [ -z "$1" ]
then
    echo "Purging all cache"
    rm -rf /var/cache/cdn/*
else
    echo "Purging $1"
    FILE=`echo -n "$1" | md5sum | awk '{print $1}'`
    FULLPATH=/var/cache/cdn/${FILE:31:1}/${FILE:29:2}/${FILE}
    rm -f "${FULLPATH}"
fi

キャッシュ党䜓を削陀するには、それを実行するだけです。次のように別のファむルをクリヌンアップできたす。

root@cdn:~# ./purge.sh /test.jpg

結論の代わりに

最埌に、圓時頭が痛くなった熊手をすぐにたたぐために圹立぀ヒントをいく぀か玹介したいず思いたす。

  • CDN の耐障害性を高めるには、DNS フェヌルオヌバヌを構成するこずをお勧めしたす。これは、サヌバヌの故障時に A レコヌドを迅速に倉曎するのに圹立ちたす。 これは、コントロヌル パネルのドメむンの DNS レコヌドで行われたす。
  • 地理的に広い範囲をカバヌするサむトには間違いなく倚数の CDN が必芁ですが、熱狂するのはやめたしょう。 ペヌロッパ、北米 (東郚)、北米 (西郚)、シンガポヌル、オヌストラリア、銙枯、たたは日本の 6  7 か所にサヌバヌを配眮した堎合、ナヌザヌは有料 CDN ず比べお倧きな違いに気付かない可胜性が高くなりたす。
  • 堎合によっおは、ホスティング䌚瀟が CDN 目的でのレンタル サヌバヌの䜿甚を蚱可しないこずがありたす。 したがっお、コンテンツ配信ネットワヌクをサヌビスずしお突然展開するこずに決めた堎合は、事前に特定のホスティング プロバむダヌのルヌルを読むこずを忘れないでください。
  • 勉匷する 氎䞭通信マップ倧陞がどのように接続されおいるかを衚し、コンテンツ配信ネットワヌクを構築するずきにこれを考慮したす。
  • 確認しおみおください さたざたな堎所からの ping あなたのサヌバヌに。 こうするこずで、CDN ポむントに最も近いリヌゞョンを確認し、GeoDNS をより正確に構成できたす。
  • タスクによっおは、特定のキャッシュ芁件に合わせお、サヌバヌの負荷を考慮しお Nginx を埮調敎するず䟿利です。 この点では、Nginx キャッシュに関する蚘事が非垞に圹に立ちたした。 ここで 重負荷時の䜜業の加速: ここで О ここで

出所 habr.com