Довольно частая проблема разработчиков на Django/Flask и т.п. это размещение сайта на виртуальном хостинге. Если один сайт с трудом вам всё-таки получится запустить, то несколько это прям нетривиальная задача, хотя на самом деле все очень просто
Запуск нескольких сайтов gunicorn
В юникорне можно это сделать несколькими способами ,первый и самый простой - это запустить на каком-либо порту и проксировать через nginx, второй более сложный - это когда создается соккет, хотя на самом деле по факту работа с соккетами более удобная. Расмотрим способ когда сайты запускаются через указанием порта и перебросом его на 80 и через соккет, тоже пробросом на 80 порт.
Первым делом создадим виртуальое окружение для сайтов, размещать мы будем их два:
python3.6 -m venv venv
python3.6 -m venv menv
Теперь активируем виртуальное окружение:
source bin/activate
Приступаем к установке Django и Gunicorn в каждом окружении:
pip install django==2.1.7
pip install gunicorn
Теперь создаем django проект на каждом окружении:
django-admin startproject mysite
теперь нужно перейти в папку с проектом и запустить юникорн для проверки работоспособности:
gunicorn --bind 0.0.0.0:5100 mysite.wsgi
Далее нужно дективировать виртуальное окружение и переходить непосредственно к настройке:
deactivate
Создадим сервис для запуска каждого сайта:
nano /etc/systemd/system/mysite1.service
[Unit]
Description=site1 daemon
After=network.target
[Service]
User=USER
Group=nginx
WorkingDirectory=/home/USER/blog
ExecStart=/home/USER/menv/bin/gunicorn --workers 3 --bind unix:/home/USER/menv/mysite/mysite.sock mysite.wsgi:application
[Install]
WantedBy=multi-user.target
и для второго:
nano /etc/systemd/system/mysite2.service
[Unit]
Description=site2 daemon
After=network.target
[Service]
User=USER
Group=nginx
WorkingDirectory=/home/USER/venv/mysite
ExecStart=/home/USER/venv/bin/gunicorn --bind 0.0.0.0:5100 mysite.wsgi
[Install]
WantedBy=multi-user.target
Теперь стартуем сервис, добавляем в автозагрузку и смотрим статус ,что все хорошо
sudo systemctl start site1
sudo systemctl enable site1
sudo systemctl status site1
sudo systemctl start site2
sudo systemctl enable site2
sudo systemctl status site2
Ну и теперь осталось настроить NGINX:
В секции http добавляемм секцию service
...
server {
listen 80 default_server;
server_name site1.ru;
location = /favicon.ico { access_log off; log_not_found off; }
location / {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_pass http://127.0.0.1:5100;
}
}
# для второго сайта через соккет, используя статические файлы и SSL
server {
listen 80;
listen 443 ssl;
server_name site2.ru;
root /usr/share/nginx/html;
ssl_certificate /etc/letsencrypt/live/site2.ru/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/site2.ru/privkey.pem;
if ($scheme = http) {
return 301 https://$server_name$request_uri;
}
include /etc/nginx/default.d/*.conf;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/user;
}
location /media/ {
root /home/user;
}
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://unix:/home/user/blog/blog.sock;
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
Рестартуем nginx и пробуем проверить работоспособность:
systemctl restart nginx