Оставьте свои контакты
И мы с вами свяжемся в рабочее время
Блог

Nginx Gunicorn Postgres Django

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

Чтобы запустить Django проект на сервере мы используем связку nginx + gunicorn + postgres, сервер с операционнной системой Ubuntu. Все совпадения это лишь совпадения и не более. И так приступим, для начала нам понадобится сам сервер с установленной ОС Ubuntu, заказывем любой VPS.

Чтобы соединиться с сервером используем ssh.

ssh root@12.34.56.78

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

# 12.34.56.78: ip-адрес сервера

Сервер запросит пароль, вводим его и попадаем в терминал на сервере.

В терминале вводим команды в порядке очереди:

1. Подготовка сервера, загрузка проекта, установка зависимостей


sudo apt update & sudo apt upgrade -y

sudo apt install python3-pip python3-venv postgresql postgresql-contrib nginx

cd /home/

git clone https://github.com/ваш_проект/ваш_проект.git

python3 -m venv env

. env/bin/activate

cd test_project/

pip install -r requirements.txt

pip install gunicorn psycopg2-binary==2.8.6

2. Настройка gunicorn


sudo nano /etc/systemd/system/gunicorn.socket

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

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

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=root
Group=www-data
WorkingDirectory=/home/todo_project
Environment=LANG=ru
ExecStart=/home/todo_project/todoenv/bin/gunicorn \
--access-logfile /var/log/gunicorn/todo_project.log \
--error-logfile /var/log/gunicorn/todo_project.log \
--log-file /var/log/gunicorn/todo_project.log \
--workers 3 \
--bind unix:/run/gunicorn.sock \
todo.wsgi:application

[Install]
WantedBy=multi-user.target

sudo systemctl start gunicorn

sudo systemctl enable gunicorn

sudo systemctl status gunicorn

file /run/gunicorn.sock

sudo journalctl -u gunicorn

sudo systemctl daemon-reload

sudo systemctl restart gunicorn

3. Настройка nginx


sudo ufw allow 'Nginx Full'

sudo ufw allow OpenSSH

sudo ufw enable

sudo ufw status

sudo systemctl start nginx

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

server {
listen 80;
server_name 104.248.141.144;

location /static/ {
root /home/todo_project;
}

location /media/ {
root /home/todo_project;
}

location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}

location /robots.txt {
alias /home/todo_project/robots.txt;
}
}

# server {
# server_name www.example.com;
# return 301 http://example.com$request_uri;

# }

# server {
# listen 80;
# server_name 104.248.141.144;
# return 301 http://example.com$request_uri;
# }


sudo nginx -t

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

nginx.conf сжатие gzip, client_max_body_size 20m;

4. Настройка Postgres


locale

sudo dpkg-reconfigure locales

sudo reboot

locale

sudo systemctl status postgresql

sudo -u postgres psql -c 'select now()'

sudo -u postgres psql

CREATE DATABASE tododb;

CREATE USER testuser WITH ENCRYPTED PASSWORD 'ваш_пароль';

GRANT ALL PRIVILEGES ON DATABASE testdb TO testuser;

python manage.py migrate

scp dump.json root@ip_ваш_сервер:/home/test_project

python manage.py loaddata dump.json

5. Django static и media


ls

ls project_static/

ls project_static/css/

заходим в админку и не видим статики

python manage.py collectstatic

появилась в админке, на сайте нет

2 способа изменить файлы (на самом сервере и через гит)

ls

ls static/

ls static/css/

заходим в админку в задачу с медиафайлом, его нет

scp -r media/ root@ip_ваш_сервер:/home/tеst_project

проверяем доступность медиа

заходим на несуществующую страницу

меняем дебаг на False, добавляем айпишник

проверяем статику и медиа

6. Юзеры и права


создаем отдельного юзера для запуска gunicorn

adduser gunicorn

chgrp gunicorn /home/test_project

chmod -R 775 /home/test_project

7. Несколько проектов на одном сервере ubuntu


1. если есть домен
2. по ip, но на разных портах

копируем другой проект на удаленный сервер

(из текущей папки)
scp -r "$PWD" root@ip_ваш_сервер:/home/ваш_второй_проект

создаем виртуальное окружение для проекта, устанавливаем зависимости, настраиваем gunicorn и nginx

python3 -m venv env

. yatubeenv/bin/activate

pip install -r requirements.txt

pip install gunicorn

sudo nano /etc/systemd/system/gunicorn-two.socket

sudo nano /etc/systemd/system/gunicorn-two.service

sudo systemctl start gunicorn-two

sudo systemctl enable gunicorn-two

sudo systemctl status gunicorn-two

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

sudo nginx -t

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

sudo systemctl reload nginx

sudo ufw allow 81


Как видите запустить Django проект на сервере ubuntu в связке nginx и gunicorn совсем не сложно. Если все команды выполнены правильно и не было никаких ошибок, то ваш проект успешно запустится на сервере и будет доступен из вне. Спасибо за внимание!
Made on
Tilda