Установка и настройка Django с PostgreSQL, Gunicorn, Supervisor и Nginx на Ubuntu 16.04
Важно: статья рассчитана на среду разработки или тестовый сервер. Для продакшена дополнительно понадобятся SSL, политики бэкапов и мониторинг.
Введение
Django — свободный фреймворк на Python с архитектурой MVT (Model-View-Template). Проект поддерживается Django Software Foundation (DSF). Django ускоряет разработку приложений и подходит для быстрых итераций (RAD).
В этом руководстве показано, как установить Django и настроить проект для работы с PostgreSQL на Ubuntu 16.04. Мы запустим Nginx как обратный прокси и используем Gunicorn в качестве WSGI-сервера; управление процессом Gunicorn будет осуществляться через Supervisor.
TL;DR — что вы получите
- Рабочий Django-проект, подключённый к PostgreSQL.
- Gunicorn, запущенный из виртуального окружения и управляемый Supervisor.
- Nginx как фронтальный веб-сервер/обратный прокси для статических и медиа-файлов.
Требования
- Ubuntu 16.04
- Права root или sudo
Понятия в одной строке
- Virtualenv: изолированное Python-окружение для пакетов проекта.
- Gunicorn: WSGI HTTP сервер для приложений Python.
- Supervisor: простой менеджер процессов для Linux.
- Nginx: высокопроизводительный HTTP сервер и обратный прокси.
Шаг 1 — Установка Django, virtualenv и Gunicorn
Мы будем использовать python3 в качестве системного Python. Установите python3 и pip3 и обновите список пакетов:
ssh [email protected]
sudo apt-get updateУстановите системные пакеты для Python:
sudo apt-get install python3-pip python3-devСоздайте символьную ссылку, чтобы иметь команду pip, и обновите pip:
ln -s /usr/bin/pip3 /usr/bin/pip
pip install --upgrade pipУстановите необходимые пакеты через pip (Django, virtualenv, gunicorn):
pip install django virtualenv gunicorn
Примечание: в средах с несколькими проектами всегда рекомендуется пользоваться virtualenv или pyenv + venv для каждого проекта.
Шаг 2 — Установка и настройка PostgreSQL
Установите PostgreSQL и заголовочные файлы для сборки драйверов:
sudo apt-get install postgresql postgresql-contrib libpq-devУстановите адаптер psycopg2 в ваше Python-окружение. Если вы на системном Python, используйте sudo, иначе установите внутри виртуального окружения:
pip install psycopg2Переключитесь на системного пользователя postgres и откройте psql:
su - postgres
psqlЗадайте пароль для пользователя postgres:
\password postgres
Enter new password:Создайте базу данных и роль для проекта (в примере база django_db, роль python_dev):
CREATE USER python_dev WITH PASSWORD 'aqwe123';
CREATE DATABASE django_db OWNER python_dev;Проверьте список баз и ролей:
\list
Совет: вместо простого пароля используйте сильную фразу и храните её в менеджере секретов или в environment-переменных.
Шаг 3 — Создание нового Django-проекта
В этом примере проект будет запускаться под обычным пользователем natsume (не root). Вы можете выбрать другое имя пользователя.
Создание системного пользователя
useradd -m -s /bin/bash natsume
passwd natsume- -m: автоматически создаёт домашний каталог.
- -s: задаёт оболочку по умолчанию.
Создание виртуального окружения и установка зависимостей
Входим под пользователем natsume:
su - natsumeСоздаём каталог проекта и виртуальное окружение с использованием python3:
mkdir myproject
virtualenv --python=python3 myproject/Активируем окружение и устанавливаем Django, gunicorn и psycopg2:
cd myproject/
source bin/activate
pip install django gunicorn psycopg2
Создание проекта и подключение PostgreSQL
Создайте проект hello_django:
django-admin startproject hello_djangoПерейдите в директорию проекта и откройте файл настроек hello_django/settings.py . Отредактируйте раздел DATABASES примерно так:
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'django_db',
'USER': 'python_dev',
'PASSWORD': 'aqwe123',
'HOST': 'localhost',
'PORT': '',В конце settings.py добавьте STATIC_ROOT, чтобы collectstatic складывал файлы статики в одно место:
STATIC_ROOT = os.path.join(BASE_DIR, 'static/')Сохраните изменения и выполните миграции, создайте суперпользователя и соберите статические файлы:
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic
Проверьте запуск dev-сервера:
python manage.py runserver 0.0.0.0:8080Откройте в браузере http://
Важно: dev-сервер (runserver) предназначен только для разработки, а не для продакшена.
Шаг 4 — Конфигурация Gunicorn
Gunicorn (Green Unicorn) — WSGI HTTP сервер для Python. Он прост и хорошо подходит для развёртывания Django-приложений.
Активируйте виртуальное окружение:
cd ~/myproject/
source bin/activateСоздайте стартовый скрипт bin/gunicorn_start и сделайте его исполняемым. Вставьте в него конфигурацию (приведена ниже):
#!/bin/bash
# Project Name
NAME="hello_django"
# Django Project Directory
DJANGODIR=/home/natsume/myproject/hello_django
# Run gunicorn on the socket file
SOCKFILE=/home/natsume/myproject/hello_django/run/gunicorn.sock
# Gunicorn running as user and group
USER=natsume
GROUP=natsume
# Workers
NUM_WORKERS=3
#Module Setting
#replace hello_django with your project name
DJANGO_SETTINGS_MODULE=hello_django.settings
DJANGO_WSGI_MODULE=hello_django.wsgi
echo "Starting $NAME as `whoami`"
# Activate the virtual environment
cd $DJANGODIR
source ../bin/activate
export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DJANGODIR:$PYTHONPATH
# Create the run directory if it doesn't exist
RUNDIR=$(dirname $SOCKFILE)
test -d $RUNDIR || mkdir -p $RUNDIR
# Start your Django Unicorn
# Programs meant to be run under supervisor should not daemonize themselves (do not use --daemon)
exec ../bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
--name $NAME \
--workers $NUM_WORKERS \
--user=$USER --group=$GROUP \
--bind=unix:$SOCKFILE \
--log-level=debug \
--log-file=-Сделайте файл исполняемым:
chmod u+x bin/gunicorn_startСовет по количеству воркеров: используйте правило “2 × cores + 1” как отправную точку и корректируйте под нагрузку.
Шаг 5 — Установка и настройка Supervisor
Supervisor управляет и перезапускает процессы. Установим его из репозитория Ubuntu:
sudo apt-get install supervisorСоздайте конфигурацию для проекта в /etc/supervisor/conf.d/hello-django.conf :
[program:hello_django]
command = sh /home/natsume/myproject/bin/gunicorn_start
user = natsume
stdout_logfile = /home/natsume/myproject/logs/gunicorn_supervisor.log
redirect_stderr = true
environment=LANG=en_US.UTF-8,LC_ALL=en_US.UTF-8Создайте каталоги для сокета и логов под пользователем natsume:
su - natsume
# Directory for gunicorn sock file
mkdir -p myproject/hello_django/run/
# Directory and file for supervisor log files
mkdir -p myproject/logs/
touch myproject/logs/gunicorn_supervisor.logВернитесь к root и запустите supervisor:
exit
systemctl start supervisorПроверка состояния и просмотр логов:
supervisorctl
tail -f hello_django
Примечание: если Supervisor не стартует, проверьте global-конфиги и права на исполняемый скрипт gunicorn_start.
Шаг 6 — Установка и настройка Nginx
Установите Nginx и создайте виртуальный хост для проекта:
sudo apt-get install nginxСоздайте файл /etc/nginx/sites-available/hello_django с конфигурацией:
# Django running with Gunicorn Sock file
upstream hello_django_project {
server unix:/home/natsume/myproject/hello_django/run/gunicorn.sock fail_timeout=0;
}
server {
listen 80;
server_name www.django-nginx.com;
client_max_body_size 4G;
access_log /home/natsume/myproject/logs/nginx-access.log;
error_log /home/natsume/myproject/logs/nginx-error.log;
location /static/ {
alias /home/natsume/myproject/hello_django/static/;
}
location /media/ {
alias /home/natsume/myproject/hello_django/media/;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
# Try to serve static files from nginx, no point in making an
# *application* server like Unicorn/Rainbows! serve static files.
if (!-f $request_filename) {
proxy_pass http://hello_django_project;
break;
}
# Error pages
error_page 500 502 503 504 /500.html;
location = /500.html {
root /home/natsume/myproject/hello_django/static/;
}
}
}Активируйте сайт и проверьте конфигурацию Nginx:
ln -s /etc/nginx/sites-available/hello_django /etc/nginx/sites-enabled/
nginx -tЕсли тест успешен, перезапустите Nginx:
systemctl restart nginxСовет: для продакшен-домена добавьте SSL (Let’s Encrypt) и настройте HTTP → HTTPS редирект.
Шаг 7 — Проверка работы проекта
Откройте в браузере адрес виртуального хоста, например:
http://www.django-nginx.com/admin/

После ввода учётных данных вы попадёте в админ-панель:

Проверьте активно работающие сервисы и сокеты:
netstat -pl
Если все сервисы запущены, значит установка и базовая конфигурация успешны.
Дополнительные советы и лучшие практики
Безопасность
- Настройте брандмауэр (ufw) и откройте только необходимые порты (80, 443, SSH).
- Используйте HTTPS с действующим сертификатом (Let’s Encrypt).
- Не храните пароли в открытом виде в settings.py — используйте environment-переменные или секретный менеджер.
- Ограничьте права файлов и владельцев (процессы должны работать не под root).
Резервное копирование
- Регулярно делайте дампы PostgreSQL (pg_dump/pg_basebackup) и храните их в удалённом хранилище.
- Бэкапьте media и статические файлы.
Производительность
- Настройте количество воркеров Gunicorn по формуле 2×CPU + 1 и корректируйте по метрикам.
- Используйте кеш (Redis / Memcached) для снижения нагрузки на БД.
Диагностика и runbook для инцидентов
- Приложение недоступно по HTTP:
- Проверить статус systemctl для nginx и supervisor: systemctl status nginx; systemctl status supervisor
- Проверить логи nginx: /home/natsume/myproject/logs/nginx-error.log
- Проверить логи Supervisor/Gunicorn: /home/natsume/myproject/logs/gunicorn_supervisor.log
- Gunicorn не запускается:
- Проверить права на bin/gunicorn_start и наличие виртуального окружения.
- Запустить скрипт вручную под пользователем natsume и посмотреть ошибки.
- Ошибки подключения к БД:
- Проверьте параметры в settings.py и доступ postgres: psql -U python_dev -d django_db
Краткий rollback-план:
- Откатить конфигурацию Nginx к предыдущей версии (если есть copy), рестарт nginx.
- Перезапустить supervisor: supervisorctl restart hello_django
- В крайнем случае временно включить Django dev server для восстановления доступности: python manage.py runserver 0.0.0.0:8080
Альтернативы и когда это не подходит
- Если требуются асинхронные возможности (WebSockets), рассмотрите ASGI-серверы (uvicorn/daphne) и использование Channels.
- Для небольших одностраничных приложений можно использовать Gunicorn + Nginx, но для высоконагруженных систем стоит смотреть в сторону контейнеризации (Docker + Kubernetes).
Миграция с Ubuntu 16.04
Ubuntu 16.04 уже старше — при переносе на 18.04/20.04 обратите внимание на версии Python, systemd, и возможные изменения в пакетах (pip, libpq-dev). Тестируйте все шаги в staging перед миграцией продакшена.
Критерии приёмки
- Админ-панель Django доступна по указанному домену.
- Gunicorn обслуживает сокет unix и управляется Supervisor.
- Nginx отдаёт static и media файлы напрямую и проксирует остальные запросы к Gunicorn.
- Логи и каталоги для сокета созданы и доступны под нужным пользователем.
Контроль качества — тесты приёмки
- Проверить /admin/ — страница логина должна открываться.
- Выполнить запрос к статическому файлу (например /static/admin/css/base.css) и убедиться, что Nginx отдаёт его без проксирования.
- Остановить Supervisor и убедиться, что он перезапускает процесс.
Сниппеты и быстрые команды (чек-лист для развёртывания)
- apt-get update && apt-get install python3-pip python3-dev libpq-dev postgresql nginx supervisor
- pip install virtualenv
- virtualenv –python=python3 myproject/
- source myproject/bin/activate && pip install django gunicorn psycopg2
- Настроить settings.py для PostgreSQL и STATIC_ROOT
- Создать bin/gunicorn_start и /etc/supervisor/conf.d/hello-django.conf
- ln -s /etc/nginx/sites-available/hello_django /etc/nginx/sites-enabled/
- systemctl restart supervisor && systemctl restart nginx
1-строчный глоссарий
- WSGI: интерфейс между веб-сервером и Python приложением.
- SOCKFILE: unix-сокет, по которому Nginx общается с Gunicorn.
Роли и ответственность (чек-лист)
- DevOps/Системный администратор: установка пакетов, настройка systemd/supervisor, SSL.
- Разработчик: настройка settings.py, миграции, тесты приложения.
- QA: проверка доступности, тесты API и статических ресурсов.
Итог
Вы получили пошаговое руководство по развёртыванию Django с PostgreSQL, Gunicorn, Supervisor и Nginx на Ubuntu 16.04. После выполнения всех шагов ваш проект будет работать через unix-сокет Gunicorn, управляемый Supervisor и проксируемый Nginx. Для продакшена добавьте HTTPS, систему бэкапов и мониторинг.
Ссылки
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента