Rangkaian Penghantaran Kandungan (CDN) digunakan dalam laman web dan aplikasi terutamanya untuk mempercepatkan pemuatan elemen statik. Ini berlaku disebabkan caching fail pada pelayan CDN yang terletak di kawasan geografi yang berbeza. Dengan meminta data melalui CDN, pengguna menerimanya daripada pelayan terdekat.
Prinsip operasi dan kefungsian semua rangkaian penghantaran kandungan adalah lebih kurang sama. Setelah menerima permintaan untuk memuat turun fail, pelayan CDN mengambilnya sekali daripada pelayan asal dan memberikannya kepada pengguna, pada masa yang sama menyimpannya dalam cache untuk tempoh masa tertentu. Semua permintaan seterusnya dijawab daripada cache. Semua CDN mempunyai pilihan untuk pramuat fail, mengosongkan cache, menetapkan tarikh tamat tempoh dan banyak lagi.
Ia berlaku bahawa, untuk satu sebab atau yang lain, anda perlu mengatur rangkaian penghantaran kandungan anda sendiri, dan kemudian - biarkan arahan untuk memasang basikal seterusnya membantu kami.
Pertimbangkan kes di mana menjalankan CDN anda sendiri masuk akal:
apabila ada keinginan untuk menjimatkan wang, dan menjalankan kos walaupun menggunakan CDN yang murah seperti BunnyCDN berjumlah beberapa ratus ringgit sebulan
jika kita ingin mendapatkan cache kekal atau cache tanpa pelayan dan saluran jiran
Perkhidmatan CDN tidak mempunyai tempat kehadiran di rantau yang anda perlukan
sebarang tetapan penghantaran kandungan khas diperlukan
kami ingin mempercepatkan penyampaian kandungan dinamik dengan meletakkan pelayan pengeluaran lebih dekat dengan pengguna
terdapat kebimbangan bahawa perkhidmatan CDN pihak ketiga mungkin mengumpul atau menggunakan maklumat secara haram tentang tingkah laku pengguna (hello perkhidmatan yang tidak mematuhi GDPR) atau terlibat dalam aktiviti haram yang lain
Dalam kebanyakan kes lain, adalah lebih sesuai untuk menggunakan penyelesaian sedia ada.
Apa yang anda perlukan untuk mulakan
Sangat bagus jika anda mempunyai Sistem Autonomi (AS) anda sendiri. Dengan itu, anda boleh menetapkan IP yang sama kepada beberapa pelayan dan mengikut arahan ini di peringkat rangkaian, arahkan pengguna ke yang terdekat. Perlu dikatakan bahawa walaupun dengan blok alamat /24, adalah mungkin untuk membina rangkaian penghantaran kandungan. Sesetengah pembekal pelayan membenarkan anda membuat pengumuman untuk digunakan di semua wilayah yang tersedia untuk mereka.
Jika anda bukan pemilik senang blok alamat IP, maka untuk menjalankan CDN mudah anda perlukan:
nama domain atau subdomain
sekurang-kurangnya dua pelayan di kawasan yang berbeza. Pelayan boleh sama ada berdedikasi atau maya
alat geoDNS. Dengan itu, pengguna, setelah menangani domain, akan diarahkan ke pelayan terdekat
Daftar domain dan pesan pelayan
Dengan pendaftaran domain, semuanya mudah - kami mendaftar di mana-mana zon dengan mana-mana pendaftar. Anda juga boleh menggunakan subdomain untuk CDN, contohnya seperti cdn.domainname.com. Sebenarnya, dalam contoh kami, kami akan melakukan perkara itu.
Bagi memesan pelayan, ia harus disewa di wilayah dan negara tempat khalayak pengguna anda berada. Jika projek itu adalah antara benua, maka adalah mudah untuk memilih penyedia pengehosan yang menawarkan pelayan di seluruh dunia sekaligus. Contoh: OVH, web pajakan ΠΈ 100TB - untuk pelayan khusus, Vultr ΠΈ DigitalOcean β untuk awan maya*.
Untuk CDN peribadi kami, kami akan memesan 3 pelayan maya di benua yang berbeza. Pada Vultr pada pelayan untuk $5/bln kita akan dapat 25GB SSD tempat dan 1TB trafik. Semasa memasang, pilih Debian terkini. Pelayan kami:
Frankfurt, ip: 199.247.18.199
Chicago, ip: 149.28.121.123
Singapura, ip: 157.230.240.216
* Vultr dan DigitalOcean menjanjikan kredit $100 kepada pengguna yang mendaftar melalui pautan dalam artikel serta-merta selepas menambah kaedah pembayaran. Penulis juga menerima sedikit pujian daripada ini, yang sangat bermakna baginya sekarang. Harap faham.
Menyediakan geoDNS
Untuk membolehkan pengguna diarahkan ke pelayan yang dikehendaki (paling dekat) apabila mengakses domain atau subdomain CDN, kami memerlukan pelayan DNS dengan fungsi geoDNS.
Prinsip dan operasi geoDNS adalah seperti berikut:
Menentukan IP klien yang menghantar permintaan DNS, atau IP pelayan DNS rekursif yang digunakan semasa memproses permintaan klien. Pelayan rekursif seperti itu biasanya DNS-s pembekal.
IP pelanggan mengiktiraf negara atau wilayahnya. Untuk ini, pangkalan data GeoIP digunakan, yang mana terdapat banyak sekali hari ini. Ada yang bagus pilihan percuma.
Bergantung pada lokasi pelanggan, berikan dia alamat IP pelayan CDN terdekat.
Pelayan DNS dengan fungsi geoDNS boleh berhimpun sendiri, tetapi lebih baik menggunakan penyelesaian siap pakai dengan rangkaian pelayan DNS di seluruh dunia dan Anycast Dari kotak itu:
CloudDNS daripada $9.95/bln, Tarif GeoDNS, secara lalai terdapat satu DNS Failover
CloudFlare, ciri "Geo Steering" tersedia dalam rancangan Perusahaan
Apabila memesan geoDNS, anda harus memberi perhatian kepada bilangan permintaan yang disertakan dalam tarif dan perlu diingat bahawa bilangan sebenar permintaan ke domain boleh melebihi jangkaan beberapa kali. Berjuta-juta labah-labah, pengimbas, spammer dan roh jahat lain bekerja tanpa jemu.
Hampir semua perkhidmatan DNS termasuk perkhidmatan yang sangat diperlukan untuk membina CDN - DNS Failover. Dengan bantuannya, anda boleh menyediakan pemantauan operasi pelayan anda dan, jika tiada tanda-tanda kehidupan, secara automatik menggantikan alamat pelayan yang tidak berfungsi dengan satu sandaran dalam respons DNS.
Untuk membina CDN kami, kami akan menggunakan CloudDNS, tarif GeoDNS.
Mari tambah zon DNS baharu dalam akaun peribadi anda, dengan menyatakan domain anda. Jika kita sedang membina CDN pada subdomain, dan domain utama sudah digunakan, maka sejurus selepas menambah zon, jangan lupa untuk menambah rekod DNS yang berfungsi sedia ada. Langkah seterusnya ialah mencipta beberapa rekod A untuk domain / subdomain CDN, setiap satunya akan digunakan pada wilayah yang kami tentukan. Anda boleh menentukan benua atau negara sebagai wilayah, sub-rantau tersedia untuk AS dan Kanada.
Dalam kes kami, CDN akan dinaikkan pada subdomain cdn.sayt.in. Dengan menambah zon sayt.in, buat rekod A pertama untuk subdomain dan halakan semua Amerika Utara ke pelayan di Chicago:
Mari ulangi tindakan untuk wilayah lain, mengingati untuk membuat satu entri untuk wilayah lalai. Inilah yang berlaku pada akhirnya:
Entri lalai terakhir dalam tangkapan skrin bermakna semua wilayah yang tidak ditentukan (dan ini adalah Eropah, Afrika, pengguna Internet satelit, dll.) akan dihantar ke pelayan di Frankfurt.
Ini melengkapkan persediaan DNS asas. Ia kekal untuk pergi ke tapak web pendaftar domain dan menggantikan NS domain semasa dengan yang dikeluarkan oleh ClouDNS. Dan sementara NS akan dikemas kini, kami akan menyediakan pelayan.
Pemasangan sijil SSL
CDN kami akan berfungsi melalui HTTPS, jadi jika anda sudah mempunyai sijil SSL untuk domain atau subdomain, muat naiknya ke semua pelayan, contohnya, ke direktori /etc/ssl/yourdomain/
Jika tiada sijil, anda boleh mendapatkan sijil percuma daripada Let's Encrypt. Sempurna untuk ini ACME Shellscript. Pelanggan adalah mudah dan mudah untuk disediakan, dan yang paling penting, ia membolehkan anda mengesahkan domain/subdomain oleh DNS melalui API CloudDNS.
Kami akan memasang acme.sh pada hanya satu pelayan - Eropah 199.247.18.199, dari mana sijil akan disalin kepada semua yang lain. Untuk memasang, jalankan:
Semasa pemasangan skrip, kerja CRON akan dibuat untuk memperbaharui sijil selanjutnya tanpa penyertaan kami.
Apabila mengeluarkan sijil, domain akan disemak menggunakan DNS menggunakan API, jadi dalam akaun peribadi ClouDNS dalam menu API Penjual Semula, anda perlu membuat API pengguna baharu dan menetapkan kata laluan untuknya. Pengesahan yang terhasil dengan kata laluan akan ditulis dalam fail ~/.acme.sh/dnsapi/dns_cloudns.sh (jangan dikelirukan dengan fail dns_clouddns.sh). Berikut ialah baris yang perlu dinyahkomen dan diedit:
Dalam pilihan, untuk masa hadapan, kami telah menetapkan arahan untuk memuat semula konfigurasi pelayan web secara automatik selepas setiap pembaharuan tempoh sah sijil pada masa hadapan.
Keseluruhan proses mendapatkan sijil boleh mengambil masa sehingga 2 minit, jangan ganggunya. Jika ralat pengesahan domain berlaku, cuba jalankan arahan itu sekali lagi. Pada akhirnya kita akan melihat di mana sijil telah dimuat naik:
Ingat laluan ini, ia perlu ditentukan apabila menyalin sijil ke pelayan lain, serta dalam tetapan pelayan web. Kami tidak memberi perhatian kepada ralat memuat semula konfigurasi Nginx - ia tidak akan berada pada pelayan yang dikonfigurasikan sepenuhnya semasa mengemas kini sijil.
Apa yang kami tinggalkan untuk SSL ialah menyalin sijil yang diterima ke dua pelayan lain sambil mengekalkan laluan ke fail. Mari buat direktori yang sama pada setiap satu daripadanya dan buat salinan:
Untuk mengemas kini sijil dengan kerap, buat kerja CRON harian pada kedua-dua pelayan dengan arahan:
scp -r [email protected]:/root/.acme.sh/cdn.sayt.in/* /root/.acme.sh/cdn.sayt.in/ && service nginx reload
Dalam kes ini, akses kepada pelayan sumber jauh mesti dikonfigurasikan dengan kunci, iaitu tanpa memasukkan kata laluan. Jangan lupa buat.
Memasang dan mengkonfigurasi Nginx
Untuk menyampaikan kandungan statik, kami akan menggunakan Nginx yang dikonfigurasikan sebagai pelayan proksi caching. Kemas kini senarai pakej dan pasangkannya pada ketiga-tiga pelayan:
max_size β saiz cache, tidak melebihi ruang cakera yang tersedia
aktif - masa penyimpanan data cache yang tidak diakses oleh sesiapa
ssl_sijil ΠΈ ssl_certificate_key β laluan ke sijil SSL dan fail utama
proxy_cache_valid - masa penyimpanan data cache
laluan proksi β alamat pelayan asal dari mana CDN akan meminta fail untuk caching. Dalam contoh kami, ini sayt.in
Seperti yang anda lihat, semuanya mudah. Kesukaran hanya boleh timbul dalam menetapkan masa caching kerana persamaan arahan aktif ΠΈ proxy_cache_valid. Mari analisa mereka dengan contoh kami. Inilah yang berlaku apabila tidak aktif=7d ΠΈ proxy_cache_valid 90h:
jika permintaan tidak diulang dalam masa 7 hari, maka data akan dipadamkan daripada cache selepas tempoh ini
jika permintaan diulang sekurang-kurangnya sekali setiap 7 hari, maka data dalam cache akan dianggap usang selepas 90 hari dan Nginx akan mengemas kininya dengan permintaan seterusnya, mengambilnya dari pelayan asal
Selesai mengedit nginx.conf, muat semula konfigurasi:
root@cdn:~# service nginx reload
CDN kami sudah sedia. Untuk $15/bln. kami menerima titik kehadiran di tiga benua dan 3 TB trafik: 1 TB di setiap lokasi.
Menyemak kerja CDN
Mari lihat ping ke CDN kami dari lokasi geografi yang berbeza. Sebarang perkhidmatan ping akan berfungsi untuk ini.
United Kingdom, London
cdn.sayt.in
199.247.18.199
14.9
Kanada, Toronto
cdn.sayt.in
149.28.121.123
16.2
Amerika Syarikat, San Francisco
cdn.sayt.in
149.28.121.123
52.7
Amerika Syarikat, Dallas
cdn.sayt.in
149.28.121.123
23.1
Amerika Syarikat, Chicago
cdn.sayt.in
149.28.121.123
2.6
Amerika Syarikat, New York
cdn.sayt.in
149.28.121.123
19.8
Singapura
cdn.sayt.in
157.230.240.216
1.7
Jepun Tokyo
cdn.sayt.in
157.230.240.216
74.8
Australia, Sydney
cdn.sayt.in
157.230.240.216
95.9
Hasilnya bagus. Sekarang kami akan meletakkan imej ujian di akar tapak utama test.jpg dan semak kelajuan muat turunnya melalui CDN. Dikatakan - dibuat. Kandungan dihantar dengan cepat.
Mari kita tulis skrip kecil sekiranya kita ingin mengosongkan cache pada titik CDN. purge.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
Untuk memadam keseluruhan cache, jalankan sahaja, fail berasingan boleh dibersihkan seperti ini:
root@cdn:~# ./purge.sh /test.jpg
Daripada kesimpulan
Akhir sekali, saya ingin memberikan beberapa petua berguna untuk segera melangkah ke atas garu yang membuat kepala saya sakit pada masa itu:
Untuk meningkatkan toleransi kesalahan CDN, disyorkan untuk mengkonfigurasi DNS Failover, yang membantu menukar rekod A dengan cepat sekiranya berlaku kerosakan pelayan. Ini dilakukan dalam rekod DNS panel kawalan domain.
Tapak dengan liputan geografi yang luas sudah pasti memerlukan sejumlah besar CDN, tetapi jangan fanatik. Kemungkinan besar pengguna tidak akan melihat perbezaan yang ketara berbanding CDN berbayar jika anda meletakkan pelayan di 6-7 lokasi: Eropah, Amerika Utara (timur), Amerika Utara (barat), Singapura, Australia, Hong Kong atau Jepun
Kadangkala hoster tidak membenarkan penggunaan pelayan yang disewa untuk tujuan CDN. Oleh itu, jika anda tiba-tiba memutuskan untuk menggunakan rangkaian penghantaran kandungan sebagai perkhidmatan, jangan lupa untuk membaca peraturan penyedia pengehosan tertentu terlebih dahulu
Meneroka peta komunikasi bawah airuntuk mewakili cara benua disambungkan dan mengambil kira perkara ini apabila membina rangkaian penghantaran kandungan
Cuba semak ping dari tempat yang berbeza kepada pelayan anda. Dengan cara ini anda boleh melihat kawasan yang paling hampir dengan titik CDN dan mengkonfigurasi GeoDNS dengan lebih betul
Bergantung pada tugasan, adalah berguna untuk memperhalusi Nginx untuk keperluan caching tertentu dan mengambil kira beban pada pelayan. Artikel tentang cache Nginx banyak membantu saya dalam hal ini - di sini dan pecutan kerja di bawah beban berat: di sini ΠΈ di sini