Рубрики
Uncategorized

Тур по настройкам сервера Django

Если вы не развернули много приложений Django, то вы можете задаться вопросом: как профессионалы ставят Джанго … Помечено с Django, WebDev, DevOps.

Если вы не развернули много приложений Django, то вы можете задаться вопросом: как профессионалы помещают приложения Django в Интернет? Как обычно выглядит Джанго, когда он работает в производстве? Вы можете даже думать Что, черт возьми, Производство ?

Прежде чем я начал работать за разработчиком, в моей голове было всего лишь нечеткое облако, где должно быть знание производственной инфраструктуры. Если в вашей голове есть нечеткое облако, давайте исправим это. Есть много способов расширить настройку сервера Django для достижения лучшей производительности, экономической эффективности и надежности. Этот пост приведет вас в тур по некоторым общим настройкам сервера Django, от самых простых и базовых до более сложных и мощных. Я надеюсь, что это построит вашу ментальную модель того, как Джанго принимает производство, кусочна.

Ваша местная машина

Давайте начнем с рассмотрения настройки Django, с которой вы уже знакомы: ваша местная машина. Пройти через это будет разминкой для последующих разделов. Когда вы запускаете Django на местном уровне, у вас есть:

  • Ваш веб -браузер (Chrome, Safari, Firefox и т. Д.)
  • Django работает с командой управления Runserver
  • База данных SQLite, сидящая в папке проекта

Довольно просто, верно? Затем давайте посмотрим на нечто подобное, но развернуто на веб -сервер.

Самый простой возможный веб -сервер

Самый простой веб -сервер Django, который вы можете настроить, очень похож на вашу локальную среду Dev. Большинство профессиональных разработчиков Django не используют такую базовую настройку для их производственных сред. Это работает отлично, но у него есть некоторые ограничения, которые мы обсудим позже. Похоже:

Как правило, люди управляют Django на виртуальной машине Linux, часто используя распределение Ubuntu. Виртуальная машина размещена облачным провайдером, таким как Amazon , Google , Azure В Digitalocean или Linode Анкет

Вместо использования RunServer вы должны использовать сервер WSGI, как Онломщик Чтобы запустить ваше приложение Django. Я подробно рассказываю о том, почему вы не должны использовать Runserver в производстве, и объяснять wsgi Здесь Анкет В противном случае, не так сильно отличается от вашей локальной машины: вы все еще можете использовать SQLite в качестве базы данных ( больше здесь ).

Это голые кости установки. Есть несколько других деталей, которыми вам нужно будет управлять как Настройка DNS , виртуальная среда, присматривать за пиноргом с таким начальником процесса, как Супервизион или как обслуживать статические файлы с Отбелить Анкет Если вы заинтересованы в более полном руководстве о том, как настроить такой простой сервер, я написал Гид Это объясняет, как развернуть Джанго.

Типичный автономный веб -сервер

Давайте рассмотрим среду, которую профессиональный Django Dev может создать при производстве при использовании одного сервера. Это не точная настройка, которую каждый всегда будет использовать, но структура очень распространена.

Некоторые вещи такие же, как и простая настройка: это все еще виртуальная машина Linux с Django, управляемой стрелком. Есть три основных различия:

  • SQLite был заменен другой базой данных, Postgresql
  • A Nginx Веб-сервер сейчас находится в переделении надзора в Обратная прокси настраивать
  • Статические файлы в настоящее время обслуживаются вне Джанго

Почему мы обменивались SQLite на PostgreSQL? В целом Postgres — более продвинутый и полный и полный. Например, Postgres может обрабатывать несколько записей одновременно, в то время как SQLite не может.

Почему мы добавили Nginx в нашу настройку? Nginx — это специальный веб -сервер, который обеспечивает дополнительные функции и улучшения производительности по сравнению с использованием стрелкового корня для обслуживания веб -запросов. Например, мы можем использовать Nginx для непосредственного обслуживания статических и медиа -файлов нашего приложения более эффективно. Nginx также может быть настроен на множество других полезных вещей, таких как Encrypt Your Web Traffic, используя HTTPS и сжатие ваших файлов, чтобы сделать ваш сайт быстрее. Nginx — это веб -сервер, который чаще всего сочетается с Django, но есть также альтернативы, такие как Apache Http Server и Трафик .

