Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2017
62
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.74 KB | None | 0 0
  1. Кнышов Александр, группа 153, кэширующий веб-сервер.
  2.  
  3. План работы.
  4.  
  5. На данный момент реализован веб-сервер, который умеет выдавать статические страницы, использую механизм epoll/kqueue. Планирую добавить обработку ошибочных запросов и попробую научить сервер перенаправлять запрос другому серверу и передавать обратно ответ. Остальные критерии реализованы не будут.
  6.  
  7. ###################################################################
  8.  
  9.  
  10. Отчет.
  11.  
  12. 1) Кэширующий веб-сервер - это сервер с минимальной функциональностью, который умеет только выдавать статику, либо перенаправлять запросы другим серверам. В отличии от полноценных веб-серверов, они ориентированы на быструю работу с большим количеством подключений. Сделать веб-сервер можно по-разному: с помощью низкоуровневого API Linux, с помощью сторонних библиотек(например, libevent, boost.asio)
  13. Одна из технологий, которая будет использоваться, сокеты Беркли.
  14.  
  15. Я буду использовать только низкоуровневый API Linux, а именно Epoll, который может предоставить эффективный механизм для приложений, обрабатывающих большое количество одновременно открытых соединений — со сложностью O(1) в отличие от стандартного механизма select, обладающего сложностью O(n). Собственно, выбор обосновывается скоростью его работы. Актуально использовать, при относительно небольшом количестве сокетов, при существенной чувствительности по скорости работы.
  16. Стоит отдельно отметить сторонние библиотеки: boost.asio и libevent. Обе библиотеки являются мета-обертками epoll и select. Обе имеют ряд преемуществ, таких как: высокая переносимость кода, оптимальная стратегия работы(epoll на Linux, kqueue на FreeBSD/MacOSX, Overlapped IO на MS Windows), высокий уровень абстракции(скрывает от разработчика много рутины). В теории, эти библиотеки должны работать медленее, так как используется высокий уровень абстракции.
  17.  
  18. Также стоит отдельно выделить свободный веб-сервер Apache HTTP Server. На сегодняшний день мирно сосуществуют 2 ветки Apache — 1.3 и 2.0. Обе версии на сегодняшний день поддерживаются. Они широко представлены и занимают половину серверного рынка в мире. Основной причиной успеха Apache является широкий спектр его функциональных возможностей. Apache может обслуживать одновременно большое количество клиентов. Он легко настраивается с помощью текстовых конфигурационных файлов и может быть на ходу переконфигурирован. Для разработки модулей имеется хорошо документированное API. Использование скриптовых языков позволяет использовать Apache в связке с базами данных и серверами приложений. Обе версии поддерживают протокол HTTP 1.1.
  19.  
  20. ###################################################################
  21.  
  22. Архитектура:
  23. Обобщенно, сервер делает следующие вещи:
  24.  
  25. * Создает сокет
  26. * Привязывает сокет к сетевому интерфейсу
  27. * Прослушивает сокет
  28. * Принимает входящие соединения
  29. * Реагирует на события, происходящие на сокетах
  30.  
  31. Epoll (extended poll) — API мультиплексированного ввода-вывода, предоставляемого Linux для приложений. Основные функции, которые предоставляет Epoll:
  32. Linux предоставляет следующие вызовы в рамках API:
  33.  
  34. * epoll_create() - создаёт структуру данных (epoll instance), с которой в дальнейшем идёт работа. Структура одна для всех файловых дескрипторов, за которыми идёт наблюдение. Функция возвращает файловый дескриптор, который в дальнейшем передаётся во все остальные вызовы epoll API.
  35.  
  36. * epoll_ctl() - используется для управления epoll instance, в частности, позволяет выполнять операции EPOLL_CTL_ADD (добавление файлового дескриптора к наблюдению), EPOLL_CTL_DEL (удаление файлового дескриптора из наблюдения), EPOLL_CTL_MOD (изменение параметров наблюдения), EPOLL_CTL_DISABLE (добавлена в Linux 3.7) — для безопасного отключения наблюдения за файловым дескриптором в многопоточных приложениях.
  37.  
  38. * epoll_wait() - возвращает количество (один или более) файловых дескрипторов из списка наблюдения, у которых поменялось состояние (которые готовы к вводу-выводу).
  39.  
  40.  
  41.  
  42. Принцип работы: после того, как приложение добавляет дескрипторы к наблюдению и вызывает epoll_wait(), при готовности какого-либо дескриптора (появлению информации, опустошению буфера и т. д.) ядро возвращает приложение из epoll_wait со списком файловых дескрипторов, которые готовы к работе. Если какие-то дескрипторы становятся готовыми к работе до вызова epoll_wait, то они отмечаются соответствующим образом и при следующем вызове epoll_wait управление в приложение возвращается сразу же со списком готовых к работе файловых дескрипторов.
  43.  
  44. События, за которыми можно наблюдать с помощью epoll:
  45.  
  46. * EPOLLIN - новые данные (для чтения) в файловом дескрипторе
  47. * EPOLLOUT - файловый дескриптор готов продолжить принимать данные (для записи)
  48. * EPOLLERR - в файловом дескрипторе произошла ошибка
  49. * EPOLLHUP - закрытие файлового дескриптора
  50.  
  51. ###################################################################
  52.  
  53. Инструкция по применению.
  54.  
  55. * Скачать файлы main.cpp, CMakeLists.txt
  56. * Загрузить cmake выполнив в терминале команды: sudo add-apt-repository ppa:george-edison55/cmake-3.x; sudo apt-get update; sudo apt-get install cmake
  57. * Перейти в папку с main.cpp и выполнить команды: cmake CMakeLists.txt; make; ./main
  58. * Теперь, когда сервер запущен, в адресной строке браузера написать localhost:3000
  59. * Увидеть статическую страницу с надписью "Hey, it works!"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement