IT-SERVICES

Опубликовано: 10 апреля 2019 г. 10:05

Довольно частая проблема разработчиков на Django/Flask и т.п. это размещение сайта на виртуальном хостинге. Если один сайт с трудом вам всё-таки получится запустить, то несколько это прям нетривиальная задача, хотя на самом деле все очень просто 

featured-image

Запуск нескольких сайтов 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

Share on Facebook Share on LinkedIn Share on VK