- Развертывание Django проекта на сервере NGINX в Linux Ubuntu
- Python, Django и UWSGI
- Настройка Nginx
- Подключение к базе данных
- MariaDB
- Подготовка базы данных
- Установка модуля для Python
- Настройка подключения
- Делаем выборку
- Django на production. uWSGI + nginx. Подробное руководство
- Общая идея
- Перед установкой uWSGI
- virtualenv
- Django
- Домен и порт
- Установка и базовая настройка uWSGI
- Установка uWSGI в виртуальное окружение
- Проверка
- Проверка работы Django приложения
- Устновка и базовая настройка nginx
- Установка и запуск nginx
- Конфигурация nginx для работы с Django
- Статика в одном месте
- Проверка осблуживания статики и медиа
- nginx + uWSGI + test.py
- Unix сокеты вместо веб-портов
- Если не заработало
- nginx + uWSGI + Django
- Конфигурация uWSGI через ini файл
- Устанавливаем uWSGI глобально
- Режим Emperor
- Django — NGINX: запускаем наш проект на сервере
- 1. Установите необходимые пакеты, используя apt
- 2. Создайте каталоги для ваших статических и медиа файлов
- 3. Настройте свой проект Django и установите требования
- 4. Соберите статические файлы
- 5. Настройте uWSGI для размещения вашего проекта Django.
- 6. Настройте NGINX для обслуживания вашего приложения
- 7. Наслаждайтесь своим приложением Django
Развертывание Django проекта на сервере NGINX в Linux Ubuntu
Наше развертывание мы разделим на два этапа:
- Установка и настройка среды Python и UWSGI.
- Настройка веб-сервера NGINX.
Рассмотрим эти процессы по шагам.
Python, Django и UWSGI
Устанавливаем необходимые пакеты:
apt-get install nginx uwsgi python3 uwsgi-plugin-python3 python3-pip python3-dev build-essential libssl-dev libffi-dev python3-setuptools
Устанавливаем пакеты для Python:
pip3 install virtualenv uwsgi django
Создаем директорию для хранения стачичных файлов (css, js, img):
mkdir -p /var/www/my_app/static /var/www/my_app/media
chown www-data.www-data /var/www/my_app/media
chown www-data.www-data /var/www/my_app/static
Копируем наше приложение в папку /var/www/my_app, структура должна получиться примерно такой:
Вносим изменения в конфигурационный файл нашего проекта:
from .base import *
.
ALLOWED_HOSTS = [ ‘www.example.com’ ]
.
DATABASES = < 'default': < . >>
.
STATIC_ROOT = ‘/var/www/my_app/static’
MEDIA_ROOT = ‘/var/www/my_app/media’
- ALLOWED_HOSTS — разрешенные доменные имена, на которых должен открываться наш сайт.
- DATABASES — данные для подключения к базе данных. Подробнее, данная настройка описана ниже.
Запускаем команду для сбора всех статических файлов в нашем проекте (из корня проекта):
[uwsgi]
chdir = var/www/my_app
env = DJANGO_SETTINGS_MODULE=project.settings.production
wsgi-file = my_app/wsgi.py
workers = 1max-requests=5000
plugins=python3
processes = 5
threads = 2
master = true
die-on-term = true
socket = sedova.sock
chmod-socket = 660
vacuum = true
uid = www-data
gui = www-data
- chdir — указываем директорию нашего проекта.
- env — конфигурационный файл нашего приложения.
- wsgi-file — относительный путь до файла wsgi.py нашего приложения.
Перезапускаем сервис uwsgi:
service uwsgi restart
Настройка Nginx
Создаем файл конфигурации для нашего приложения
Содержимое файла должно быть примерно следующим:
server <
listen 80;
server_tokens off;
server_name my_app my_app.domain.local;
location / <
include uwsgi_params;
uwsgi_pass unix:///run/uwsgi/app/sedova/socket;
>
location /static/ <
alias /var/www/my_app/static/;
>
location /media/ <
alias /var/www/my_app/media/;
>
>
systemctl restart nginx
Подключение к базе данных
Рассмотрим пример настройки подключения к СУБД MariaDB/MySQL. Нам необходимо будет настроить как сам сервер баз данных, так и фреймворк. В инструкции опишем полный процесс, начиная от установки СУБД.
MariaDB
Выполним установку и настройку сервера баз данных. Начнем с установки:
apt-get install mariadb-server
Разрешаем автозапуск СУБД:
systemctl enable mariadb
Зададим пароль для учетной записи mysql-root:
mysqladmin -u root password
Установка и запуск завершены. Перейдем к настройке.
Для Django важно, чтобы кодировка была UTF-8. Откроем конфигурационный файл клиента:
[mysql]
.
default-character-set = utf8
Аналогичную настройку выполняем в следующем файле:
[mysql]
.
default-character-set = utf8
Редактируем файл для настройки сервера:
Задаем значения для опций:
character-set-server = utf8
collation_server = utf8_unicode_ci
Для применения настроек перезапускаем сервис:
systemctl restart mariadb
Подготовка базы данных
Предполагается, что у нас есть база данных, которую мы либо создадим на сервере, либо восстановим из резервной копии.
Не забываем также настроить права доступа на базу.
Установка модуля для Python
Для возможности подключения к базе, мы должны установить клиента mysql на сервер. Для этого выполняем две команды:
apt-get install libmysqlclient-dev
pip3 install mysqlclient
Первая команда установит библиотеки, необходимые для установки mysqlclient через менеджер пакетов Python. Вторая, собственно, и установит клиента.
Настройка подключения
Откроем конфигурационный файл нашего приложения:
DATABASES = <
‘default’: <
‘ENGINE’: ‘django.db.backends.sqlite3’,
‘NAME’: BASE_DIR / ‘db.sqlite3’,
>
>
Данная настройка прописывается, как правило, по умолчанию и позволяет использовать базу sqlite3. Поменяем ее:
DATABASES = <
‘default’: <
‘ENGINE’: ‘django.db.backends.mysql’,
‘NAME’: ‘database_name’,
‘HOST’: ‘localhost’,
‘USER’: ‘db_user’,
‘PASSWORD’: ‘db_password’,
>
>
* в данном примере:
- NAME — имя базы данных, к которой мы подключимся.
- HOST — сервер баз данных.
- USER — пользователь с привилегиями работы с базой данных.
- PASSWORD — пароль для пользователя.
Делаем выборку
Для проверки настройки создадим select-запрос с нашей базе. Предположим, к таблице users. Пример кода будет таким:
- from django.db import connection
- cursor = connection.cursor()
- cursor.execute(«SELECT * FROM users»)
- print(cursor.fetchall())
В данном примере мы извлечем все содержимое таблицы users и выведем это на экран.
Источник
Django на production. uWSGI + nginx. Подробное руководство
Перед вами руководство по настройке production окружения для Django. Здесь будут описаны необходимые шаги по настройке Django, uWSGI и nginx. Руководство охватывает все три компонента — полный стек серверного ПО для веб-приложений.
Подразумевается, что вы используете Unix-подобную операционную систему и менеджер пакетов, эквивалентный aptitude. Найти эквивалент aptitude почти для любой операционной системы, в том числе и для Mac OS X, для вас не составит никакого труда.
Руководство написно для версий Django 1.4 или выше. Если вы используете более раннюю версию, то вам придется самостоятельно найти wsgi модуль для нее. Также вы заметите, что файловая структура проекта будет немного отличаться от представленной здесь.
Общая идея
Веб-сервер может по запросу отдавать пользователям файлы из своей файловой системы, однако он не может напрямую работать с Djangо приложениями. Веб-серверу нужен интерфейс, который будет запускать Django приложение, передавать ему запрос от пользователя и возвращать ответ.
Для выполнения этих задач был разработан Web Server Gateway Interface — WSGI — стандарт взаимодействия Python программ и веб-сервра.
uWSGI — одна из реализаций WSGI. В этом руководстве мы установим и настроим uWSGI для создания Unix сокета и взаимодействия с веб-сервером по протоколу WSGI.
Полный стек компонентов будет выглядеть следующим образом:
Перед установкой uWSGI
virtualenv
Создадаем и активируем виртуальное окружение для софта, который нам будет необходим (ниже я расскажу, как установить uwsgi глобально):
Django
Устонавливаем Django в наше виртуальное окружение:
Создаем новый проект и переходим в его корневую папку:
Домен и порт
В этом руководстве мы будем использовать для нашего учебного проекта домен yourserver.com. Вам нужно будет заменить его на собственное доменное имя или IP адрес вашего сервера.
Для получения запросов от пользователей мы будем использовать порт 8000. Вы можете использовать любой другой порт. Я выбрал именно 8000, потому что его использование не приведет к конфликтам с другими задачами, выполняемыми сервером.
Установка и базовая настройка uWSGI
Установка uWSGI в виртуальное окружение
Один из хороших способов установить uWSGI:
Нам понадобятся Python development пакеты. Если вы используете Debian или основнную на Debian операционную систему (например, Ubuntu или Mint), вам нужно установить пакет pythonX.Y-dev, где X.Y — нужная вам версия Python.
Проверка
Создаем файл test.py:
Опции:
- http: 8000 : используется протокол http и порт 8000
- wsgi-file test.py : uwsgi загрузит определенный файл (в нашем случае test.py)
В браузере переходим по адресу yourserver.com:8000 .
Видим: «Hello, world», значит, мы все сделали правильно и следующие компоненты работают:
Проверка работы Django приложения
Теперь сделаем так, чтобы uWSGI работал с Django приложением, а не с файлом test.py.
Проверим, что только что созданный проект mysite запускается на сервере для разработки:
Если проект запустился, останавливаем сервер для разработки и запускаем uWSGI следующим образом:
- module mysite.wsgi : uwsgi загрузит модуль mysite.wsgi
В браузере переходим по адресу yourserver.com:8000 .
Видим стартовую страницу Djangо, значит, мы все сделали правильно и следующие компоненты работают:
Это нехорошо, что комьютер пользователя на прямую обращается к uWSGI. Между пользователем и uWSGI должен находиться веб-сервер.
Устновка и базовая настройка nginx
Установка и запуск nginx
Чтобы проверить, что nginx установлен и запущен, перейдите по адресу yourserver.com:80 . Если вы видите сообщение “Welcome to nginx!”, значит, все окей и следующие компоненты работают:
Если у вас занят восьмидесятый порт, измените конфигурацию nginx так, чтобы он использовал какой-нибудь другой (в этом руководстве nginx будет использовать порт 8000).
Конфигурация nginx для работы с Django
Нам понадобится файл uwsgi_params, который можно взять здесь: github.com/nginx/nginx/blob/master/conf/uwsgi_params.
Скачиваем его в корневую папку нашего проекта.
Создаем файл mysite_nginx.conf:
Этот конфигурационный файл указывает nginx, что он должен отдавать пользователям медиа и статик файлы из файловой системы, а все остальные запросы перенаправлять в Django приложение. В больших проектах лучше использовать два сервера: один для обслуживания статик и медиа файлов, а другой для Django приложения. С небольшими, и тем более с учебными проектами, справится и один сервер.
В папке /etc/nginx/sites-enabled создаем ссылку на файл mysite_nginx.conf , чтобы nginx увидел его:
Статика в одном месте
Перед запуском nginx поместим всю статику в папку static. Для этого добавляем в файл mysite/settings.py следующую строку:
И выполняем команду:
Проверка осблуживания статики и медиа
Помещаем файл с именем, например, media.png в папку /path/to/your/project/project/media .
В браузере переходим по адресу yourserver.com:8000/media/media.png и, если видим наш файл, значит мы все сделали правильно.
nginx + uWSGI + test.py
Настраиваем взаимодействие nginx и test.py через uSWGI.
Почти то же самое, что мы сделали недавано, за исключением одной опции:
- socket :8001 : используем протокол uWSGI, порт 8001
Как вы помните, мы сконфигурировали nginx(файл mysite_nginx.conf ) для работы с uWSGI через порт 8001.
Если перейти по адресу yourserver.com:8001 , то мы ничего не увидим, поскольку браузер использует протокол http, а не uWSGI, однако uWSGI выведет сообщение о попытке соединения в терминал.
Unix сокеты вместо веб-портов
До этого мометна мы использовали сокет, привязанный к TCP порту (я называл его веб-порт), потому что так было проще, но на деле рекомендуется использовать Unix-сокет из-за преимущества в производительности.
Редактируем mysite_nginx.conf следующим образом:
И перезапускаем nginx:
На этот раз опция socket указывает на файл.
Открываем в браузере yourserver.com:8000/
Если не заработало
Проверьте лог ошибок nginx, скорее всего он находится в файле var/log/nginx/error.log
Если найдете там что-то похожее на
значит есть проблема с правами доступа к файлу mysite.sock. Необходимо сделать так, чтобы nginx имел разрешение на использование этого файла.
Попробуйте запустить uWSGI так:
Чтобы проблем с доступом в будущем не было, добавьте вашего пользователя в группу www-data.
Информация, которую uWSGI выводит в терминал, полезна при поиске и исправлении возможных ошибок или неисправностей.
nginx + uWSGI + Django
В браузере переходим на yourserver.com:8000/ и видим стартовую страницу Django.
Мы собрали всю цепочку, но настройка еще не закончена, идем дальше.
Конфигурация uWSGI через ini файл
Очень удобно все опции, с которыми мы запускаем uWSGI, указать в ini файле, а при запуске передавать только путь к этому файлу.
Создаем файл mysite_uwsgi.ini :
Проверяем. Все работает? Дальше.
Устанавливаем uWSGI глобально
До сих пор uWSGI был установлен в виртуальном окружении. Чтобы была возможность автоматически запускать uWSGI при старте операционной системы, мы установим его глобально.
Деактивируем виртуальное окружение:
На вики странице uWSGI описано несколько вариантов установки. Перед тем, как установить uWSGI глобально, вам не помешает определиться с выбором версии и методом установки.
Запусить uWSGI можно той же командой, что и раньше:
Режим Emperor
Если сервер обслуживает несколько проектов, каждый из которых использует uWSGI, то нужно исползовать режим Emperor. В этом режиме uWSGI просматривает папку с конфигурационными файлами и для каждого файла запускает отдельный процесс (вассал).
Если один из конфигурационных файлов будет изменен, uWSGI перезапустит соответствующего вассала.
Источник
Django — NGINX: запускаем наш проект на сервере
Django — NGINX — это популярная и хорошо протестированная комбинация, используемая для развертывания веб-приложений в продакшене. В этом посте я объясню шаги, необходимые для развертывания вашего проекта Django на сервере с использованием Ubuntu 18.04.
Чтобы развернуть Django — NGINX на вашем сервере, выполните следующие простые шаги.
1. Установите необходимые пакеты, используя apt
Зачем вам нужен UWSGI ? Проще говоря, NGINX сам по себе не может запустить процесс Python для размещения вашего приложения, для этого вам понадобится так называемый сервер приложений, на котором будет размещен процесс Python, выполняющий ваш проект Django. NGINX и uWSGI будут «общаться» друг с другом по протоколу uwsgi.
2. Создайте каталоги для ваших статических и медиа файлов
Статические файлы — это файлы «не-python», необходимые для вашего проекта Django, например Javascript, CSS и изображения. Медиа-файлы — это файлы, загруженные пользователями вашего приложения. Не каждое приложение позволяет пользователям загружать файлы, но это очень распространенный сценарий. Django не будет обслуживать статические и медиа файлы самостоятельно. Мы будем использовать NGINX, чтобы работать с ними.
Прежде всего, вы должны создать каталоги. Здесь я предполагаю, что вы в настоящее время используете пользователя Ubuntu с домашним каталогом по умолчанию /home/ubuntu:
Вторая команда сделает пользователя с именем www-data владельцем каталога /home/ubuntu/media. www-data будет пользователем, выполняющим ваш процесс Python в uWSGI, и этот пользователь должен иметь возможность писать в каталог мультимедиа, чтобы правильно сохранять загруженные пользователем файлы.
3. Настройте свой проект Django и установите требования
Этот шаг действительно зависит от вашего конкретного приложения Django, для целей данного руководства я буду предполагать, что ваш проект Django установлен в каталоге / home/ubuntu/django_project/ со следующей структурой:
Также я предполагаю, что вы установили все свои зависимости Python, например, используя apt или pip.
Я всегда следую рекомендациям при запуске нового проекта Django, разбивая монолитный файл settings.py на разные файлы, по одному для каждой среды развертывания (local, test, production и т.д.).
В нашем случае Django будет использовать модуль project/settings/production.py для своих настроек. Здесь мы устанавливаем переменные STATIC_ROOT и MEDIA_ROOT для каталогов, которые мы создали на шаге 2:
4. Соберите статические файлы
Запустите следующую команду, чтобы собрать все статические файлы для вашего проекта Django:
Эта команда скопирует все статические файлы (Javascript, CSS, изображения) для всех ваших приложений Django в каталог STATIC_ROOT, настроенный в production.py . Например, /home/ubuntu/static .
5. Настройте uWSGI для размещения вашего проекта Django.
Создайте файл с именем django.ini в каталоге /etc/uwsgi/apps-enabled/. Содержимое файла должно быть примерно таким:
Перезапустите uWSGI с помощью:
Вы должны найти логи uWSGI в /var/log/uwsgi/apps/django.log. Поэтому вы можете проверить их, чтобы увидеть, правильно ли запущен процесс Python или есть проблемы.
6. Настройте NGINX для обслуживания вашего приложения
Создайте файл с именем django в каталоге /etc/nginx/sites-enabled/. Содержимое файла должно быть примерно таким:
Перезапустите NGINX с помощью:
7. Наслаждайтесь своим приложением Django
Направьте браузер на свой домен, и вы увидите приложение Django во всей его красе!
Источник