为什么 CDN 不能正常工作?
Why isn't a CDN working as it's supposed to be?
我总是对 CDN 以及它们是否有效地完成工作感到困惑。
我知道理论上他们的目的是为了缩短服务器和用户之间的延迟。
但是,我通常喜欢在尝试之前先测试一下。所以我上传了一张图片到 imgur.com,然后在 2 个网站上测试了图片文件的速度:
第一次测试:https://tools.keycdn.com/performance
第二次测试:https://tools.pingdom.com
我在第二个网站上选择了纽约作为测试地点。所以我在第一个上进行了测试——它在纽约给了我大约 200-300 毫秒的延迟。然后我在第二个网站上进行了测试,它也给了我一个相当高的延迟,比如 300 毫秒左右。
当我第二次点击测试时,它当然降低到 15-30 毫秒,因为这是 CDN 应该做的。
问题是虽然那两台服务器位于同一位置,但看起来图像根本没有被缓存。为什么会这样,或者我在这里缺少什么?我认为如果它被缓存,那么它应该已经减少了该区域中任何其他请求 server/user 的延迟。我错了吗?
CDN 除了尝试快速传送您的内容(缩短延迟)之外,还可以帮助您 protect/secure 通过不直接公开您的来源,查看此 post 了解其他好处的介绍: what is a CDN?
关于您的测试,涉及很多因素,例如,所有新内容 (MISS
) 总是需要更多的时间来提供,因为它还没有被缓存,那些已经被缓存的内容pre-fetched 和缓存 (HIT
).
您可以从检查 header 开始,例如在终端 运行 中:
$ 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
注意 header:
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
,根据您的 shell,您可能需要将下一个函数 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" ""
}
然后试试这样的东西:
$ 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
如果只是想重复获得 total_time 你可以试试这个:
$ for i in {1..3}; \
curl -sL -w "%{time_total}\n" -o /dev/null https://immortal.run/img/immortal.png
分析 headers 和响应时间是检查 CDN 行为的良好起点。
我总是对 CDN 以及它们是否有效地完成工作感到困惑。
我知道理论上他们的目的是为了缩短服务器和用户之间的延迟。
但是,我通常喜欢在尝试之前先测试一下。所以我上传了一张图片到 imgur.com,然后在 2 个网站上测试了图片文件的速度:
第一次测试:https://tools.keycdn.com/performance
第二次测试:https://tools.pingdom.com
我在第二个网站上选择了纽约作为测试地点。所以我在第一个上进行了测试——它在纽约给了我大约 200-300 毫秒的延迟。然后我在第二个网站上进行了测试,它也给了我一个相当高的延迟,比如 300 毫秒左右。
当我第二次点击测试时,它当然降低到 15-30 毫秒,因为这是 CDN 应该做的。
问题是虽然那两台服务器位于同一位置,但看起来图像根本没有被缓存。为什么会这样,或者我在这里缺少什么?我认为如果它被缓存,那么它应该已经减少了该区域中任何其他请求 server/user 的延迟。我错了吗?
CDN 除了尝试快速传送您的内容(缩短延迟)之外,还可以帮助您 protect/secure 通过不直接公开您的来源,查看此 post 了解其他好处的介绍: what is a CDN?
关于您的测试,涉及很多因素,例如,所有新内容 (MISS
) 总是需要更多的时间来提供,因为它还没有被缓存,那些已经被缓存的内容pre-fetched 和缓存 (HIT
).
您可以从检查 header 开始,例如在终端 运行 中:
$ 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
注意 header:
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
,根据您的 shell,您可能需要将下一个函数 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" ""
}
然后试试这样的东西:
$ 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
如果只是想重复获得 total_time 你可以试试这个:
$ for i in {1..3}; \
curl -sL -w "%{time_total}\n" -o /dev/null https://immortal.run/img/immortal.png
分析 headers 和响应时间是检查 CDN 行为的良好起点。