Поиск по сайту:

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


Введение

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

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

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

Чтобы выполнить это руководство, у вас должен быть новый экземпляр сервера Ubuntu 14.04 с пользователем без полномочий root с настроенными привилегиями sudo. Вы можете узнать, как это настроить, изучив наше руководство по начальной настройке сервера.

Мы будем устанавливать 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 в каждую и запустим два проекта.

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

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

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

mkvirtualenv firstsite

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

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

pip install django

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

cd ~
django-admin.py startproject firstsite

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

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

cd ~/firstsite

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

./manage.py migrate

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

./manage.py createsuperuser

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

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

nano firstsite/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://server_domain_or_IP:8080

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

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

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

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

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

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

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

cd ~
mkvirtualenv secondsite
pip install django

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

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

django-admin.py startproject secondsite
cd ~/secondsite

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

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

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

nano secondsite/settings.py

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

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

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

./manage.py collectstatic

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

./manage.py runserver 0.0.0.0:8080

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

http://server_domain_or_IP:8080

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

http://server_domain_or_IP:8080/admin

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

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

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

deactivate

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

workon firstsite

Или:

workon secondsite

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

deactivate

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

Теперь, когда у нас настроены и готовы к работе два проекта Django, мы можем настроить uWSGI. uWSGI — это сервер приложений, который может взаимодействовать с приложениями через стандартный интерфейс, называемый WSGI. Чтобы узнать больше об этом, прочитайте этот раздел нашего руководства по настройке 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/user/Env/firstsite --chdir /home/user/firstsite -w firstsite.wsgi

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

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

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

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

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

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

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

sudo nano firstsite.ini

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

[uwsgi]
project = firstsite
base = /home/user

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

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

[uwsgi]
project = firstsite
base = /home/user

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

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

[uwsgi]
project = firstsite
base = /home/user

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, так что это наш лучший выбор.

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

[uwsgi]
project = firstsite
base = /home/user

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/firstsite.ini /etc/uwsgi/sites/secondsite.ini

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

sudo nano /etc/uwsgi/sites/secondsite.ini

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

[uwsgi]
project = secondsite
base = /home/user

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 user
setgid www-data

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

description "uWSGI application server in Emperor mode"

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

setuid user
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/firstsite

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

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

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

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

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

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

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

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

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

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

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

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

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

sudo nano /etc/nginx/sites-available/secondsite

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

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

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

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

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

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

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

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

sudo service nginx configtest

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

sudo service nginx restart

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

sudo service uwsgi start

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

Заключение

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

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