Почему CDN не работает так, как должно быть?
Меня всегда смущают CDN и то, делают ли они свою работу эффективно.
Я знаю, что теоретически их цель - сократить время ожидания между сервером и пользователем.
Тем не менее, я обычно люблю проверять вещи, прежде чем пытаться. Поэтому я загрузил изображение на imgur.com, а затем проверил скорость файла изображения на 2 сайтах:
Первый тест: https://tools.keycdn.com/performance
Второй тест: https://tools.pingdom.com/
Я выбрал Нью-Йорк в качестве места тестирования на втором веб-сайте. Итак, я попал на первый тест - он дал мне задержку в 200-300 мс в Нью-Йорке. Затем я проверил тест на втором сайте, и он также дал мне довольно большую задержку, например, 300 мс или около того.
Когда я нажимаю на тест во второй раз, он, конечно, снижается до 15-30 мс, потому что это то, что должен делать CDN.
Вопрос в том, что эти 2 сервера были в одном месте, но похоже, что изображение вообще не кэшировалось. Почему это происходит или чего мне здесь не хватает? Я подумал, что если он кешируется, то это должно уже уменьшить задержку ЛЮБОГО другого запрашивающего сервера / пользователя в этой области. Я ошибся?
1 ответ
CDN помимо попыток быстрой доставки вашего контента (сокращения задержки) может помочь вам также защитить / обезопасить свое происхождение, не раскрывая его напрямую, ознакомьтесь с этой статьей о других преимуществах: что такое CDN?
Что касается вашего теста, есть много факторов, например, все новое содержание (MISS
) всегда будет занимать больше времени, так как он не был кэширован, то есть контент, который уже был предварительно извлечен и кэширован (HIT
).
Вы можете начать с проверки заголовков, например, в терминале запустить это:
$ curl -I https://immortal.run/img/immortal.png
Вы можете увидеть вывод как это:
HTTP/2 200
date: Fri, 17 Aug 2018 07:51:20 GMT
content-type: image/png
content-length: 6757
set-cookie: __cfduid=d0be8792ec1e81d223eaa9e05b780a8fa1534492280; expires=Sat, 17-Aug-19 07:51:20 GMT; path=/; domain=.immortal.run; HttpOnly
last-modified: Thu, 07 Jun 2018 20:20:47 GMT
access-control-allow-origin: *
expires: Fri, 17 Aug 2018 11:51:20 GMT
cache-control: public, max-age=14400
x-github-request-id: 47B0:1A82:37CB24D:4D9A0A9:5B752825
cf-cache-status: HIT
accept-ranges: bytes
strict-transport-security: max-age=15552000; includeSubDomains; preload
x-content-type-options: nosniff
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 44ba8e10cb6597aa-FRA
Обратите внимание на заголовок:
cf-cache-status: HIT
Когда ресурс будет кэширован и обслужен из CDN, он будет HIT
если нет, то это может быть MISS
здесь вы можете увидеть список возможных ответов, относящихся к Cloudflare: https://support.cloudflare.com/hc/en-us/articles/200168266-What-do-the-various-Cloudflare-cache-responses-HIT-Expired-etc-mean- и т.д. среднеквадратичной
Теперь, чтобы проверить, насколько быстро загружается ресурс, вы можете использовать curl
В зависимости от вашей оболочки вы можете добавить следующую функцию curl_time()
в ~/.profile
, ~/.zshrc
или же ~/.bashrc
curl_time() {
curl -o /dev/null -Ls -w " \
time_namelookup: %{time_namelookup}\n \
time_connect: %{time_connect}\n \
time_appconnect: %{time_appconnect}\n \
time_pretransfer: %{time_pretransfer}\n \
time_redirect: %{time_redirect}\n \
time_starttransfer: %{time_starttransfer}\n \
----------\n \
time_total: %{time_total}\n" "$1"
}
Затем попробуйте что-то вроде этого:
$ curl_time https://immortal.run/img/immortal.png
time_namelookup: 0.133057
time_connect: 0.144885
time_appconnect: 0.200092
time_pretransfer: 0.200299
time_redirect: 0.000000
time_starttransfer: 0.416685
----------
time_total: 0.418580
В моих последующих запросах я получал его быстрее time_total: 0.093495
:
$ curl_time https://immortal.run/img/immortal.png
time_namelookup: 0.004583
time_connect: 0.019833
time_appconnect: 0.067715
time_pretransfer: 0.067839
time_redirect: 0.000000
time_starttransfer: 0.091393
----------
time_total: 0.093495
Если вы просто хотите получить итоговое время, вы можете попробовать это:
$ for i in {1..3}; \
curl -sL -w "%{time_total}\n" -o /dev/null https://immortal.run/img/immortal.png
Анализ заголовков и времени отклика является хорошей отправной точкой для проверки поведения CDN.