Важно отметить, что все здесь живет на одном сервере, что означает, что если сервер уходит, так и все ваши данные, Если у вас нет резервных копий Анкет Эти данные включают ваши таблицы Django, которые хранятся в Postgres, и файлы, загруженные пользователями, которые будут храниться в Media_root Папка, где -то в вашей файловой системе. Наличие только одного сервера также означает, что если ваш сервер перезагружается или выключается, то же самое и ваш сайт. Это нормально для небольших проектов, но это неприемлемо для больших сайтов, таких как Stackoverflow или Instagram, где стоимость простоя очень высока.

Одиночный веб -сервер с несколькими приложениями

Как только вы начнете использовать Nginx и PostgreSQL, вы можете запустить несколько приложений Django на одной машине. Вы можете сэкономить деньги на плате за хостинг, упаковывая несколько приложений на один сервер, а не платить за отдельный сервер за каждое приложение. Эта настройка также позволяет повторно использовать некоторые службы и конфигурации, которые вы уже настроили.

Nginx может маршрутироваться входящие HTTP -запросы в разные приложения на основе доменного имени, а Postgres могут размещать несколько баз данных на одной машине. Например, я использую один сервер для размещения некоторых из моих личных проектов Django: Ссылки Мэтта , Воспоминания ниндзя и Читатель блога

Я пропустил статические файлы для простоты. Обратите внимание, что наличие нескольких приложений на одном сервере сохраняет ваши расходы на размещение, но есть недостатки: перезагрузка сервера перезагружает все ваши приложения.

Одиночный веб -сервер с работником

Некоторые веб -приложения должны делать что -то, кроме просто Костюм . Например, мой сайт Читатель блога Нужно скрепить Текст с веб -сайта, а затем отправьте его в API Amazon, чтобы быть переведенным в аудиофайлы . Другим распространенным примером является «Министерство», где вы загружаете огромный файл изображений 5 МБ в Facebook, и они уменьшают его в дрянную JPEG 120 КБ. Эти виды задач не происходят внутри вида Джанго, потому что они занимают слишком много времени, чтобы бежать. Вместо этого они должны произойти «в автономном режиме», в отдельном рабочем процессе, используя такие инструменты, как Сельдерей , Huey , Django-rq или Django-q Анкет Все эти инструменты предоставляют вам способ выполнять задачи за пределами просмотров Джанго и делать более сложные вещи, такие как координировать несколько задач, и запустить их по расписанию.

Все эти инструменты следуют аналогичной схеме: задачи отправляются Джанго и помещают в очередь, где они ждут, чтобы его выполняли. Эта очередь управляется сервисом под названием «брокер», которая отслеживает все задачи, которые необходимо выполнить. Обычными брокерами для задач Django являются Redis и Rabbitmq. Рабочий процесс, который использует ту же кодовую базу, что и ваше приложение Django, выводит задачи брокера и запускает их.

Если вы еще не работали с очередями задач, тогда не сразу очевидно, как все это работает, поэтому позвольте мне привести пример. Вы хотите загрузить 2 МБ Фото вашего завтрака от вашего телефона до сайта Django. Чтобы оптимизировать производительность загрузки изображений, сайт Django превратит эту загрузку на 2 МБ в 70 КБ отображать изображение и меньший Миниатюрный образ Анкет Так вот что происходит:

  • Пользователь загружает фотографию в представление Django, которое сохраняет исходную фотографию в файловую систему и обновляет базу данных, чтобы показать, что файл был получен
  • Представление также выдвигает миниатюрную задачу для брокера задачи
  • Брокер получает задачу и помещает ее в очередь, где он ждет, чтобы быть выполненным
  • Работник просит брокера на следующую задачу, и брокер отправляет эскизы
  • Работник читает описание задачи и запускает некоторую функцию Python, которая считывает исходное изображение из файловой системы, создает меньшие миниатюрные изображения, сохраняет их, а затем обновляет базу данных, чтобы показать, что миниатюра завершена

Если вы хотите узнать больше об этом, я написал гиды для начала работы с Оффлайн задачи и Запланированные задачи С Джанго К.

