Created
March 3, 2021 11:35
-
-
Save Khalmatov/1e86f0ee17cac8d9f2be8696b18f7285 to your computer and use it in GitHub Desktop.
Настройка NGINX + Gunicorn + Django
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Подготовка: | |
Установка всех пакетов: | |
sudo apt update | |
sudo apt install python3-pip python3-dev libpq-dev postgresql postgresql-contrib nginx curl | |
Создание виртуальной среды: | |
sudo pip3 install virtualenv | |
mkdir ~/myprojectdir | |
cd ~/myprojectdir | |
virtualenv myprojectenv | |
Активация виртуальной среды: | |
source myprojectenv/bin/activate | |
Установка Django и Gunicorn в виртуальную среду: | |
pip install django gunicorn | |
Создание Django-проекта: | |
django-admin.py startproject myproject ~/myprojectdir | |
Разрешаем Django работать с нашим сайтом и указываем путь к статическим файлам: | |
nano ~/myprojectdir/myproject/settings.py | |
В файл seting.py: | |
... | |
ALLOWED_HOSTS = ['IP_вашего_сервера', 'доменное_имя_или_другой_IP', . . ., 'localhost'] | |
... | |
import os | |
STATIC_URL = '/static/' | |
STATIC_ROOT = os.path.join(BASE_DIR, 'static/') | |
Сохраняем и закрываем файл настроек: | |
Ctrl+S, Ctrl+X | |
Создаем миграции: | |
python manage.py makemigrations | |
python manage.py migrate | |
Создаем администратора проекта: | |
python manage.py createsuperuser | |
Собираем статические файлы в папку static: | |
python manage.py collectstatic | |
Тестирование: | |
Тестируем работоспособность Django-сервера: | |
Освобожаем порт 8000: | |
sudo ufw allow 8000 | |
Запускам сервер Django (сайт после должен быть доступен по адресу http://ваш.домен:8000 ): | |
python manage.py runserver 0.0.0.0:8000 | |
Останавливаем работу Django: | |
Ctrl+C | |
Тестирование способности Gunicorn обслуживать проект: | |
Переходим в папку, где лежит файл wsgi: | |
cd ~/myprojectdir | |
Запускаем сервер: | |
gunicorn --bind 0.0.0.0:8000 myproject.wsgi | |
После этого сайт должен работать, но без статичных файлов | |
Останавливаем работу Gunicorn: | |
Ctrl+C | |
Тестирование окончено. Выходим из виртуальной среды: | |
deactivate | |
Создание файлов сокета и служебных файлов systemd для Gunicorn: | |
Создание файла сокета systemd для Gunicorn: | |
sudo nano /etc/systemd/system/gunicorn.socket | |
В самом файле прописываем: | |
[Unit] | |
Description=gunicorn socket | |
[Socket] | |
ListenStream=/run/gunicorn.sock | |
[Install] | |
WantedBy=sockets.target | |
Сохраняем и закрываем файл настроек: | |
Ctrl+S, Ctrl+X | |
Создание служебного файла systemd для Gunicorn: | |
sudo nano /etc/systemd/system/gunicorn.service | |
Расшифровка: | |
username - имя пользователя Linux | |
myprojectdir - папка, где лежит ваш Django-проект | |
myprojectenv - папка виртуальной среды | |
myproject - название вашего Django-проекта | |
myproject.wsgi - название файла wsgi, который лежит в одноименной с вашим проектом папке | |
В самом файле прописываем: | |
[Unit] | |
Description=gunicorn daemon | |
Requires=gunicorn.socket | |
After=network.target | |
[Service] | |
User=username | |
Group=www-data | |
WorkingDirectory=/home/username/myprojectdir | |
ExecStart=/home/username/myprojectdir/myprojectenv/bin/gunicorn \ | |
--access-logfile - \ | |
--workers 3 \ | |
--bind unix:/run/gunicorn.sock \ | |
myproject.wsgi:application | |
[Install] | |
WantedBy=multi-user.target | |
Сохраняем и закрываем файл настроек: | |
Ctrl+S, Ctrl+X | |
Запускаем и активируем сокет Gunicorn: | |
sudo systemctl start gunicorn.socket | |
sudo systemctl enable gunicorn.socket | |
Тестирование Gunicorn: | |
Проверка состояния процесса, чтобы узнать, удалось ли его запустить: | |
sudo systemctl status gunicorn.socket | |
Проверка наличия файла gunicorn.sock в каталоге /run: | |
file /run/gunicorn.sock | |
При возникновении ошибок, проверьте журналы сокета Gunicorn: | |
sudo journalctl -u gunicorn.socket | |
Тестирование активации сокета: | |
Проверка механизма активации сокета: | |
curl --unix-socket /run/gunicorn.sock localhost | |
Проверка активности службы Gunicorn (должно быть "Active: active (running)"): | |
sudo systemctl status gunicorn | |
При наличии ошибок: | |
Проверьте журналы сокета Gunicorn: | |
sudo journalctl -u gunicorn | |
Проверьте файл /etc/systemd/system/gunicorn.service на наличие проблем: | |
Если вы внесли изменение в этот файл: | |
Перезагрузите демона: | |
sudo systemctl daemon-reload | |
Перезапустите процесс Gunicorn: | |
sudo systemctl restart gunicorn | |
Настройка Nginx как прокси для Gunicorn | |
Создание и настройка нового серверного блока в каталоге Nginx sites-available: | |
sudo nano /etc/nginx/sites-available/myproject | |
Расшифровка: | |
server_domain_or_IP - домен или IP вашего сайта (можно указать несколько через пробел) | |
location /static/ {...} - после root - путь к вашему проекту (там лежит папка со статикой) | |
location /media {...} - после alias - папка, где хранятся медиа-файлы | |
В самом файле прописываем: | |
server { | |
listen 80; | |
server_name server_domain_or_IP; | |
location = /favicon.ico { access_log off; log_not_found off; } | |
location /static/ { | |
root /home/username/myprojectdir; | |
} | |
location /media { | |
autoindex on; | |
alias /home/username/myprojectdir/media/; | |
} | |
location / { | |
include proxy_params; | |
proxy_pass http://unix:/run/gunicorn.sock; | |
} | |
} | |
Сохраняем и закрываем файл настроек: | |
Ctrl+S, Ctrl+X | |
Активировация и привязавка файл конфигурация Nginx к каталогу sites-enabled: | |
sudo ln -s /etc/nginx/sites-available/myproject /etc/nginx/sites-enabled | |
Тестирование файла конфигурации Nginx на ошибки синтаксиса: | |
sudo nginx -t | |
При отстутствии ошибок перезапускаем сервер Nginx: | |
sudo systemctl restart nginx | |
Удаляем правило и освобождаем порт 8000: | |
sudo ufw delete allow 8000 | |
sudo ufw allow 'Nginx Full' | |
После всего этого ваше веб-приложение Django должен работать по IP-адресу вашего сервера! | |
Полезные файлы и команды: | |
Gunicorn: | |
Файл конфигурации Gunicorn: | |
sudo nano /etc/systemd/system/gunicorn.socket | |
Журналы сокета Gunicorn: | |
sudo journalctl -u gunicorn.socket | |
Журналы приложения Gunicorn: | |
sudo journalctl -u gunicorn | |
Перезапуск Gunicorn (при изменении приложения Django): | |
sudo systemctl restart gunicorn | |
Перезапуск демона и процесса Gunicorn (при изменении файла сокета или служебных файлов Gunicorn): | |
sudo systemctl daemon-reload | |
sudo systemctl restart gunicorn.socket gunicorn.service | |
Nginx: | |
Файл конфигурации Nginx: | |
sudo nano /etc/nginx/sites-available/church | |
Журналы процессов Nginx: | |
sudo journalctl -u nginx | |
Журналы ошибок Nginx: | |
sudo tail -F /var/log/nginx/error.log | |
Журналы доступа Nginx: | |
sudo less /var/log/nginx/access.log | |
Тестирование и перезапуск сервера Nginx (при изменении конфигурации Nginx): | |
sudo nginx -t && sudo systemctl restart nginx |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment