Как обслуживать приложения Django с помощью uWSGI и Nginx в Ubuntu 14.04

Вступление

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

В этом руководстве мы продемонстрируем, как установить и настроить некоторые компоненты в Ubuntu 14.04 для поддержки и обслуживания приложений Django. Мы настроим сервер-контейнер приложений uWSGI для взаимодействия с нашими приложениями. Затем мы настроим Nginx для обращения прокси к uWSGI, предоставляя нам доступ к его функциям безопасности и производительности для обслуживания наших приложений.

Предпосылки и цели

Чтобы выполнить это руководство, у вас должен быть новый экземпляр сервера Ubuntu 14.04 с пользователем без полномочий root с настроенными привилегиями + sudo +. Вы можете узнать, как это настроить, запустив наше https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-14-04 руководство по настройке начального сервера].

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

Как только у нас появятся наши приложения, мы установим и настроим сервер приложений uWSGI. Это будет служить интерфейсом для наших приложений, которые будут транслировать клиентские запросы, используя HTTP-запросы на Python, которые наше приложение может обрабатывать. Затем мы настроим Nginx перед uWSGI, чтобы воспользоваться его высокопроизводительными механизмами обработки соединений и простыми в реализации функциями безопасности.

Давайте начнем.

Установите и настройте VirtualEnv и VirtualEnvWrapper

Мы будем устанавливать наши проекты Django в их собственных виртуальных средах, чтобы изолировать требования для каждого из них. Для этого мы будем устанавливать + virtualenv +, который может создавать виртуальные среды Python, и + virtualenvwrapper +, который добавляет некоторые улучшения удобства использования в рабочий процесс + virtualenv +.

Мы будем устанавливать оба этих компонента, используя + pip +, менеджер пакетов Python. Это можно получить из репозиториев Ubuntu:

sudo apt-get update
sudo apt-get install python-pip

В этом руководстве мы используем Python версии 2. Если ваш код использует Python 3, вы можете установить пакет + python3-pip +. Затем вам придется заменить команды + pip + в этом руководстве командой + pip3 + при работе вне виртуальной среды.

Теперь, когда у вас установлено + pip +, мы можем установить + virtualenv + и + virtualenvwrapper + глобально, набрав:

sudo pip install virtualenv virtualenvwrapper

Установив эти компоненты, мы теперь можем сконфигурировать нашу оболочку, используя информацию, необходимую для работы со скриптом + virtualenvwrapper +. Все наши виртуальные среды будут помещены в каталог в нашей домашней папке с именем + Env + для легкого доступа. Это настраивается с помощью переменной среды + WORKON_HOME +. Мы можем добавить это к нашему сценарию инициализации оболочки и можем создать сценарий оболочки виртуальной среды.

Если вы используете Python 3 и команду + pip3 +, вам также необходимо добавить дополнительную строку в скрипт инициализации оболочки:

echo "export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3" >> ~/.bashrc

Независимо от того, какую версию Python вы используете, вам нужно выполнить следующие команды:

echo "export WORKON_HOME=~/Env" >> ~/.bashrc
echo "source /usr/local/bin/virtualenvwrapper.sh" >> ~/.bashrc

Теперь создайте сценарий инициализации оболочки, чтобы использовать эту функцию в текущем сеансе:

source ~/.bashrc

Теперь у вас должен быть каталог с именем + Env + в вашей домашней папке, в котором будет храниться информация о виртуальной среде.

Создание проектов Django

Теперь, когда у нас есть инструменты для виртуальной среды, мы создадим две виртуальные среды, установим Django в каждой и запустим два проекта.

Создать первый проект

Мы можем легко создать виртуальную среду, используя некоторые команды, которые нам предоставляет скрипт + virtualenvwrapper +.

Создайте свою первую виртуальную среду с именем вашего первого сайта или проекта, набрав:

mkvirtualenv

Это создаст виртуальную среду, установит Python и + pip + внутри нее, и активирует среду. Ваше приглашение изменится, чтобы указать, что вы сейчас работаете в новой виртуальной среде. Это будет выглядеть примерно так: + () @: ~ $ +. Значение в скобках - это имя вашей виртуальной среды. Любое программное обеспечение, установленное через + pip +, теперь будет установлено в виртуальной среде, а не в глобальной системе. Это позволяет нам изолировать наши пакеты для каждого проекта.

Нашим первым шагом будет установка самого Django. Мы можем использовать + pip для этого без` + sudo`, так как мы устанавливаем это локально в нашей виртуальной среде:

pip install django

С установленным Django мы можем создать наш первый пример проекта, набрав:

cd ~
django-admin.py startproject

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

Перейдите в каталог первого уровня, чтобы мы могли начать устанавливать минимальные требования для нашего примера проекта.

cd ~/

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

./manage.py migrate

Теперь у вас должен быть файл базы данных с именем + db.sqlite3 + в каталоге вашего проекта. Теперь мы можем создать административного пользователя, набрав:

./manage.py createsuperuser

Вам нужно будет выбрать имя пользователя, указать контактный адрес электронной почты, а затем выбрать и подтвердить пароль.

Затем откройте файл настроек проекта в текстовом редакторе:

nano /settings.py

Поскольку мы будем настраивать Nginx для обслуживания нашего сайта, нам необходимо настроить каталог, в котором будут храниться статические ресурсы нашего сайта. Это позволит Nginx обслуживать их напрямую, что положительно скажется на производительности. Мы скажем Django поместить их в каталог с именем + static + в базовом каталоге нашего проекта. Добавьте эту строку в конец файла, чтобы настроить это поведение:

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

Сохраните и закройте файл, когда вы закончите. Теперь соберите статические элементы нашего сайта и поместите их в этот каталог, набрав:

./manage.py collectstatic

Вы можете ввести «да», чтобы подтвердить действие и собрать статический контент. В вашем проекте появится новый каталог с именем + static +.

Со всем этим мы можем протестировать наш проект, временно запустив сервер разработки. Тип:

./manage.py runserver 0.0.0.0:8080

Это запустит сервер разработки на порт + 8080 +. Посетите доменное имя или IP-адрес вашего сервера, а затем в браузере + 8080 +:

http://:8080

Вы должны увидеть страницу, которая выглядит следующим образом:

изображение: https: //assets.digitalocean.com/articles/django_uwsgi_nginx_1404/sample_site.png [пример сайта Django]

Добавьте + / admin + в конец URL-адреса в адресной строке браузера, и вы попадете на страницу входа администратора:

изображение: https: //assets.digitalocean.com/articles/django_uwsgi_nginx_1404/admin_login.png [логин администратора Django]

Используя учетные данные администратора, которые вы выбрали с помощью команды + createuperuser +, войдите на сервер. После этого вы получите доступ к интерфейсу администрирования:

изображение: https: //assets.digitalocean.com/articles/django_uwsgi_nginx_1404/admin_interface.png [интерфейс администратора Django]

После тестирования этой функции остановите сервер разработки, введя CTRL-C в своем терминале. Теперь мы можем перейти к нашему второму проекту.

Создать второй проект

Второй проект будет создан точно так же, как и первый. Мы сократим объяснение в этом разделе, увидев, как вы уже завершили это один раз.

Вернитесь в свой домашний каталог и создайте вторую виртуальную среду для вашего нового проекта. Установите Django внутри этой новой среды после ее активации:

cd ~
mkvirtualenv
pip install django

Новая среда будет создана и изменена на, оставив предыдущую виртуальную среду. Этот экземпляр Django полностью отделен от другого, который вы настроили. Это позволяет вам управлять ими независимо и настраивать по мере необходимости.

Создайте второй проект и перейдите в каталог проекта:

django-admin.py startproject
cd ~/

Инициализируйте базу данных и создайте пользователя с правами администратора:

./manage.py migrate
./manage.py createsuperuser

Откройте файл настроек:

nano /settings.py

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

STATIC_ROOT = os.path.join(BASE_DIR, "static/")

Сохраните и закройте файл. Теперь соберите статические элементы в этот каталог, набрав:

./manage.py collectstatic

Наконец, запустите сервер разработки, чтобы протестировать сайт:

./manage.py runserver 0.0.0.0:8080

Вы должны проверить обычный сайт по адресу:

http://:8080

Также войдите на сайт администратора:

http://:8080/admin

Когда вы подтвердите, что все работает должным образом, введите CTRL-C в своем терминале, чтобы остановить сервер разработки.

Отказ от виртуальной среды

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

deactivate

Если вам снова понадобится работать на любом из ваших сайтов Django, вам следует активировать соответствующие среды. Вы можете сделать это используя команду + workon +:

workon

Or:

workon

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

deactivate

Настройка сервера приложений uWSGI

Теперь, когда у нас есть два готовых к работе проекта Django, мы можем настроить uWSGI. uWSGI - это сервер приложений, который может взаимодействовать с приложениями через стандартный интерфейс WSGI. Чтобы узнать больше об этом, прочитайте https://www.digitalocean.com/community/tutorials/how-to-set-up-uwsgi-and-nginx-to-serve-python-apps-on-ubuntu-14-04 # определения и понятия [этот раздел] нашего руководства по настройке uWSGI и Nginx в Ubuntu 14.04.

Установка uWSGI

В отличие от руководства, указанного выше, в этом руководстве мы будем устанавливать uWSGI по всему миру. Это создаст меньше трения при работе с несколькими проектами Django. Прежде чем мы сможем установить uWSGI, нам нужны файлы разработки Python, на которые опирается программное обеспечение. Мы можем установить это прямо из репозиториев Ubuntu:

sudo apt-get install python-dev

Теперь, когда файлы разработки доступны, мы можем установить uWSGI глобально через + pip +, набрав:

sudo pip install uwsgi

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

uwsgi --http :8080 --home /home//Env/ --chdir /home// -w .wsgi

Здесь мы сказали uWSGI использовать нашу виртуальную среду, расположенную в каталоге + ~ / Env +, перейти в каталог нашего проекта и использовать файл + wsgi.py +, хранящийся в нашем внутреннем каталоге ++ обслуживать файл. Для демонстрации мы сказали, чтобы он служил HTTP на порту + 8080 +. Если вы перейдете к доменному имени или IP-адресу сервера в своем браузере, после чего добавится +: 8080 +, вы снова увидите свой сайт (статические элементы в интерфейсе + / admin + еще не будут работать). Когда вы закончите тестирование этой функции, введите CTRL-C в терминале.

Создание файлов конфигурации

Запуск uWSGI из командной строки полезен для тестирования, но не особенно полезен для реального развертывания. Вместо этого мы будем запускать uWSGI в «режиме Emperor», который позволяет главному процессу автоматически управлять отдельными приложениями с помощью набора файлов конфигурации.

Создайте каталог, в котором будут храниться ваши файлы конфигурации. Поскольку это глобальный процесс, мы создадим каталог с именем + / etc / uwsgi / sites для хранения ваших файлов конфигурации. Перейдите в каталог после его создания:

sudo mkdir -p /etc/uwsgi/sites
cd /etc/uwsgi/sites

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

Создайте файл для вашего первого проекта и откройте его в текстовом редакторе:

sudo nano .ini

Внутри мы должны начать с заголовка раздела + [uwsgi] +. Вся наша информация будет идти под этим заголовком. Мы также собираемся использовать переменные, чтобы сделать наш файл конфигурации более пригодным для повторного использования. После заголовка установите переменную с именем + project + с именем вашего первого проекта. Добавьте переменную под названием + base + с путем к домашней директории вашего пользователя:

[uwsgi]
project =
base = /home/

Далее нам нужно настроить uWSGI, чтобы он правильно обрабатывал наш проект. Нам нужно перейти в корневую директорию проекта, установив опцию + chdir +. Мы можем объединить настройки домашнего каталога и имени проекта, которые мы установили ранее, используя синтаксис +% () +. Это будет заменено значением переменной при чтении конфигурации.

Аналогичным образом мы укажем виртуальную среду для нашего проекта. Установив модуль, мы можем точно указать, как взаимодействовать с нашим проектом (импортируя вызываемое «приложение» из файла + wsgi.py + в каталоге нашего проекта). Конфигурация этих элементов будет выглядеть так:

[uwsgi]
project =
base = /home/

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

Мы хотим создать мастер-процесс с 5 работниками. Мы можем сделать это, добавив это:

[uwsgi]
project =
base = /home/

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

master = true
processes = 5

Далее нам нужно указать, как uWSGI должен прослушивать соединения. В нашем тесте uWSGI мы использовали HTTP и сетевой порт. Однако, поскольку мы собираемся использовать Nginx в качестве обратного прокси-сервера, у нас есть лучшие варианты.

Вместо использования сетевого порта, поскольку все компоненты работают на одном сервере, мы можем использовать сокет Unix. Это более безопасно и обеспечивает лучшую производительность. Этот сокет не будет использовать HTTP, но вместо этого будет реализован протокол uWSGI + uwsgi +, который является быстрым двоичным протоколом, предназначенным для связи с другими серверами. Nginx может прокси-сервер, используя протокол + uwsgi +, так что это наш лучший выбор.

Мы также изменим разрешения сокета, потому что мы будем предоставлять веб-серверу доступ для записи. Мы установим опцию + вакуум +, чтобы файл сокета автоматически очищался при остановке службы:

[uwsgi]
project =
base = /home/

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

master = true
processes = 5

socket = %(base)/%(project)/%(project).sock
chmod-socket = 664
vacuum = true

На этом настройка нашего первого проекта uWSGI завершена. Сохраните и закройте файл.

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

sudo cp /etc/uwsgi/sites/.ini /etc/uwsgi/sites/.ini

Откройте второй файл конфигурации в текстовом редакторе:

sudo nano /etc/uwsgi/sites/.ini

Нам нужно всего лишь изменить одно значение в этом файле, чтобы оно работало для нашего второго проекта. Измените переменную + project + именем, которое вы использовали для второго проекта:

[uwsgi]
project =
base = /home/

chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

master = true
processes = 5

socket = %(base)/%(project)/%(project).sock
chmod-socket = 664
vacuum = true

Сохраните и закройте файл, когда вы закончите. Ваш второй проект должен быть готов к работе сейчас.

Создать сценарий Upstart для uWSGI

Теперь у нас есть файлы конфигурации, которые нам нужны для обслуживания наших проектов Django, но мы до сих пор не автоматизировали процесс. Далее мы создадим скрипт Upstart для автоматического запуска uWSGI при загрузке.

Мы создадим скрипт Upstart в каталоге + / etc / init +, где проверяются эти файлы:

sudo nano /etc/init/uwsgi.conf

Начните с задания описания вашей службы uWSGI и указания уровней запуска, на которых она должна автоматически запускаться. Мы настроим наш запуск на уровнях выполнения 2, 3, 4 и 5, которые являются обычными многопользовательскими уровнями выполнения:

description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

Далее нам нужно указать имя пользователя и группу, под которой будет запускаться процесс. Мы запустим процесс под нашим собственным именем пользователя, так как мы владеем всеми файлами. Для группы нам нужно установить ее в группу + www-data, под которой будет работать Nginx. Наши настройки сокетов из файла конфигурации uWSGI должны позволять веб-серверу выполнять запись в сокет. Измените имя пользователя ниже, чтобы оно соответствовало вашему имени пользователя на сервере:

description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

setuid
setgid www-data

Наконец, нам нужно указать фактическую команду для выполнения. Нам нужно запустить uWSGI в режиме Emperor и перейти в каталог, где мы сохранили наши файлы конфигурации. uWSGI будет читать файлы и обслуживать каждый из наших проектов:

description "uWSGI application server in Emperor mode"

start on runlevel [2345]
stop on runlevel [!2345]

setuid
setgid www-data

exec /usr/local/bin/uwsgi --emperor /etc/uwsgi/sites

Когда вы закончите, сохраните и закройте файл. Мы пока не будем запускать uWSGI, так как у нас не будет группы + www-data +, доступной до тех пор, пока мы не установим Nginx.

Установите и настройте Nginx в качестве обратного прокси

Теперь, когда uWSGI настроен и готов к работе, мы можем установить и настроить Nginx в качестве нашего обратного прокси-сервера. Это можно скачать из стандартных репозиториев Ubuntu:

sudo apt-get install nginx

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

sudo nano /etc/nginx/sites-available/

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

server {
   listen 80;
   server_name .com www..com;
}

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

server {
   listen 80;
   server_name .com www..com;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /home//;
   }
}

После этого мы можем использовать директиву + uwsgi_pass для передачи трафика нашему файлу сокета. Файл сокетов, который мы настроили, назывался + .sock + и находился в каталоге нашего проекта. Мы будем использовать директиву + include +, чтобы включить необходимые параметры + uwsgi + для обработки соединения:

server {
   listen 80;
   server_name .com www..com;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /home//;
   }

   location / {
       include         uwsgi_params;
       uwsgi_pass      unix:/home///.sock;
   }
}

Это на самом деле все конфигурации, которые нам нужны. Сохраните и закройте файл, когда вы закончите.

Мы будем использовать это в качестве основы для файла конфигурации Nginx нашего второго проекта. Скопируйте это сейчас:

sudo cp /etc/nginx/sites-available/ /etc/nginx/sites-available/

Откройте новый файл в вашем текстовом редакторе:

sudo nano /etc/nginx/sites-available/

Здесь вам придется изменить любую ссылку на ` со ссылкой на `. Вам также нужно изменить + server_name +, чтобы ваш второй проект отвечал на другое доменное имя. Когда вы закончите, это будет выглядеть примерно так:

server {
   listen 80;
   server_name .com www..com;

   location = /favicon.ico { access_log off; log_not_found off; }
   location /static/ {
       root /home//;
   }

   location / {
       include         uwsgi_params;
       uwsgi_pass      unix:/home///.sock;
   }
}

Сохраните и закройте файл, когда вы закончите.

Затем свяжите оба ваших новых файла конфигурации с каталогом + sites-enabled + в Nginx, чтобы включить их:

sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled
sudo ln -s /etc/nginx/sites-available/ /etc/nginx/sites-enabled

Проверьте синтаксис конфигурации, набрав:

sudo service nginx configtest

Если синтаксические ошибки не обнаружены, вы можете перезапустить службу Nginx для загрузки новой конфигурации:

sudo service nginx restart

Если вы помните, мы никогда не запускали сервер uWSGI. Сделайте это сейчас, набрав:

sudo service uwsgi start

Теперь вы сможете получить доступ к своим двум проектам, перейдя по соответствующим доменным именам. И публичные, и административные интерфейсы должны работать как положено.

Заключение

В этом руководстве мы создали два проекта Django, каждый в своей виртуальной среде. Мы настроили uWSGI для обслуживания каждого проекта независимо, используя виртуальную среду, настроенную для каждого. После этого мы настроили Nginx в качестве обратного прокси-сервера для обработки клиентских подключений и предоставления правильного проекта в зависимости от запроса клиента.

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

Related