Одиночный веб -сервер с кэшем

Иногда вам захочется Используйте кэш хранить данные на короткое время. Например, кэши обычно используются, когда у вас есть некоторые данные, которые были бы дороги из базы данных или API, и вы хотите немного использовать их на некоторое время. Redis и Memcached Оба популярных сервиса кеша используются в производстве с Django. Это не очень сложная установка.

Одиночный веб -сервер с докером

Если вы слышали о Docker Прежде чем вы можете задаться вопросом, где это воображает в эти установки. Это отличный инструмент для создания последовательных средств программирования, но на самом деле он не меняет, как что -то из этого работает слишком много. Большинство настройки, которые я описал, работают в основном одинаково … за исключением того, что все находится внутри контейнера Docker.

Например, если вы запускали несколько приложений Django на одном сервере и хотели использовать контейнеры Docker, то вы можете сделать что -то подобное, используя Docker Swarm :

Как вы можете видеть, это не такая другая структура по сравнению с тем, что мы делали до Docker. Контейнеры — это просто обертки вокруг услуг, которые мы уже работали. Помещение вещей в контейнеры Docker на самом деле не меняет то, как все услуги разговаривают друг с другом. Если вы действительно хотели, чтобы вы могли обернуть контейнеры Docker вокруг большего количества вещей, таких как Nginx, база данных, кэш Redis, что угодно. Вот почему я думаю, что важно научиться развернуть Джанго без докера в первую очередь. Тем не менее, вы можете сделать несколько более сложных настройки с контейнерами Docker, которые мы пойдем позже.

Внешние услуги

До сих пор я показывал вам настройки серверов только с одной виртуальной машиной, работающей в Ubuntu. Это самая простая настройка, которую вы можете использовать, но у нее есть ограничения: есть некоторые вещи, которые вам может понадобиться, что один сервер не может дать вам. В этом разделе я собираюсь провести вас через то, как мы можем разбить наш единственный сервер на более продвинутые настройки.

Если вы изучали программирование, вы могли бы прочитать о Разделение проблем , Принцип единственной ответственности и модель-видит-контроллер (MVC) Анкет Многие изменения, которые мы собираемся внести, будут иметь подобную атмосферу: мы собираемся разделить наши услуги на более мелкие, более специализированные подразделения, основываясь на их «обязанности». Мы собираемся разбрасывать наши услуги, пока не останется ничего. Просто примечание: вам, возможно, не нужно делать это для ваших услуг, это всего лишь обзор того, что вы мог делать.

Внешние службы — база данных

Первое, что вы хотели бы снять с нашего сервера, — это база данных. Это включает в себя поставку PostgreSQL на свою виртуальную машину. Вы можете настроить это самостоятельно или заплатить немного лишним за такую услугу, как Amazon RDS Анкет

Есть несколько причин, по которым вы хотели бы поставить базу данных на свой собственный сервер:

  • У вас может быть несколько приложений на разных серверах, которые зависят от одной и той же базы данных
  • На производительность вашей базы данных не повлияет «шумные соседи», которые съедают процессор, оперативную память или пространство диска на той же машине
  • Вы отобрали свою драгоценную базу данных у своего веб-сервера Django, что означает, что вы можете удалить и воссоздать сервер вашего приложения Django с меньшим количеством забот.
  • бормотать мублевые бормовые бормотки

Использование удобной опции, подобной AWS RDS, является привлекательным, потому что он уменьшает объем работы администратора, который вам необходимо для запуска сервера базы данных. Если вы являетесь бэкэнд -разработчиком с большим количеством работы и больше денег, чем время, то это хороший шаг.

Внешние службы — хранилище объекта

Обычно толкает хранилище файлов с веб -сервера в «хранилище объектов», которая в основном является файловой системой, стоящей за хорошим API. Это часто делается с помощью Django Storages , что мне нравится использовать. Хранение объектов обычно используется для пользовательского «медиа», таких как документы, фотографии и видео. Я использую AWS S3 (Simple Service) для этого, но у каждого большего поставщика облачного хостина есть какое -то предложение «хранения объектов».

