Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Кнышов Александр, группа 153, кэширующий веб-сервер.
- План работы.
- На данный момент реализован веб-сервер, который умеет выдавать статические страницы, использую механизм epoll/kqueue. Планирую добавить обработку ошибочных запросов и попробую научить сервер перенаправлять запрос другому серверу и передавать обратно ответ. Остальные критерии реализованы не будут.
- ###################################################################
- Отчет.
- 1) Кэширующий веб-сервер - это сервер с минимальной функциональностью, который умеет только выдавать статику, либо перенаправлять запросы другим серверам. В отличии от полноценных веб-серверов, они ориентированы на быструю работу с большим количеством подключений. Сделать веб-сервер можно по-разному: с помощью низкоуровневого API Linux, с помощью сторонних библиотек(например, libevent, boost.asio)
- Одна из технологий, которая будет использоваться, сокеты Беркли.
- Я буду использовать только низкоуровневый API Linux, а именно Epoll, который может предоставить эффективный механизм для приложений, обрабатывающих большое количество одновременно открытых соединений — со сложностью O(1) в отличие от стандартного механизма select, обладающего сложностью O(n). Собственно, выбор обосновывается скоростью его работы. Актуально использовать, при относительно небольшом количестве сокетов, при существенной чувствительности по скорости работы.
- Стоит отдельно отметить сторонние библиотеки: boost.asio и libevent. Обе библиотеки являются мета-обертками epoll и select. Обе имеют ряд преемуществ, таких как: высокая переносимость кода, оптимальная стратегия работы(epoll на Linux, kqueue на FreeBSD/MacOSX, Overlapped IO на MS Windows), высокий уровень абстракции(скрывает от разработчика много рутины). В теории, эти библиотеки должны работать медленее, так как используется высокий уровень абстракции.
- Также стоит отдельно выделить свободный веб-сервер Apache HTTP Server. На сегодняшний день мирно сосуществуют 2 ветки Apache — 1.3 и 2.0. Обе версии на сегодняшний день поддерживаются. Они широко представлены и занимают половину серверного рынка в мире. Основной причиной успеха Apache является широкий спектр его функциональных возможностей. Apache может обслуживать одновременно большое количество клиентов. Он легко настраивается с помощью текстовых конфигурационных файлов и может быть на ходу переконфигурирован. Для разработки модулей имеется хорошо документированное API. Использование скриптовых языков позволяет использовать Apache в связке с базами данных и серверами приложений. Обе версии поддерживают протокол HTTP 1.1.
- ###################################################################
- Архитектура:
- Обобщенно, сервер делает следующие вещи:
- * Создает сокет
- * Привязывает сокет к сетевому интерфейсу
- * Прослушивает сокет
- * Принимает входящие соединения
- * Реагирует на события, происходящие на сокетах
- Epoll (extended poll) — API мультиплексированного ввода-вывода, предоставляемого Linux для приложений. Основные функции, которые предоставляет Epoll:
- Linux предоставляет следующие вызовы в рамках API:
- * epoll_create() - создаёт структуру данных (epoll instance), с которой в дальнейшем идёт работа. Структура одна для всех файловых дескрипторов, за которыми идёт наблюдение. Функция возвращает файловый дескриптор, который в дальнейшем передаётся во все остальные вызовы epoll API.
- * epoll_ctl() - используется для управления epoll instance, в частности, позволяет выполнять операции EPOLL_CTL_ADD (добавление файлового дескриптора к наблюдению), EPOLL_CTL_DEL (удаление файлового дескриптора из наблюдения), EPOLL_CTL_MOD (изменение параметров наблюдения), EPOLL_CTL_DISABLE (добавлена в Linux 3.7) — для безопасного отключения наблюдения за файловым дескриптором в многопоточных приложениях.
- * epoll_wait() - возвращает количество (один или более) файловых дескрипторов из списка наблюдения, у которых поменялось состояние (которые готовы к вводу-выводу).
- Принцип работы: после того, как приложение добавляет дескрипторы к наблюдению и вызывает epoll_wait(), при готовности какого-либо дескриптора (появлению информации, опустошению буфера и т. д.) ядро возвращает приложение из epoll_wait со списком файловых дескрипторов, которые готовы к работе. Если какие-то дескрипторы становятся готовыми к работе до вызова epoll_wait, то они отмечаются соответствующим образом и при следующем вызове epoll_wait управление в приложение возвращается сразу же со списком готовых к работе файловых дескрипторов.
- События, за которыми можно наблюдать с помощью epoll:
- * EPOLLIN - новые данные (для чтения) в файловом дескрипторе
- * EPOLLOUT - файловый дескриптор готов продолжить принимать данные (для записи)
- * EPOLLERR - в файловом дескрипторе произошла ошибка
- * EPOLLHUP - закрытие файлового дескриптора
- ###################################################################
- Инструкция по применению.
- * Скачать файлы main.cpp, CMakeLists.txt
- * Загрузить cmake выполнив в терминале команды: sudo add-apt-repository ppa:george-edison55/cmake-3.x; sudo apt-get update; sudo apt-get install cmake
- * Перейти в папку с main.cpp и выполнить команды: cmake CMakeLists.txt; make; ./main
- * Теперь, когда сервер запущен, в адресной строке браузера написать localhost:3000
- * Увидеть статическую страницу с надписью "Hey, it works!"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement