Браузер устанавливает TCP-соединение с сервером на порту 80 (для HTTP) или 443 (для HTTPS).
Браузер отправляет HTTP-запрос, содержащий метод (GET, POST и т.д.), путь к запрашиваемому ресурсу, версию протокола, заголовки (User-Agent, Accept, Cookie и др.) и, возможно, тело запроса (для POST).
Сервер получает запрос.
Веб-сервер (например, Nginx, Apache) принимает запрос и, если настроено, передает его приложению Ruby (например, через Rack, Passenger, Unicorn).
Приложение Ruby обрабатывает запрос. Это включает:
Маршрутизация запроса к соответствующему контроллеру и экшену на основе пути и метода.
Извлечение параметров из URL, заголовков и тела запроса.
Выполнение логики приложения (например, взаимодействие с базой данных, вычисления).
Подготовка ответа.
Приложение Ruby формирует HTTP-ответ. Он включает:
Статус-код (например, 200 OK, 404 Not Found, 500 Internal Server Error).
Заголовки ответа (Content-Type, Content-Length, Set-Cookie и др.).
Тело ответа (HTML, JSON, XML и т.д.).
Приложение Ruby отправляет ответ обратно веб-серверу.
Веб-сервер отправляет ответ клиенту (браузеру).
Браузер получает ответ, анализирует его, рендерит полученные данные (если это HTML) и обрабатывает дополнительные запросы (например, для CSS, JS, изображений).
TCP-соединение может быть закрыто или поддерживаться для последующих запросов (Keep-Alive).