Есть несколько причин, почему это хорошая идея

  • Вы вывели все состояние вашего приложения (файлы, база данных) с вашего сервера, так что теперь вы можете перемещать, уничтожить и воссоздать сервер Django без потери данных
  • Загрузки файлов нажмите на службу хранения объектов, а не на ваш сервер, что означает, что вы можете легче масштабировать свои файлы.
  • Вам не нужно беспокоиться ни о каком администраторе файловой системы, например, на дисковом пространстве.
  • Несколько серверов могут легко обмениваться одним и тем же набором файлов

Надеюсь, вы увидите здесь тему, мы берем дерьмо, о котором мы не заботимся, и делаем это чужой проблемой. Плата кому -то еще, чтобы выполнить работу по управлению нашими файлами и базой данных, оставляет нам больше свободного времени, чтобы работать над более важными вещами.

Внешние службы — веб -сервер

Вы также можете запустить свой «Веб -сервер» (Nginx) на другой виртуальной машине на «Сервер приложения» (стреляющий + Django):

Это кажется бессмысленным, хотя, зачем вам беспокоиться? Ну, с одной стороны, у вас может быть несколько идентичных серверов приложений, настроенных на избыточность и для обработки высокого трафика, и Nginx может действовать как балансировщик нагрузки между различными серверами.

Вы также можете заменить Nginx на готовый балансировщик нагрузки, например, балансировщик AWS Elastic Load или что-то подобное.

Обратите внимание, как размещение наших услуг на свои собственные серверы позволяет нам расширить их по нескольким виртуальным машинам. Мы не могли одновременно запустить наше приложение Django на трех серверах, если у нас также было три копии нашей файловой системы и три базы данных.

Внешние службы — очередь задач

Вы также можете подтолкнуть свои услуги «автономной задачи» на свои собственные серверы. Как правило, сервис брокера получит свою собственную машину, а работник будет жить на другой:

Разделение вашего работника на свой собственный сервер полезно, потому что:

  • Вы можете защитить свое веб -приложение Django от «шумных соседей»: работники, которые проталкивают всю оперативную память и процессор
  • Вы можете предоставить работнику сервера дополнительные ресурсы, которые ему нужны: ЦП, ОЗУ или доступ к графическому графику
  • Теперь вы можете внести изменения в сервер работников, не рискуя повреждением очереди задач или веб -сервера

Теперь, когда вы разделили ситуацию, вы также можете расширить свои работники, чтобы выполнить больше задач параллельно:

Вы могли бы потенциально поменять нашего самоуправленного брокера (Redis или Rabbitmq) на управляемую очередь, такую как Amazon Sqs Анкет

Внешние службы — окончательная форма

Если вы полностью пошли, ваше приложение Django может быть настроено так:

Как вы можете видеть, вы можете стать довольно сумасшедшим расщеплять все части вашего приложения Django и распространять на несколько серверов. В этом есть много подходов, но недостатком является то, что теперь у вас есть несколько серверов для предоставления, обновления, мониторинга и обслуживания. Иногда дополнительная сложность стоит или иногда это пустая трата вашего времени. Тем не менее, в этой настройке есть много преимуществ:

  • Ваши веб -серверы и рабочие серверы полностью заменяются, вы можете уничтожить, создавать и обновлять их, не влияя на время безотказной работы вообще
  • Теперь вы можете сделать синие зеленые развертывания С нулевым временем простоя веб -приложений
  • Ваши файлы и база данных легко передаются между несколькими серверами и приложениями
  • Вы можете предоставить серверы разных размеров для их различных рабочих нагрузок
  • Вы можете поменять свои серверы самоуправленных на управляемую инфраструктуру, например, перемещение вашего брокера для задач на AWS SQS или ваша база данных в AWS RDS
  • Теперь вы можете автоматически масштабировать свои серверы (подробнее об этом позже)

Когда у вас есть сложная инфраструктура, вам нужно начать автоматизировать настройку инфраструктуры и конфигурацию сервера. Просто невозможно управлять этим материалом вручную, как только на вашей установке будет столько движущихся частей. Я записал разговор о Управление конфигурацией Это вводит эти концепции. Вам нужно будет начать изучать такие инструменты, как Ansible и Пэкер Для настройки ваших виртуальных машин и таких инструментов, как Terraform или Cloudformation Для настройки ваших облачных сервисов.

