Диплом: Создание web-сервисов средствами стека технологий Django+Python3.x+Nginx+Gunicorn+PostgreSQL

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам
12
Современный PostgreSQL ведет происхождение от проекта POSTGRES,
который разрабатывался под руководством Майкла Стоунбрейкера (Michael
Stonebraker), профессора Калифорнийского университета в Беркли.
Работа над проектом началась в 1985 году, и до 1988 года был
опубликован ряд научных статей, описывающих модель данных, язык
запросов POSTQUEL (в то время SQL еще не был общепризнанным
стандартом) и устройство хранилища данных.
Первая версия СУБД была выпущена в 1989 году. База данных
совершенствовалась на протяжении нескольких лет, а в 1993 году, когда
вышла версия 4.2, проект был закрыт. Но, несмотря на официальное
прекращение, открытый код и BSD-лицензия позволили выпускникам
Беркли Эндрю Ю и Джоли Чену в 1994 году взяться за его дальнейшее
развитие. Они заменили язык запросов POSTQUEL на ставший к тому
времени общепринятым SQL, а проект нарекли Postgres95.
К 1996 году стало ясно, что название Postgres95 не выдержит
испытание временем, и было выбрано новое имя — PostgreSQL[39], которое
отражает связь и с оригинальным проектом POSTGRES, и с переходом на
SQL.
Новая версия стартовала как 6.0, продолжая исходную нумерацию. Проект
вырос, и управление им взяла на себя поначалу небольшая группа
инициативных пользователей и разработчиков, которая получила название
Глобальной группы разработки PostgreSQL (PostgreSQL Global Development
Group).
Все основные решения о планах развития и выпусках новых версий
принимаются Управляющим комитетом (Core team) проекта. В настоящий
момент он состоит из пяти человек.
Цикл работы над очередной версией PostgreSQL[40] обычно занимает
около года. За это время от всех желающих принимаются на рассмотрение
патчи с исправлениями, изменениями и новым функционалом. Для
обсуждения патчей по традиции используется список рассылки pgsql-hackers.
13
Если сообщество признает идею полезной, ее реализацию — правильной, а
код проходит обязательную проверку другими разработчиками, то патч
включается в новый релиз.
Глобальная группа разработки PostgreSQL выполняет поддержку
основных версий системы в течение пяти лет с момента выпуска. Эта
поддержка, как и координация разработки, осуществляется через списки
рассылки. Корректно оформленное сообщение об ошибке имеет все шансы
на скорейшее решение: нередки случаи, когда исправления ошибок
выпускаются в течение суток. Помимо поддержки сообществом
разработчиков, ряд компаний по всему миру осуществляет коммерческую
поддержку PostgreSQL.
PostgreSQL является одной из самых популярных баз данных. За более
чем 20-летнюю историю развития на прочном фундаменте, заложенном
академической разработкой, PostgreSQL выросла в полноценную СУБД
уровня предприятия и составляет реальную альтернативу коммерческим
базам данных.
К достоинствам PostgreSQL относятся:
1) Надежность и устойчивость
Вопросы обеспечения надежности особенно важны в приложениях
уровня предприятия для работы с критически важными данными. С
этой целью PostgreSQL позволяет настраивать горячее резервирование,
восстановление на заданный момент времени в прошлом, различные
виды репликации (синхронную, асинхронную, каскадную).
2) Безопасность
PostgreSQL позволяет работать по защищенному SSL-соединению и
предоставляет большое количество методов аутентификации, включая
аутентификацию по паролю, клиентским сертификатам, а также с
помощью внешних сервисов (LDAP, RADIUS, PAM, Kerberos).
При управлении пользователями и доступом к объектам
БД предоставляются следующие возможности:
14
• Создание и управление пользователями и групповыми ролями;
• Разграничение доступа к объектам БД на уровне как отдельных
пользователей, так и групп;
• Детальное управление доступом на уровне отдельных столбцов и
строк;
Поддержка SELinux через встроенную функциональность SE-
PostgreSQL (мандатное управление доступом).
3) Соответствие стандартам
По мере развития стандарта ANSI SQL его поддержка постоянно
добавлялась в PostgreSQL. Это относится ко всем версиям стандарта:
SQL-92, SQL:1999, SQL:2003, SQL:2008, SQL:2011. Поддержку
стандартизованной в недавней версии SQL:2016 работы с JSON
планируется добавить в PostgreSQL 11. В целом PostgreSQL
обеспечивает высокий уровень соответствия стандарту и поддерживает
160 из 179 обязательных возможностей, а также большое количество
необязательных.
4) Поддержка транзакций
PostgreSQL обеспечивает полную поддержку свойств ACID и
обеспечивает эффективную изоляцию транзакций. Для этого в
PostgreSQL используется механизм многоверсионного управления
одновременным доступом (MVCC). Он позволяет обходиться без
блокировок во всех случаях, кроме одновременного изменения од-
ной и той же строки данных в нескольких процессах. При этом
читающие транзакции никогда не блокируют пишущие транзакции, а
пишущие — читающих.
5) Масштабируемость и производительность
PostgreSQL эффективно использует современную архитектуру
многоядерных процессоров — его производительность растет
практически линейно с увеличением количества ядер.
15
Начиная с версии 9.6 PostgreSQL умеет работать с данными в
параллельном режиме, что на сегодняшний день включает
параллельное чтение (включая индексное сканирование), соединение и
агрегации. Это еще больше повышает возможности использования
аппаратных средств для ускорения операций.
6) Планировщик запросов
В PostgreSQL используется планировщик запросов, основанный на
стоимости. Используя собираемую статистику и учитывая в своих
математических моделях как дисковые операции, так и время работы
процессора, планировщик позволяет оптимизировать самые сложные
запросы. В его распоряжении находятся все методы доступа к данным
и способы выполнения соединений, характерные для передовых
коммерческих СУБД.
7) Возможность индексирования
В PostgreSQL реализованы различные методы индексирования.
Помимо традиционных B-деревьев, также доступны GiST, SP-GiST,
GIN, RUM, BRIN, Bloom.
За счет расширяемости набор доступных методов индексного доступа
постоянно увеличивается.
8) Кроссплатформенность
PostgreSQL работает на операционных системах семейства Unix,
включая серверные и клиентские разновидности Linux, FreeBSD,
Solaris, macOS, а также на Windows. За счет открытого и переносимого
кода на языке C PostgreSQL можно собрать на самых разных
платформах, даже если для них отсутствует поддерживаемая
сообществом сборка.
9) Расширяемость
Расширяемость — одно из фундаментальных преимуществ системы,
лежащее в основе архитектуры PostgreSQL. Пользователи могут
самостоятельно, не меняя базовый код системы, добавлять:
16
• Типы данных;
• Функции и операторы для работы с новыми типами;
• Индексные методы доступа;
• Языки серверного программирования;
• Подключения к внешним источникам данных (Foreign Data Wrappers);
• Загружаемые расширения.
Полноценная поддержка расширений позволяет реализовать
функционал любой сложности, не внося изменений в ядро PostgreSQL
и допуская подключение по мере необходимости.
10) Доступность
Лицензия PostgreSQL разрешает неограниченное использование СУБД,
модификацию кода, а также включение в состав других продуктов, в
том числе закрытых и коммерческих.
11) Независимость
PostgreSQL не принадлежит ни одной компании и развивается
международным сообществом, в том числе и российскими
разработчиками. Это означает, что системы, использующие
PostgreSQL, не зависят от конкретного вендора, тем самым в любой
ситуации сохраняя вложенные в них инвестиции.
1.3 История разработки Nginx и Gunicorn и обзор их работы
Nginx [engine x] — это HTTP-сервер и обратный прокси-сервер,
почтовый прокси-сервер, а также TCP/UDP прокси-сервер общего
назначения, изначально написанный Игорем Сысоевым [1]. Основное
назначение — самостоятельный HTTP-сервер, или, как его используют чаще,
фронтенд для высоконагруженных проектов. Уже длительное время он
обслуживает серверы многих высоконагруженных российских сайтов, таких
как Яндекс, Mail.Ru, ВКонтакте и Рамблер. Согласно статистике Netcraft
nginx[32] обслуживал или проксировал 23.76% самых нагруженных сайтов в
марте 2018 года.
17
Исходные тексты и документация распространяются под BSD-
подобной лицензией из 2 пунктов. Коммерческая поддержка осуществляется
компанией Nginx, Inc.
Основная функциональность HTTP-сервера заключается в следующем:
Обслуживание статических запросов, индексных файлов,
автоматическое создание списка файлов, кэш дескрипторов
открытых файлов;
Акселерированное обратное проксирование с кэшированием,
распределение нагрузки и отказоустойчивость;
Акселерированная поддержка FastCGI, uwsgi, SCGI и memcached
серверов с кэшированием, распределение нагрузки и
отказоустойчивость;
Модульность, фильтры, в том числе сжатие (gzip), byte-ranges
(докачка), chunked ответы, XSLT-фильтр, SSI-фильтр,
преобразование изображений; несколько подзапросов на одной
странице, обрабатываемые в SSI-фильтре через прокси или
FastCGI/uwsgi/SCGI, выполняются параллельно;
Поддержка SSL и расширения TLS SNI;
Поддержка HTTP/2 с приоритизацией на основе весов и
зависимостей.
Виртуальные серверы, определяемые по IP-адресу и имени;
Поддержка keep-alive и pipelined соединений;
Настройка форматов логов, буферизованная запись в лог,
быстрая ротация логов, запись в syslog;
Специальные страницы для ошибок 3xx-5xx;
rewrite-модуль: изменение URI с помощью регулярных
выражений;
Выполнение разных функций в зависимости от адреса клиента;
18
Ограничение доступа в зависимости от адреса клиента, по
паролю (HTTP Basic аутентификация) и по результату
подзапроса;
Проверка HTTP referer;
Методы PUT, DELETE, MKCOL, COPY и MOVE;
FLV и MP4 стриминг;
Ограничение скорости отдачи ответов;
Ограничение числа одновременных соединений и запросов с
одного адреса;
Геолокация по IP-адресу;
A/B-тестирование;
Зеркалирование запросов;
Встроенный Perl;
Функциональность TCP/UDP прокси-сервера такова:
Проксирование TCP и UDP;
Поддержка SSL и расширения TLS SNI для TCP;
Распределение нагрузки и отказоустойчивость;
Ограничение доступа в зависимости от адреса клиента;
Выполнение разных функций в зависимости от адреса клиента;
Ограничение числа одновременных соединений с одного адреса;
Настройка форматов логов, буферизованная запись в лог,
быстрая ротация логов, запись в syslog;
Геолокация по IP-адресу;
A/B-тестирование;
Nginx является широко используемым продуктом в мире IT, по
популярности уступая лишь Apache. Nginx написан на языке
программирования « C ». Весь функционал уже реализован и разработчику
остаётся лишь написать конфигурацию для того что бы Nginx обрабатывал
19
запросы так, как необходимо разработчику, а вся бизнес-логика реализуется в
back-end на выбранном языке программирования, в моём случае Python[22].
Как правило, его используют либо как самостоятельный HTTP-сервер,
используя в бекенде PHP-FPM, либо в связке с Apache, где Nginx
используется во фронтэнде как кеширующий сервер, принимая на себя
основную нагрузку, отдавая статику из кеша, обрабатывая и отфильтровывая
входящие запросы от клиента и отправляя их дальше к Apache. Apache
работает в бекэнде, работая уже с динамической составляющей проекта,
собирая страницу для передачи её в кеш Nginx и запрашивающему её
клиенту. В моём случае вместо Apache будет использоваться Gunicorn.
Nginx получил первый официальный релиз в 2004 году, по этой
причине, его разработчик был осведомлен о проблемах конкурентности, с
которыми сталкиваются сайты при масштабировании. Благодаря этим
знаниям Nginx изначально был спроектирован на базе асинхронных
неблокирующих event-driven алгоритмов.
Nginx создает процессы-воркеры каждый из которых может
обслуживать тысячи соединений. Воркеры достигают такого результата
благодаря механизму основанному на быстром цикле, в котором
проверяются и обрабатываются события. Отделение основной работы от
обработки соединений позволяет каждому воркеру заниматься своей работой
и отвлекаться на обработку соединений только тогда, когда произошло новое
событие.
Каждое соединение, обрабатываемое воркером, помещается в event
loop вместе с другими соединениями. В этом цикле события обрабатываются
асинхронно, позволяя обрабатывать задачи в неблокирующей манере. Когда
соединение закрывается оно удаляется из цикла.
Этот подход к обработке соединений позволяет Nginx'у невероятно
масштабироваться при ограниченных ресурсах. Поскольку сервер
однопоточный и он не создает процессы под каждое соединение,
20
использование памяти и CPU относительно равномерно, даже при высоких
нагрузках.
Принцип работы Nginx простым языком можно описать так:
1) Читаем файл конфигурации
2) Получаем сокет
3) Открываем log-файлы на запись
4) Понижаем привилегии
5) Запуск дочерних процессов/потоков
6) Работаем в цикле
Акцентирую внимание на четвёртом пункте. Во время установки Nginx
создаётся новый пользователь и запускается он с правами root-пользователя,
но после выполнения 1-3 пунктов Nginx начинает работать от имени
обычного пользователя у которого прав на чтение/запись меньше чем у root-
пользователя. Тем самым, понижая привилегии, Nginx обеспечивает
безопасность данных и проекта в целом, так как в случае хакерской атаки,
злоумышленник получит ограниченные права доступа и не нанесёт
серьёзного ущерба.
Переходим к рассмотрению Gunicorn.
Gunicorn — автономный web-сервер[33] с обширной функциональностью,
предоставленной в удобном виде. Он изначально поддерживает различные
фреймворки и адаптеры, что делает его чрезвычайно простой в
использовании прямой заменой для многих серверов разработки.
Технически Gunicorn работает подобно Unicorn, популярному web-
серверу приложений Ruby. Они оба используют так называемую pre-fork
модель (это значит, что главный процесс управляет инициированными
рабочими процессами различного типа, создает сокеты и соединения, и т.п.).
Особенности сервера Gunicorn:
Запускает любое приложение (и фреймворк) WSGI Python.
Служит заменой серверам Paster/Pyramid (сервер разработки Django),
web2py и т.п.
21
Поставляется с различными конфигурациями и типами процессов.
Автоматически управляет процессами.
Поддерживает HTTP/1.0 и HTTP/1.1 с помощью синхронных и
асинхронных процессов.
Поддерживает SSL.
Расширяется с помощью специальных точек входа.
Поддерживает Python 2.6+ и 3.x.
Так как Nginx не способен вызывать напрямую функции из бизнес-логики
приложения, он проксирует запрос на другой сервер, а именно Gunicor,
который в свою очередь взаимодействует с кодом Python[23]. Но так как
Gunicor (WSGI сервер) ничего кроме вызова функций не способен
выполнять, то Nginx и Gunicorn ставят в связке. Это позволяет распределить
работу приложения – Nginx обрабатывает статические данные, Gunicorn
обрабатывает запросы к бизнес-логике и Python/Django[24][25] реализует
бизнес-логику. Таким образом достигается максимально возможная скорость
работы приложения и экономия ресурсов.
Что касается WSGI. Очень упрощенно говоря, WSGI представляет собой
интерфейс между web-сервером и самим приложением. Он устанавливает
стандартное соединение между различными серверами и приложениями
(фреймворками), что обеспечивает их взаимозаменяемость в случае
необходимости (например, переход от среды разработки к производственной
среде), что очень важно в настоящее время.

Смотрите также:

"Автоматизация обработки заявок ООО "Проектно-Строительная Компания"
"Автоматизация процесса аттестации персонала для ООО "Нэт Бай Нэт Холдинг"
"Анализ интернет-активности конкурентов ( на примере конкурентов "Газпром нефть")
"Бухгалтерский учёт и аудит расчётов с подотчётними лицами в организации на примере ООО "ЛОЦ 10""
«Психологическое сопровождение персонала в организации на примере ООО «Крокус»
Cовершенствование деловой оценки персонала в организации (на примере ООО "Даймонд кейтеринг развитие")
PR как средство продвижения организации (на примере ПАО "Тамбовский завод "Комсомолец им. Н.С. Артемова")
PR-коммуникации в сфере общественного питания (на примере кафе-кондитерской «Cream Cheese»)
SMM как средство повышения эффективности работы учреждений социокультурной сферы (на примере Малого театра)
Value-based education: ценности в системе образования и способы их реализации на уроке английского языка. Опыт Европейских стран