Смотреть

Нужны клиенты?

shape shape

Django Дек. 31, 2022

Nginx Gunicorn Postgres Django

Author Picture

Написал Андрей Галкин

Просмотров 10

Blog Thumbnail

В этой статье я распишу, как мы в компании настраиваем наши сервера для работы с 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 совсем не сложно. Если все команды выполнены правильно и не было никаких ошибок, то ваш проект успешно запустится на сервере и будет доступен из вне. Спасибо за внимание!

теги: Django

Давайте работать вместе

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