Почему большие сайты размещают свои изображения / CSS на внешних доменах?

43

Почему сайты, такие как Facebook, Twitter и Google, размещают свои изображения и CSS на внешних доменах, таких как:

  • facebook: static.ak.fbcdn.net
  • Twitter: a0.twimg.com
  • Google: ssl.gstatic.com

Вопросов):

  • Является ли производительность? или безопасность?
Рик Роудс
источник

Ответы:

53

@toomanyairmiles частично верен - цель этого метода - позволить параллельные соединения от веб-браузера к серверу. Веб-браузеры должны позволять минимум два одновременных подключения к одному хосту, но многие новые браузеры могут управлять до 60. Независимо, одновременные одновременные соединения между браузером и веб-сервером (ами) являются основным узким местом в скорости.

С ресурса Google :

Спецификация HTTP 1.1 (раздел 8.1.4) гласит, что браузеры должны разрешать не более двух одновременных подключений на одно имя хоста (хотя более новые браузеры допускают нечто большее: см. Список Browserscope). Если HTML-документ содержит ссылки на больше ресурсов (например, CSS, JavaScript, изображения и т. Д.), Чем максимально допустимое на одном хосте, браузер выдает запросы на такое количество ресурсов и ставит в очередь остальные. Как только некоторые запросы завершаются, браузер выдает запросы на следующее количество ресурсов в очереди. Он повторяет процесс до тех пор, пока не загрузит все ресурсы. Другими словами, если страница ссылается на более чем X внешних ресурсов с одного хоста, где X - максимально допустимое количество подключений к хосту, браузер должен загружать их последовательно, по X за раз, получая 1 RTT для каждого X ресурсов. Общее время приема-передачи равно N / X, где N - количество ресурсов, которое нужно извлечь с хоста. Например, если браузер разрешает 4 одновременных подключения на одно имя хоста, а страница ссылается на 100 ресурсов в одном домене, для каждого из 4 ресурсов будет использоваться 1 RTT, а общее время загрузки - 25 RTT.

Таким образом, способ обойти это состоит в том, чтобы «разделить» запросы на разные домены или хосты:

Опять же с того же ресурса Google:

Баланс распараллеливаемых ресурсов по именам хостов. Запросы для большинства статических ресурсов, включая изображения, CSS и другие двоичные объекты, могут быть распараллелены. Балансируйте запросы ко всем этим объектам как можно больше между именами хостов. Если это невозможно, как правило, убедитесь, что ни один хост не обслуживает более чем на 50% больше среднего по всем хостам. Так, например, если у вас 40 ресурсов и 4 хоста, каждый хост должен обслуживать в идеале 10 ресурсов; в худшем случае ни один хост не должен обслуживать более 15. Если у вас есть 100 ресурсов и 4 хоста, каждый хост должен обслуживать 25 ресурсов; ни один хост не должен обслуживать более 38.

Но есть еще одна часть головоломки. Каждый запрос обычно идет со своими издержками, обычно в форме файлов cookie. Статические элементы, такие как изображения, CSS и JavaScript, не должны передавать данные cookie, поэтому обслуживание их из (суб) доменов без cookie может привести к более быстрым круговым поездкам:

Статическое содержимое, например изображения, файлы JS и CSS, не обязательно должно сопровождаться файлами cookie, поскольку пользователь не взаимодействует с этими ресурсами. Вы можете уменьшить задержку запроса, обслуживая статические ресурсы из домена, который не обслуживает файлы cookie. Этот метод особенно полезен для страниц, ссылающихся на большие объемы редко кэшируемого статического содержимого, такого как часто меняющиеся миниатюры изображений или редко используемые архивы изображений. Мы рекомендуем этот метод для любой страницы, которая обслуживает более 5 статических ресурсов. (Для страниц, которые обслуживают меньше ресурсов, чем это, это не стоит затрат на настройку дополнительного домена.)

Чтобы зарезервировать домен без файлов cookie для обслуживания статического содержимого, зарегистрируйте новое доменное имя и настройте базу данных DNS с записью CNAME, которая указывает новый домен на существующую запись домена A. Настройте веб-сервер для обслуживания статических ресурсов из нового домена и не разрешайте установку файлов cookie в этом домене. На своих веб-страницах укажите имя домена в URL-адресах для статических ресурсов.

Майк Хадсон
источник
13

Раньше веб-браузеры могли загружать только два элемента одновременно (теперь 6 или более), поэтому загрузка ресурсов из разных доменов происходит быстрее, чем из одного домена. Это относится ко всему от изображений до javascripts.

Многие компании также используют CDN , инструмент, который гарантирует, что конечный пользователь получает свои данные с географически близкого к ним сервера, что также повышает производительность сайта за счет сокращения времени возврата для запросов ресурсов.

toomanyairmiles
источник
7

Крупные сайты перемещают свой статический контент (изображения, файлы JS и CSS) в сеть доставки контента или CDN, поскольку размещение контента на нескольких географически разнесенных серверах ускорит загрузку ваших страниц с точки зрения пользователя.

Поскольку CDN имеет другое доменное имя, он также обеспечивает преимущества разделения домена .

mvark
источник
3

Ограничение на 2 пункта больше не является проблемой. Хотя это рекомендация спецификации HTTP, все современные браузеры допускают как минимум 6 одновременных подключений .

seanhussey
источник
-1

Это все еще необходимо для нежелательных файлов cookie, отправляемых в заголовок, в то время как при использовании внешнего доменного имени файлы cookie не установлены, поэтому загрузка контента происходит намного быстрее.

Так что да, это все еще необходимо для цели скорости.

Тонио
источник
В принятом ответе уже сказано, что куки не отправляются на внешний домен. Этот ответ не говорит ничего такого, что другие ответы уже не охватывают.
Стивен Остермиллер