Предисловие
Для написания этой статьи ушло очень много сил и времени. Я натыкался на множество инструкций, как на английском, так и на русском языках, но как я понял, - они все были клонами оригинальной статьи на Digital Ocean. Спросите вы, почему я так считаю, а все потому, что все ошибки и неточности передаются с одного ресурса на другой без всяких изменений.
Подготовка
У нас есть обычный VPS c ОС Ubuntu, и мы уже написали в PyCharm или в блокноте свой сайт на Django и его осталось всего лишь опубликовать, привязать домен, установить сертификат и в путь.
Первым делом необходимо обновить список репозиториев и установить сразу же пакет nginx:
apt get updateapt get-install nginx
Я решил хранить файлы сайта в каталоге: /var/www/. В данном случае перемещаемся в каталогcd /var/www/и создаем новый каталогmkdir geekheroи получаем такой путь: /var/www/geekhero/
Переходим в новый каталог geekhero:cd geekheroи создаем виртуальное окружение:python3 -m venv geekhero_env
Активируем виртуальное окружение:source geekhero_env/bin/activateи устанавливаем в него Django: pip install Django и сразу же ставим pip install gunicorn
Создаем проект:django-admin startproject ghproj
Далее нужно произвести все первичные миграции; для этого
прописываем:python manage.py makemigrations
,
затемpython manage.py migrate
.
После этого создаем административную учетную запись:
python manage.py createsuperuser
и следуем
инструкции.
Далее уже создаем applications, но так как вы читаете данную статью, то вы уже умеете все это делать.
Заходим в Settings.py и прописываем, если
отсутствует:
import os
в заголовке, остальное в самом низу
текстового файла:
STATIC_URL = '/static/'STATIC_ROOT = os.path.join(BASE_DIR, 'static/')
НастройкаGunicorn
Идем в каталог /etc/systemd/system/ и создаем два файла: gunicorn.service и gunicon.socket:
Содержимое файла gunicorn.service:
[Unit]Description=gunicorn daemonRequires=gunicorn.socketAfter=network.target[Service]User=rootWorkingDirectory=/var/www/geekhero #путь до каталога с файлом manage.pyExecStart=/var/www/geekhero/geekhero_env/bin/gunicorn --workers 5 --bind unix:/run/gunicorn.sock ghproj.wsgi:application#путь до файла gunicorn в виртуальном окружении[Install]WantedBy=multi-user.target
Содержимое файла gunicorn.socket:
[Unit]Description=gunicorn socket[Socket]ListenStream=/run/gunicorn.sock[Install]WantedBy=sockets.target
Для проверки файла gunicorn.service на наличие ошибок:
systemd-analyze verify gunicorn.service
Настройка NGINX
Далее идем в каталог: /etc/nginx/sites-available/ и создаем файл geekhero (название вашего сайта) без расширения:
server { listen 80; server_name example.com; location = /favicon.ico { access_log off; log_not_found off; } location /static/ { root /var/www/geekhero; #путь до static каталога } location /media/ { root /var/www/geekhero; #путь до media каталога } location / { include proxy_params; proxy_pass http://unix:/run/gunicorn.sock; }}
Для того, чтобы создать символическую ссылку на файл в каталоге/etc/nginx/site-enabled/необходимо ввести следующую команду:
sudo ln -s /etc/nginx/sites-available/geekhero /etc/nginx/sites-enabled/
При любых изменениях оригинального файла, ярлык из
sites-enabled нужно удалять и пересоздавать заново командой
выше или выполнять команду:sudo systemctl restart
nginx
Финальный этап
Для проверки конфигурации nginx нужно ввести команду:
sudo nginx -t
sudo nginx -t
Далее запускаем службу gunicorn и
создаем socket:
sudo systemctl enable gunicornsudo systemctl start gunicorn
Для отключения выполняем команды:
sudo systemctl disable gunicorn
sudo systemctl stop gunicorn
Также, эти обе команды пригодятся, если вы будете вносить какие-либо изменения в HTML или python файлы, чтобы обновить свой сайт, но помните, что, если вносите изменения в модели, то обязательно нужно сделать python manage.pymakemigrations <app> и migrate <app> из каталога с проектом.
Для первичного запуска / полной остановки сервиса Gunicorn:
service gunicorn start / service gunicorn stop
Чтобы посмотреть статус запущенного сервиса нужно ввести:
sudo systemctl status gunicornилиsudo journalctl -u gunicorn.socket(с последней командой правильный вывод такой: мар 05 16:40:19 byfe systemd[1]: Listening on gunicorn socket. )
Для проверки создания сокета, необходимо ввести команду:
file /run/gunicorn.sock
Такой вывод считается правильным:/run/gunicorn.sock: socket
Если внес какие-либо изменения в файл gunicorn.service или .socket, необходимо выполнить команду:
systemctl daemon-reload
Если все нормально сработало, то можем запустить nginx:
sudo service nginx start
Получаем сертификат SSL для домена
Установим certbot от Let's Encrypt:sudo apt-get install
certbot python-certbot-nginx
Произведем первичную настройку certbot:sudo certbot
certonly --nginx
И наконец-то автоматически поправим конфигурацию
nginx:sudo certbot install --nginx
Осталось только перезапустить сервис nginx:sudo systemctl
restart nginx
Итог
В рамках этой статьи мы разобрали как вывести наш сайт в production, установив Django, Gunicorn, nginx и даже certbot от Let's Encrypt.