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