В nginx рабочие процессы обслуживают одновременно множество соединений, мультиплексируя их вызовами операционной системы select (Windows), epoll (Linux), kqueue (FreeBSD) и eventport (Solaris). Рабочие процессы выполняют цикл обработки событий от дескрипторов. Полученные от клиента данные разбираются с помощью конечного автомата. Разобранный запрос последовательно обрабатывается цепочкой модулей, задаваемой конфигурацией. Ответ клиенту формируется в буферах, которые хранят данные либо в памяти, либо указывают на отрезок файла. Буферы объединяются в цепочки, определяющие последовательность, в которой данные будут переданы клиенту. Если операционная система поддерживает эффективные операции ввода-вывода, такие как writev и sendfile, то nginx применяет их по возможности [10].
Для эффективного управления памятью nginx использует пулы. Пул — это последовательность предварительно выделенных блоков динамической памяти. Длина блока варируется от 1 до 16 килобайт. Изначально под пул выделяется только один блок. Блок разделяется на занятую область и незанятую. Выделение мелких объектов выполняется путем продвижения указателя на незанятую область с учетом выравнивания. Если незанятой области во всех блоках нехватает для выделения нового объекта, то выделяется новый блок. Если размер выделяемого объекта превышает значение константы NGX_MAX_ALLOC_FROM_POOL, либо длину блока, то он полностью выделяется из кучи. Таким образом, мелкие объекты выделяются очень быстро и имеют накладные расходы только на выравнивание [15].
4.5.2 Выбор СУБД
Самыми известными СУБД при работе с сайтами являются MySQL, PostgreSQL. Также используются MSSQL, Oracle, Firebird и некоторые другие. Большая популярность MySQL и PostgreSQL по сравнению с проприетарными СУБД обусловлена большим сообществом разработчиков, открытостью продуктов и огромными возможностями по настройке быстродействия баз данных.
Если сравнивать конкретно MySQL и PostgreSQL, то можно выявить следующие преимущества MySQL:
- соответствие стандартам SQL – начиная с пятой версии MySQL большое внимание разработчиками удалялось соответствию стандартам SQL. В MySQL запросы максимально соответствют стандартам SQL'99;
- большее количество платформ – MySQL изначально разрабатывался как кроссплатформенная СУБД. В Windows MySQL работает как служба, в *nix – как демон. PostgreSQL изначально разрабатывался как СУБД, работающая в *nix-системах;
- скорость работы на простых запросах – огромное преимущество MySQL заключается именно в скорости работы простых запросов. Благодаря тому, что в MySQL используются различные типы таблицам, а типом таблиц по умолчанию является MyISAM, реализуется огромная скорость при работе с простыми запросами. В то же время, тип тпблиц InnoDB позволяет осуществлять транзакции, следить за целостностью данных, но в данной случае уже не будет выигрыша в скорости запросов;
- стабильность работы – исторически сложилось, что MySQL довольно стабильная СУБД. PostgreSQL – более молодая, в то время как из-за более раннего начала разработки у MySQL сложилось большее сообщество разработчиков;
- безопасность, связанная со стабильностью – сообщество разработчиков MySQL за все эти годы нашли и устранили огромное количество уязвимостей, что позволяет считать MySQL одной из самых защищенных СУБД;
- работа с большими объектами – в MySQL реализована поддержка бинарных объектов практически неограниченных размеров в полях типа BLOB, что отсутствует у PostgreSQL;
- возможности для легкого изменения таблиц – в MySQL реализованы возможности легкого изменения таблиц, что отсутствует в PostgreSQL.
В то же время у PostgreSQL есть свои преимущества:
- стабильность – несмотря на то, что сообщество разработчиков MySQL больше, сама PostgreSQL изначально проектировалась как более стабильная СУБД. Плюс в этом свою роль сыграло то, что MySQL долго избавлялся от наследия своих третьей и четвертой сравнительно нестабильных версий;
- скорость работы (процедуры) – PostgreSQL выигрывает в производительности на сложных запросах, логически построенных процедурах;
- целостность данных – PostgreSQL позволяет оперировать с данными, не перекладывая логику на ЯП. При разработке кода программисту не придется думать о целостности данных в БД;
- специальные вещи (триггеры, процедуры, функции...) - многие вещи, которые реализуются в MySQL только в последних релизах.
Как можно увидеть, главным преимуществом MySQL являются скорость работы на простых запросах (логика БД довольно простая и не требует процедур для реализации). Это преимуществом было выбрано в качестве основного при выборе СУБД.
В то же время было необходимо выбрать тип таблиц MySQL. Исторически сложилось, что типом таблиц по умолчанию в MySQL является MyISAM. Вторым по популярности типом таблиц является InnoDB. В настоящее время разрабатывается альтернатива InnoDB – Falcon, однако использование его на production-серверах не рекомендуется. В то же время существуют и другие типы таблиц, например:
- HEAP (все хранится в памяти)
- MERGE (совокупность таблиц MyISAM)
- Maria (обновленный MyISAM с возможностями транзакций)
При анализе преимущества и недостатков стандартного типа таблиц MySQL были выявлены следующие его преимущества:
- полнотекстовый поиск
- преимущество в скорости на простых выборках
- работа “из коробки”
Анализ преимуществ InnoDB выявил следующие пункты:
- поддержка транзакций
- целостность/внешние ключи
- преимущество в скорости на сложных выборках
- более полное соответствие стандартам
Как можно увидеть, InnoDB позволяет переложить логику на СУБД, в то время как стандартный тип таблиц позволяет использовать преимущество простых выборок (а их будет гораздо больше чем сложных). Также в MyISAM реализована возможность полнотекстового поиска (хотя она довольно требовательна к наличию индексов). И что немаловажно – возможность работы с типом “из коробки” [13]. Трудно сказать, преимущество это или недостаток, однако при развертывании каких-либо систем преимущество отдается проверенным продуктам. Настройка движка InnoDB до сих пор является довольно объемной темой, проработка которой не относится к написанию дипломной работы. Поэтому было отдано предпочтение типу таблиц MyISAM [11].
4.5.3 Выбор серверного ЯП и клиентского фреймворка
Связующим звеном между СУБД и веб-сервером является язык программирования. В настоящее время самыми популярными и ипользуемыми серверными ЯП при разработке веб-приложений являются python, php, jsp и ruby. Стандартом ЯП для создания клиентских веб-приложений в сети Интернет является javascript. Вопросом для разработчика в настоящее время становится лишь “какой фреймворк для работы с javascript стоит выбрать”. Самыми известными фреймворками являются jquery, prototype, dojo, extjs.
В качестве серверного ЯП был выбран php, который на данный момент является самым попялурным серверным ЯП в России для создания веб-приложений. PHP обладает рядом преимуществ, приведенных ниже [9].
Главными факторами PHP являются предоставление средств для быстрого и эффективного решения поставленных задач и практичность, обусловленная шестью важными характеристиками:
- традиционностью – многие конструкции языка позаимствованы из других известных языков программирования, что позволяет прикладывать меньше усилий при знакомстве с ним и его изучении. PHP специально нацелен на работу в сети Интернет. На сегодняшний день PHP является одним из популярных языков для создания веб-приложений;
- простотой – сценарий РНР может состоять из большого числа строк или из одной строки — все зависит от специфики поставленной задачи. Программисту не приходится подгружать библиотеки или указывать специальные параметры компиляции. Механизм РНР просто начинает выполнять код после первой экранирующей последовательности (<?) и продолжает выполнение до того момента, когда он встретит парную экранирующую последовательность (?>). Если код имеет правильный синтаксис, он исполняется в точности так, как указал программист. PHP – язык, который может быть встроен непосредственно в HTML-код страниц, которые, в свою очередь будут корректно обрабатываться PHP-интерпретатором. Большое разнообразие функций PHP избавят вас от написания многострочных пользовательских функций. В то же время существует больше количество фреймворков и CMS, написанных как разработчиками-одиночками, так и большими сообществами программистов;
- эффективностью – важное преимущество PHP заключается в том, что он не нуждается в компиляторе, и позволяет обрабатывать сценарии непосредственно на сервере. По некоторым оценкам, большинство PHP-сценариев (особенно не очень больших размеров) обрабатываются быстрее аналогичных им программ, написанных на других ЯП. Однако, чтобы не делали разработчики PHP, откомпилированные исполняемые файлы будут работать значительно быстрее – в десятки, а иногда и в сотни раз, поскольку откомпилированные программы по сути являются уже инструкциями в машинном коде, в то время как интерпретатор PHP лишь построчно исполняет инструкции, описанные программистом. В то же время, производительность PHP вполне достаточна для создания вполне объемных и многофункциональных веб-приложений;
- безопасностью – РНР предоставляет в распоряжение разработчиков и администраторов гибкие и эффективные средства безопасности, такие как, например, механизмы безопасности, находящиеся под управлением администраторов; при правильной настройке РНР это обеспечивает максимальную свободу действий и безопасность. Например, можно ограничить максимальное время выполнения и использование памяти (неконтролируемый расход памяти отрицательно влияет на быстродействие сервера) или устанавливать ограничения на каталоги, в которых пользователь может просматривать и исполнять сценарии РНР, а также использовать сценарии РНР для просмотра конфиденциальной информации на сервере. В стандартный набор функций РНР входит также ряд надежных механизмов шифрования. Другое преимущество заключается в том, что исходный текст сценариев РНР нельзя просмотреть в браузере, поскольку сценарий интерпретируется до его отправки по запросу пользователя. Реализация РНР на стороне сервера предотвращает похищение нетривиальных сценариев;