Меню Рубрики

Установка django debian nginx

Установка и настройка Django, Nginx через FastCGI (flup) в Debian / Ubuntu

debian

django

fastcgi

nginx

python

ubuntu

Django (Джанго) — это динамично развивающийся web фреймворк с открытым исходным кодом, реализованный на языке Python. Рекомендуемым способом установки Django является связка Apache + mod_wsgi. Как это делается уже рассказывалось ранее в статье «Установка и настройка Apache, mod_wsgi, Django, MySQL».

Однако, всем известно, насколько Apache может быть «тяжелым» для сервера, особенно для статического контента. Поэтому, если нет желания, ставить связку Apache+Nginx, для проектов на Django можно обойтись только одним сервером Nginx. Запуск можно выполнять через FastCGI.

Установка Django, Nginx, Flup

Установка последней стабильной версии Django

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

Далее, необходимо узнать, в какую директорию необходимо устанавливать пакеты, чтобы Python узнал об этом. Для этого необходимо выполнить:

В данном случае, видно что основной версией является Python 2.5 и все дополнительные пакеты устанавливаются в директорию «/usr/lib/python2.5/site-packages».

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

И в конце, чтобы сделать команду django-admin.py доступной из любой директории системы, необходимо добавить еще одну символическую ссылку:

Чтобы убедиться, что Django нормально установлен, необходимо запустить интерпретатор Python и импортировать модуль django:

Все в порядке. Последняя версия Django корректно установлена.

Установка Nginx, flup

Чтобы иметь возможность запускать Django через FastCGI необходимо установить пакет flup, который представляет из себя python-библиотеку для работы с FastCGI. Итак, ставим nginx, flup:

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

Первым делом создается сам Django-проект, после чего в него добавляются некоторые вспомогательные директории:

Корректировка настроек проекта

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

Создание пользователя для проекта

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

Расстановка прав на директории

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

Настройка и запуск Django под Nginx через FastCGI

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

Кроме сокета, возможен вариант взаимодействия между Nginx и Django через http, но он проще в настройке чем вариант с сокетами, и как правило используется в ситуациях, когда сервера разнесены по разным машинам.

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

Настройка виртуального хоста в Nginx

Первым делом, необходимо убедиться, что есть конфигурационный файл для передачи FastCGI параметров. Файл /etc/nginx/fastcgi_params должен иметь следующий вид:

Далее, следует добавить файл настройки виртуального хоста:

И добавить следующий текст:

Далее, необходимо включить хост:

Чтобы новый хост заработал, необходимо перестартовать nginx:

Запуск Django FastCGI сервера

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

Сервер запускается следующей коммандой:

Все параметры при запуске очевидны. Необходимо лишь отметить «umask=007» выставляется он для того, чтобы право на работу с сокетом имели только владелец и группа сокета. В данном случае, это, соответственно, пользователь dw и группа www-data.

Останов Django FastCGI сервера

Сервер останавливается следующей коммандой:

источник

Предложение от 8host.com

Обслуживание приложений Django с помощью uWSGI и Nginx в Debian 8

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

Данное руководство поможет установить и настроить в Debian 8 все компоненты, необходимые для поддержки приложения и обработки клиентских запросов. Для этого будет использоваться сервер приложений uWSGI и обратный прокси-сервер Nginx.

Требования

Для выполнения данного руководства нужно предварительно настроить сервер Debian 8 и создать пользователя с доступом к sudo. Подробные инструкции по начальной настройке сервера и созданию пользователей можно найти здесь.

Читайте также:  Установка птф от приоры на газ 3110

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

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

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

Проекты Django будут установлены в индивидуальное виртуальное окружение. Для этого нужно установить инструменты virtualenv (создаёт виртуальную среду Python) и virtualenvwrapper (добавляет несколько полезных функций virtualenv).

Для установки инструментов используйте pip, пакетный менеджер Python. Установить pip можно из официального репозитория Debian.

# Python 2:
sudo apt-get update
sudo apt-get install python-pip
# Python 3:
sudo apt-get update
sudo apt-get install python3-pip

Теперь выполните глобальную установку virtualenv и virtualenvwrapper.

# Python 2:
sudo pip install virtualenv virtualenvwrapper
# Python 3:
sudo pip3 install virtualenv virtualenvwrapper

Теперь можно настроить оболочку с помощью сценария virtualenvwrapper. Все виртуальные окружения будут помещены в каталог Env в домашнем каталоге. Чтобы настроить это, используется переменная WORKON_HOME. Добавьте её в сценарий инициализации оболочки.

Примечание: При использовании Python 3 и pip3 нужно добавить дополнительную строку в сценарий инициализации.

echo «export VIRTUALENVWRAPPER_PYTHON=/usr/bin/python3» >>

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

/.bashrc
echo «source /usr/local/bin/virtualenvwrapper.sh» >>

Чтобы иметь доступ к новым функциям в текущей сессии, выполните команду:

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

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

Теперь нужно создать два виртуальных окружения и запустить два проекта.

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

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

Чтобы создать первое виртуальное окружение, введите:

Эта команда создаст виртуальное окружение по имени firstsite, а также установит локальную версию Python и pip, которые можно использовать для создания изолированной среды разработки проекта. Командная строка изменится, указывая, что текущей средой является виртуальная среда Python:

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

Сначала нужно установить Django:

Теперь создайте первый тестовый проект:

django-admin.py startproject firstsite

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

Откройте каталог первого уровня:

Для начала нужно переместить БД, чтобы инициализировать базу данных SQLite для проекта.

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

Теперь в домашнем каталоге есть файл БД по имени db.sqlite3. Создайте администратора.

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

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

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

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

. . .
# самый простой список IP-адресов и доменов сервера Django
# ALLOWED_HOSTS = [ ‘example.com’, ‘203.0.113.5’]
# Чтобы добавить в список поддомены домена example.com, поставьте точку в начале домена
# ALLOWED_HOSTS = [‘.example.com’, ‘203.0.113.5’]
ALLOWED_HOSTS = [‘your_server_domain_or_IP’, ‘second_domain_or_IP’, . . .]

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

. . .
STATIC_URL = ‘/static/’
STATIC_ROOT = os.path.join(BASE_DIR, ‘static/’)

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

В каталоге проекта появится новый каталог static.

Чтобы получить доступ к серверу разработки Django, нужно отредактировать настройки брандмауэра. Откройте порт 8080:

# ufw
sudo ufw allow 8080
# iptables
sudo iptables -I INPUT -p tcp —dport 8080 -j ACCEPT

Теперь протестируйте проект, временно запустив сервер разработки.

./manage.py runserver 0.0.0.0:8080

Читайте также:  Установка пластикового плинтуса с помощью клея

Это запустит сервер разработки на порт 8080. В браузере посетите свой домен или IP:

На экране должна появиться такая страница:

It worked!
Congratulations on your first Django-powered page. [. ]

Добавьте в ссылку сегмент /admin, чтобы получить доступ к форме аутентификации администратора. Введите учётные данные администратора, и на экране появится панель управления.

После этого можно остановить сервер разработки. Нажмите CTRL-C в терминале. Теперь можно приступать к разработке второго проекта.

Разработка второго проекта

Второй проект создаётся точно так же, как первый.

Вернитесь в домашний каталог и создайте второе виртуальное окружение. Установите Django.

mkvirtualenv secondsite
pip install django

После этого откроется окружение нового проекта.

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

django-admin.py startproject secondsite
cd

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

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

Добавьте белый список второго пректа с помощью ALLOWED_HOSTS:

ALLOWED_HOSTS = [‘second_project_domain_or_IP’, ‘another_domain_or_IP’, . . .]

Затем укажите каталог статических файлов:

. . .
STATIC_URL = ‘/static/’
STATIC_ROOT = os.path.join(BASE_DIR, ‘static/’)

Сохраните и закройте файл.

Соберите статические файлы в этот каталог.

Запустите сервер разработки:

./manage.py runserver 0.0.0.0:8080

Сайт будет доступен по ссылке:

Чтобы остановить сервер, нажмите CTRL-C.

Отключение виртуального окружения

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

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

workon firstsite
# или
workon secondsite

В дальнейшей работе виртуальное окружение не нужно, потому отключите его.

Сервер приложений uWSGI

Теперь нужно настроить uWSGI – сервер приложений, взаимодействующий с приложениями с помощью простого интерфейса WSGI.

Установка uWSGI

В данном руководстве нужно установить uWSGI глобально – так будет проще обрабатывать несколько проектов Django.

Установите зависимости сервера:

# Python 2:
sudo apt-get install python-dev
# Python 3:
sudo apt-get install python3-dev

# Python 2:
sudo pip install uwsgi
# Python 3:
sudo pip3 install uwsgi

Чтобы быстро протестировать сервер, передайте ему данные одного из сайтов. Например, можно попробовать обслужить первый проект:

uwsgi —http :8080 —home /home/8host/Env/firstsite —chdir /home/8host/firstsite -w firstsite.wsgi

Теперь uWSGI использует виртуальное окружение каталога

/Env, чтобы получить доступ к каталогу проекта и использовать файл wsgi.py для обслуживания проекта. Сервер обслуживает HTTP на порте 8080. Откройте доменное имя или IP-адрес сервера в браузере, укажите порт 8080 (статические элементы интерфейса, как CSS, например, не будут работать).чтобы остановить сервер, нажмите CTRL-C.

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

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

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

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

Теперь нужно создать конфигурационный файл для каждого проекта. uWSGI может читать конфигурации разных форматов. В данном руководстве используется формат ini.

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

Добавьте заголовок [uwsgi], под которым нужно поместить все настройки. Добавьте несколько переменных, чтобы сделать файл более универсальным. Сразу после заголовка добавьте переменную project с именем проекта. Переменная uid будет хранить имя пользователя с доступом к sudo.

Затем добавьте переменную base, в которой нужно указать путь к домашнему каталогу. Для этого используется синтаксис: %(переменная).

[uwsgi]
project = firstsite
u > base = /home/%(uid)

Теперь нужно настроить uWSGI для поддержки проекта. Добавьте опцию chdir, чтобы указать корневой каталог проекта. Импортируйте callable application из файла wsgi.py в каталоге проекта.

[uwsgi]
project = firstsite
u > base = /home/%(uid)
chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application

Создайте главный процесс с 5 рабочими процессами.

[uwsgi]
project = firstsite
u > base = /home/%(uid)
chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application
master = true
processes = 5

Теперь нужно настроить прослушивание соединений. Ранее для тестирования uWSGI использовались HTTP и сетевой порт, но есть варианты и получше. Например, вместо порта можно использовать сокет. Этот вариант безопаснее и обеспечивает более высокую производительность. Сокеты используют не HTTP, а uwsgi – быстрый бинарный протокол для взаимодействия uWSGI с другими серверами. Nginx имеет встроенную поддержку uwsgi при проксировании.

Также следует изменить права на сокет. Опция vacuum автоматически очистит файл сокета после остановки сервиса.

[uwsgi]
project = firstsite
u > base = /home/%(uid)
chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application
master = true
processes = 5
socket = /run/uwsgi/%(project).sock
chown-socket = %(uid):www-data
chmod-socket = 660
vacuum = true

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

Читайте также:  Установка и настройка гбо ловат

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

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

Откройте скопированный файл:

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

В файле нужно изменить только переменную project.

[uwsgi]
project = secondsite
u > base = /home/%(uid)
chdir = %(base)/%(project)
home = %(base)/Env/%(project)
module = %(project).wsgi:application
master = true
processes = 5
socket = /run/uwsgi/%(project).sock
chown-socket = %(uid):www-data
chmod-socket = 660
vacuum = true

Сохраните и закройте файл.

Unit-файл для uWSGI

Django-проекты обслуживаются сервером приложений. Теперь нужно автоматизировать этот процесс. Для этого создайте unit-файл.

sudo nano /etc/systemd/system/uwsgi.service

Файл начинается с раздела [Unit], в котором хранятся метаданные и другая информация о сервисе (например, его описание).

[Unit]
Description=uWSGI Emperor service

Затем добавьте раздел [Service]. Директива ExecStartPre запускает указанные в ней компоненты. В данном случае она создаст каталог /run/uwsgi, принадлежащий текущему пользователю и группе www-data.

Директива ExecStart запускает сервис, в данном случае uwsgi в режиме Emperor mode. Также нужно добавить компоненты, необходимые для поддержки процесса system. Больше настроек можно найти в документации uWSGI.

[Unit]
Description=uWSGI Emperor service
[Service]
ExecStartPre=/bin/bash -c ‘mkdir -p /run/uwsgi; chown 8host:www-data /run/uwsgi’
ExecStart=/usr/local/bin/uwsgi —emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all

Теперь осталось добавить раздел [Install]. Он отвечает за автоматический запуск сервиса. Настройте сервис для работы в многопользовательской системе.

[Unit]
Description=uWSGI Emperor service
[Service]
ExecStartPre=/bin/bash -c ‘mkdir -p /run/uwsgi; chown 8host:www-data /run/uwsgi’
ExecStart=/usr/local/bin/uwsgi —emperor /etc/uwsgi/sites
Restart=always
KillSignal=SIGQUIT
Type=notify
NotifyAccess=all
[Install]
WantedBy=multi-user.target

Сохраните и закройте файл.

Пока что запустить этот сервис невозможно, поскольку он зависит от пользователя www-data. Сервис будет доступен после установки и настройки Nginx.

Nginx как обратный прокси-сервер

Загрузите пакет Nginx из стандартного репозитория Debian.

sudo apt-get install nginx

После установки Nginx создайте виртуальный хост (блок server) для каждого проекта.

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

Теперь у вас есть конфигурационный файл для первого проекта.

Чтобы указать домен первого проекта, добавьте в файл такой код:

server <
listen 80;
server_name firstsite.com www.firstsite.com;
>

Укажите местонахождение статических файлов.

server <
listen 80;
server_name firstsite.com www.firstsite.com;
location = /favicon.ico < access_log off; log_not_found off; >
location /static/ <
root /home/8host/firstsite;
>
>

Добавьте блок location для обслуживания всех остальных запросов. Добавьте параметры uwsgi из файла /etc/nginx/uwsgi_params и передайте трафик на сокет:

server <
listen 80;
server_name firstsite.com www.firstsite.com;
location = /favicon.ico < access_log off; log_not_found off; >
location /static/ <
root /home/8host/firstsite;
>
location / <
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/firstsite.sock;
>
>

Сохраните виртуальный хост.

Используйте этот файл как шаблон для виртуального хоста второго проекта.

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/8host/secondsite;
>
location / <
include uwsgi_params;
uwsgi_pass unix:/run/uwsgi/secondsite.sock;
>
>

Сохраните и закройте файл.

Создайте ссылки на новые конфигурационные файлы в каталоге sites-enabled.

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 nginx –t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если ошибок нет, перезапустите сервис Nginx:

sudo systemctl restart nginx

Теперь можно запустить сервер приложений uWSGI.

sudo systemctl start uwsgi

Удалите правило UFW для порта 8080 и разблокируйте доступ к серверу Nginx.

# ufw
sudo ufw delete allow 8080
sudo ufw allow ‘Nginx Full’
# iptables
sudo iptables -D INPUT -p tcp —dport 8080 -j ACCEPT
sudo iptables -I INPUT -p tcp —dport 80 -j ACCEPT

Теперь оба проекта доступны по доменным именам. Проверьте работу проектов и интерфейсов. Если всё работает должным образом, настройте автозапуск сервисов:

sudo systemctl enable nginx
sudo systemctl enable uwsgi

Примечание: После настройки обратного прокси-сервера Nginx настоятельно рекомендуется защитить подключения при помощи сертификатов SSL/TLS. В противном случае все данные будут передаваться в виде простого текста и легко могут быть перехвачены злоумышленниками. Сервис Let’s Encrypt позволяет получить бесплатный сертификат. Подробнее об этом – здесь.

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

Заключение

Теперь сервер приложений uWSGI обслуживает два приложения Django, которые находятся в индивидуальных виртуальных окружениях.

источник