Развертывание Django с gunicorn и nginx
это широкий вопрос, но я хотел бы сделать каноническим ответом. Я пытался развернуть сайт с помощью gunicorn и nginx на Джанго. После прочтения тонны учебников, я был успешным, но я не могу быть уверен, что шаги, которые я следовал достаточно хороши, чтобы запустить сайт без проблем или может есть лучшие способы сделать это. Эта неопределенность раздражает.
вот почему я ищу очень подробно и хорошо объяснил ответ для новичков. Я не хочу объяснять слишком много того, что я знаю и чего я не знаю, так как это может немного исказить ответы, и другие люди могут в меньшей степени извлечь выгоду из ваших ответов. Тем не менее, некоторые вещи, которые я хотел бы видеть упомянуты:
какую "настройку"вы видели лучше всего? Я использовал virtualenv и переехал мой Джанго проект внутри этой среды, однако я видел другие настройки, где есть папка для виртуальных среды и других проектов.
как я могу настроить вещи таким образом, что позволяет размещать несколько сайтов на одном сервере?
почему некоторые люди предлагают использовать
gunicorn_django -b 0.0.0.0:8000и другиеgunicorn_django -b 127.0.0.1:8000? Я протестировал последний в экземпляре Amazon EC2, но он не работал, в то время как первый работал без проблем.какова логика конфигурационного файла nginx? Есть так много учебников с помощью кардинально разные конфигурационные файлы, которые я путаю, на каком из них лучше. Например, некоторые люди используют
alias /path/to/static/folderи другиеroot /path/to/static/folder. Возможно, вы можете поделиться своим предпочтительным файлом конфигурации.почему мы создаем символическую ссылку между
site-availableиsites-enabledна/etc/nginx?некоторые лучшие практики, как всегда приветствуются : -)
спасибо
4 ответов:
какую "настройку"вы видели лучше всего? Я использовал virtualenv и переместил мой проект django внутри этой среды, однако я видел другой настройки, где есть папка для виртуальных сред и другие для проекты.
virtualenv-это способ изолировать среды Python; как таковой, он не имеет большой роли в развертывание - однако в течение развитие и тестирование это a требование, если не очень рекомендуется.
значение, которое вы получите от virtualenv, заключается в том, что оно позволяет вам убедиться, что для приложения установлены правильные версии библиотек. Так что не имеет значения, где вы придерживаетесь самой виртуальной среды. Просто убедитесь, что вы не включаете его в систему управления версиями исходного кода.
макет файловой системы не является критическим. Вы увидите много статей, восхваляющих достоинства макетов каталогов и даже скелетные проекты, которые вы можете клонировать в качестве отправной точки. Я чувствую, что это скорее личное предпочтение, чем жесткое требование. Конечно, его приятно иметь; но если вы знаю, почему, это не добавляет никакой ценности в ваш процесс развертывания - так что не делайте этого, потому что некоторые блоги рекомендуют его, если это не имеет смысла для вашего сценария. Например - нет необходимости создавать
setup.pyфайл, если у вас нет частного сервера PyPi, который является частью рабочего процесса развертывания.как я могу настроить вещи таким образом, что позволяет размещать несколько сайтов на одном сервере?
есть две вещи, которые вам нужно сделать несколько настроек сайта:
- сервер, который прослушивает общедоступный IP-адрес на порту 80 и / или порту 443, если у вас есть SSL.
- куча "процессов", которые работают с фактическим исходным кодом django.
люди используют nginx для #1, потому что это очень быстрый прокси, и он не приходит с накладными расходами комплексного сервера, такого как Apache. Вы можете использовать Apache, если вам это удобно. Нет требования, что "для нескольких сайтов используйте nginx"; вам просто нужна служба, которая прослушивает этот порт, знает, как перенаправить (прокси) на ваши процессы, работающие с фактическим кодом django.
для #2 есть несколько способов запустить эти процессы. gevent / uwsgi являются наиболее популярными из них. Единственное, что нужно помнить здесь не использовать runserver в производство.
это абсолютные минимальные требования. Обычно люди добавляют какой-то менеджер процессов для управления всеми запущенными "серверами django" (#2). Здесь вы увидите
upstartиsupervisorупоминается. Я предпочитаю supervisor, поскольку ему не нужно брать на себя всю систему (в отличие от выскочки). Однако, опять же - это не жесткие требование. Вы могли бы прекрасно запустить кучуscreenсеансы и отцепить их. Недостатком является то, что если ваш сервер перезагрузится, вам придется перезапустить сеансы экрана.лично я бы порекомендовал:
- Nginx для #1
- выберите между uwsgi и gunicorn - я использую uwsgi.
- руководитель для управления внутренними процессами.
- отдельные системные учетные записи (пользователи)для каждого приложения, которое вы размещаете.
причина I рекомендация №4-изолировать разрешения; опять же, не является требованием.
почему некоторые люди предлагают использовать gunicorn_django-b 0.0.0.0: 8000 и другие предлагают gunicorn_django-b 127.0.0.1: 8000? Я проверил последнее в экземпляре Amazon EC2, но он не работал, пока работал первый без проблем.
0.0.0.0означает "все IP-адреса" - это мета-адрес (то есть адрес-заполнитель).127.0.0.1- это зарезервированный адрес, который всегда указывает на локальный компьютер. Именно поэтому его называют "localhost". Он доступен только для процессов, работающих в одной системе.обычно сервер переднего плана (#1 в списке выше) прослушивает общедоступный IP-адрес. Ты должен явно привязать сервер к один IP-адрес.
однако, если по какой-то причине вы находитесь на DHCP или не знаете, какой IP-адрес будет (например, его недавно подготовленная система), вы можете сказать nginx / apache / любой другой процесс для привязки к
0.0.0.0. это должно быть временная остановка временная мера.для производственных серверов у вас будет статический IP. Если у вас есть динамический IP (DHCP), то вы можете оставить в
0.0.0.0. Однако очень редко у вас будет DHCP для ваших производственных машин.привязка gunicorn/uwsgi к этому адресу не рекомендуется в производстве. Если вы привязываете свой бэкэнд-процесс (gunicorn / uwsgi) to
0.0.0.0, он может стать доступным "напрямую", минуя ваш интерфейсный прокси (nginx/apache/etc); кто-то может просто запроситьhttp://your.public.ip.address:9000/и получить доступ к приложению напрямую особенно если ваш сервер переднего плана (nginx) и ваш внутренний процесс (django/uwsgi/gevent) работают на одной машине.вы можете сделать это, если вы не хотите иметь хлопот с запуском прокси-сервера переднего плана, хотя.
какова логика конфигурационного файла nginx? Есть так много учебники, использующие совершенно разные файлы конфигурации, которые я путают, на какой лучше. Например, некоторые люди используют "псевдоним /path/to/static /folder" и другие "root/path/to/static / folder". Возможно, вы можете поделиться своим предпочтительным файлом конфигурации.
Первое, что вы должны знать о nginx является то, что это не сервер как Apache или IIS. Это прокси-сервер. Так вы увидите разные термины, такие как "вверх по течению"/ "вниз по течению" и несколько "серверов". Потратьте некоторое время и сначала просмотрите руководство nginx.
есть много различных способов настроить nginx; но вот один ответ на ваш вопрос о
aliasиroot.rootявляется явной директивой, которая связывает корень документа ("домашний каталог") nginx. Это каталог, который он будет смотреть, когда вы даете запрос Без пути, какhttp://www.example.com/
aliasозначает "сопоставить имя с каталогом". Каталоги с псевдонимами не может быть подкаталог корня документа.почему мы создаем символическую ссылку между сайтами-доступными и сайтами-включенными в / etc / nginx?
это что-то уникальное для debian (и debian-подобных систем, таких как ubuntu).
sites-availableсписок файлов конфигурации для всех виртуальных хостов / сайтов в системе. Символическая ссылка отsites-enabledtosites-available"активирует" этот сайт или виртуальный хост. Это способ разделить файлы конфигурации и легко включить/выключить хозяев.
я не гуру развертывания, но поделюсь некоторыми из моих практик для развертывания Django с gevent (должен быть похож на gunicorn).
virtualenvотлично подходит по причинам, которые я не буду вдаваться. Однако я нашелvirtualenv-wrapper( docs) очень полезно, особенно когда вы работаете над многими проектами, так как позволяет легко переключаться между различными virtualenvs. Это действительно не относится к среде развертывания, однако, когда мне нужно устранить неполадки на сервер, использующий SSH, я нашел это очень полезным. Еще одним преимуществом его использования является то, что он управляет каталогом virtualenv, поэтому для вас меньше ручной работы. Virtualenvs предназначены для одноразового использования, так что в случае возникновения проблем с версией или любых других проблем с установкой вы можете просто сбросить env и создать новый. В результате рекомендуется не включать в virtualenv какой-либо код проекта. Его следует держать отдельно.что касается настройки нескольких сайтов,
virtualenvэто в значительной степени ответ. Вы должны иметь отдельный virutalenv для каждого проекта. Только это может решить многие проблемы. Затем при развертывании другой процесс Python будет запускать разные сайты, что позволит избежать возможных конфликтов между развертываниями. Один инструмент, который я особенно нашел очень полезным в управлении несколькими сайтами на одном сервере, - этоsupervisor( docs). Он обеспечивает простой интерфейс для запуска, остановки и перезапуска различных экземпляров Django. Он также способен автоматического перезапуска процесса при его сбое или при запуске компьютера. Так, например, если возникает какое-то исключение и ничего не ловит его, весь веб-сайт может пойти вниз. Супервизор поймает это и автоматически перезапустит экземпляр Django. Ниже приведен пример конфигурации программы супервизора (один процесс):[program:foo] command=/path/toviertualenv/bin/python deploy.py directory=/path/where/deploy.py/is/located/ autostart=true autorestart=true redirect_stderr=True user=wwwдля Nginx, я знаю, что это может быть подавляющим в первую очередь. Я обнаружил, что nginx книги очень полезно. Это объясняет все основные nginx директивы.
в моей установке nginx я нашел, что лучшей практикой является установка только основных конфигураций в
nginx.confфайл, а затем у меня есть отдельная папкаsitesгде я храню конфигурации nginx для каждого из сайтов, которые я размещаю. Затем я просто включаю все файлы из этой папки в основной конфигурационный файл. Я использую директивуinclude sites/+*.conf;. Таким образом, он включает в себя только файлы, начинающиеся с+символ . Таким образом, просто по имени файла я могу контролировать, какая конфигурация файлы должны быть загружены. Поэтому, если я хочу отключить определенный сайт, мне просто нужно переименовать файл конфигурации и перезапустить nginx. Не совсем уверен, что вы имели в виду под" символической ссылкой между сайтами-доступными и сайтами-включенными в /etc/nginx " в вашем вопросе, поскольку это папки с именами Apache, но они выполняют аналогичную задачу, как
ну, насколько наилучшей практики, которые вы задали в своем вопросе, я не могу поделиться инструментом, который творил чудеса для меня! Я сам раньше путался в нескольких конфигурационных файлах gunicorn, nginx, supervisorD для нескольких сайтов! Но я жаждал как-то автоматизировать весь процесс, чтобы я мог вносить изменения в свое приложение/сайт и мгновенно развертывать его. Его зовут Джанго-фагунгис. Вы можете найти подробную информацию о моем опыте с Развертывание Django автоматизация здесь. Я только что настроил a fabfile.py однажды (django-fagungis использует fabric для автоматизации всего процесса и делает virtualenv на вашем удаленном сервере, который очень удобно для управления зависимостями нескольких сайтов, размещенных на одном сервере. Он использует nginx, gunicorn и supervisorD для обработки развертывания проекта/сайта Django) и django-fagungis клонирует мой последний проект из bitbucket (который я использую для subversioning) и развертывает его на моем удаленном сервере, и у меня просто есть ввести три команды на оболочке моей локальной машины и что это!! Для меня это оказалось лучшей и беспроблемной практикой для развертывания Django.
проверьте это для минимальной конфигурации gunicorn и nginx, необходимой для проекта Django. http://agiliq.com/blog/2013/08/minimal-nginx-and-gunicorn-configuration-for-djang/
Comments