Материал из презентации Олега Бунина, поэтому пример с https://highload.ru Внимание: такой вопрос периодически встречается на собеседованиях!

Простой вариант:

  1. Браузер запрашивает DNS и вычисляет IP для highload.ru;
  2. Браузер отправляет запрос на сервер;
  3. Сервер получает запрос;
  4. Сервер проверяет в кеше, есть ли такая страничка, если есть, то сразу к пункту 7;
  5. Сервер запрашивает данные из базы данных;
  6. Сервер строит страничку;
  7. Сервер отправляет страничку браузеру;
  8. Браузер строит страничку на экране для пользователя.

Что реально происходит:

  1. Браузер проверяет в локальном кэше, есть ли такая страничка;
  2. Если есть, то проверяет заголовки и параметры кэширования (Expires), можно ли её использовать?
  3. Браузер запрашивает DNS и вычисляет IP для highload.ru;
  4. Браузер составляет http-запрос;
  5. Браузер (прикладной уровень модели OSI) передаёт запрос ниже, транспортному уровню;
  6. Транспортный уровень сетевой подсистемы упаковывает запрос в TCP-пакеты и отправляет ещё ниже, сетевому уровню;
  7. Сетевой и нижележащие уровни отправляют запрос в сеть согласно таблицам маршрутизации;
  8. Где-то в сети потенциальные кэширующие сервера проверяют, не могут ли они выполнить этот запрос без передачи дальше по маршруту:
  9. Где-то в сети обрабатываются проверки блокировок от Роскомнадзора;
  10. TCP/IP-пакеты передаются от сервера к серверу согласно таблицам маршрутизации и, наконец, доходят до сетевого уровня целевого сервера;
  11. Сетевой и транспортный уровни сервера собирают запрос из пакетов;
  12. Проверяется, может ли порт (в данном случае 80-й) принять запрос, есть ли место в очереди, слушает ли кто-нибудь этот порт;
  13. Если порт слушается, то устанавливается сессия и запрос передаётся тому веб-серверу, который слушает порт;
  14. В нашем случае это nginx, который аллоцирует буфер для принятия запроса;
  15. Если буфера в памяти не хватает, то создаётся временный файл на диске;
  16. Дисковая подсистема операционной системы решает, где создать временный файл – в буфере или реально на диске;
  17. Nginx принимает весь запрос;
  18. Только после этого nginx проверяет, требуется ли выполнение запроса или он может обработать его без передачи бекенду (например, он в кэше или это картинка);
  19. Если запрос требует вычисления, то открывается upstream к бэкенду;
  20. Сервер, который слушает порт бэкенда открывает соединение и принимает запрос;
  21. В нашем случае это Apache, последовательно выполняются 11-ть стадий выполнения запроса: трансляция в URI, проверка заголовков, вычисление скрипта, который должен обработать запрос, запуск скрипта, передача скрипту информации запроса, ожидание выполнения скрипта, отдача результатов nginx’у, логгирование, этап очистки;
  22. Скрипт получает запрос, запускается построение страницы;
  23. Выполняется программа, данные с помощью SQL-запросов запрашиваются из базы данных;
  24. В каждом случае устанавливается соединение с базой данных (если оно не постоянное);
  25. База данных получает SQL-запрос;
  26. База данных строит план выполнения запроса, затем выполняет его, используя те или иные буферы;
  27. При каждом чтении таблицы сначала база данных проверяет, нет ли этой информации в кэше, затем дисковая подсистема делает тоже самое;
  28. Скрипт собирает данные от базы данных и вставляет их в шаблон страницы;
  29. Скрипт отдаёт собранную страницу веб-серверу Apache;
  30. Apache передаёт собранную страницу nginx;
  31. Nginx принимает страницу и только полностью записав её в локальный буфер начинает передачу пользователю. Всё это время соединение с пользователем открыто;
  32. Собранная страница в обратном порядке спускается вниз по уровням модели OSI, бьется для передачи по сети на кусочки;
  33. Сетевой и транспортный уровень машины пользователя собирают страницу и передают её выше;
  34. Браузер парсит страницу и запускает аналогичный процесс для всех её составляющих: JS-файлов, CSS-файлов, картинок. Для каждого элемента весь процесс повторяется;
  35. Только после получения всего этого начинается процесс построения странички для пользователя.
  36. PS: Браузер пытается закэшировать всё, что можно.