Автоматические группы

Вы уже видели, как вы можете иметь несколько веб -серверов, запускающих одно и то же приложение, или несколько рабочих серверов, которые вытащили задачи из очереди. Эти серверы стоят деньги, доллары в час, и это может стать очень дорого, чтобы управлять большим количеством серверов, чем вам нужно.

Вот где Автоскалирование приходит в. Вы можете настроить свои облачные сервисы, чтобы использовать какой -то триггер, такой как использование процессора виртуальной машины, для автоматического создания новых виртуальных машин из изображения и добавить их в группу автоматического мастерства.

Давайте использовать наши серверы работников задач в качестве примера. Если у вас есть миниатюрный сервис, который поворачивается Большие загруженные фотографии в Меньшие фотографии Тогда один сервер должен иметь возможность обрабатывать десятки загрузки файлов в секунду. Что, если в течение некоторых периодов дня, как около 6 вечера после работы, вы видели загрузку файлов от десятков в секунду в секунду в тысячи в секунду? Тогда вам понадобится больше серверов! С помощью автоматической настройки использование ЦП на ваших рабочих серверах вспыхнуло, что вызвало создание все больше и больше рабочих серверов, пока у вас не будет достаточно, чтобы справиться со всеми загрузками. Когда скорость загрузки файлов падает, дополнительные серверы будут автоматически уничтожены, поэтому вы не всегда платите за них.

Контейнер Clusterfuck

Есть целый мир контейнеров, который я не раскрыл в подробностях, потому что:

  • Я не очень хорошо это знаю
  • Это немного сложно для плавной аудитории этого поста; а также
  • Я не думаю, что большинству людей это нужно

Для полноты я быстро рассмотрю некоторые классные, сумасшедшие вещи, которые вы можете сделать с контейнерами. Вы можете использовать такие инструменты, как Kubernetes и Docker Swarm С набором файлов конфигурации для определения всех ваших услуг как контейнеров Docker и того, как они все должны общаться друг с другом. Все ваши контейнеры работают где -то в вашем кластере Kubernetes/Swarm, но, как разработчик, вам все равно, на каком сервере они на сервере. Вы просто создаете контейнеры Docker, пишете свой файл конфигурации и подталкиваете его к своей инфраструктуре.

Использование этих инструментов «контейнерного оркестровки» позволяет отделить ваши контейнеры от их базовой инфраструктуры. Несколько команд могут развернуть свои приложения на одном и том же наборе серверов без какого -либо конфликта между их приложениями. Это та инфраструктура, которая позволяет командам развертывать Микросервисы Анкет У крупных предприятий, таких как Target, будут специализированные команды, посвященные настройке и поддержанию этих систем оркестровки контейнеров, в то время как другие команды могут использовать их, не думая о базовых серверах. Эти команды, по сути, предоставляют «платформу как услугу» (PAAS) остальной части организации.

Как вы могли заметить, в этих инструментах оркестровки контейнерных контейнер, вероятно, слишком много сложности, чтобы они могли стоить вашего как соло -разработчик или даже как небольшая команда. Если вы заинтересованы в таких вещах, вам может понравиться Докку , который утверждает, что является «самой маленькой реализацией PAAS, которую вы когда -либо видели».

Конец тура

Это в основном все, что я знаю, что я знаю о том, как Джанго может быть создан в производстве. Если вы заинтересованы в создании своих навыков инфраструктуры, то я рекомендую вам попробовать одну из настройки или инструментов, которые я упоминал в этом посте. Надеюсь, я создал ваши ментальные модели того, как Django развернут, чтобы в следующий раз, когда кто -то упоминает «брокер задачи» или «автоматическое мастерство», у вас есть представление о том, о чем они говорят.

Если вам понравилось читать это, вам также могут понравиться другие вещи, о которых я написал Развертывание Django как можно более просто , как Начните с автономными задачами , как начать Ведение в файлах и Ошибки отслеживания в Prod и My Введение в управление конфигурацией .

Если вам понравились диаграммы коробок в этом посте, посмотрите Exalidraw Анкет

Оригинал: «https://dev.to/mattdsegal/a-tour-of-django-server-setups-2h06»