Как настроить несколько проектов django, работающих на разных системных портах, используя один IP с помощью gunicorn

Этот вопрос немного длинный, но я попытался предоставить как можно больше информации из моих сомнений и испытаний. Я возился с конфигурациями gunicorn и nginx для размещения 3 проектов django на сервере AWS EC2 ubuntu. Я не смог отсортировать их для запуска и не смог полностью разобраться в настройках.

(1) Прежде всего, я установил их следующим образом (Каждая папка проекта имеет свою собственную настройку venv):

drwxrwxr-x 10 ubuntu ubuntu 4096 Mar 26 02:10 first_project/
drwxrwxr-x  7 ubuntu ubuntu 4096 Mar 26 01:20 second_project/
drwxrwxr-x  7 ubuntu ubuntu 4096 Mar 26 01:25 third_project/

(2) Я пробовал создавать отдельные файлы .socket в папке /etc/systemd/system/

-rw-r--r--  1 root root  112 Mar 26 02:17  gunicorn_first.socket
-rw-r--r--  1 root root  112 Mar 26 02:19  gunicorn_second.socket
-rw-r--r--  1 root root  112 Mar 26 02:22  gunicorn_third.socket

(3) и включил их все с одинаковым содержанием:

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

(4) После добавления файлов .socket, я добавил файлы .service

-rw-r--r--  1 root root  112 Mar 26 02:35  gunicorn_first.service
-rw-r--r--  1 root root  112 Mar 26 02:39  gunicorn_second.service
-rw-r--r--  1 root root  112 Mar 26 02:44  gunicorn_third.service

(5) и добавлено следующее содержание (NTH -> первый, второй, третий)

[Unit]
Description=gunicorn daemon
Requires=gunicorn_NTH.socket
After=network.target

[Service]
User=ubuntu
WorkingDirectory=/home/ubuntu/NTH_project
ExecStart=/home/ubuntu/NTH_project/venv/bin/gunicorn --workers 3 --access-logfile - --bind unix:/run/gunicorn.sock NTH_project.wsgi:application

[Install]
WantedBy=multi-user.target

(6) И, наконец, моя конфигурация nginx по умолчанию (/etc/nginx/sites-enabled/default) следующим образом. Я открыл порты 8081, 8082, 8083 - по одному для каждого проекта

server {
    listen 8081;
    server_name MY_IP;

    location /first_project {
        root /home/ubuntu/first_project;
    }
    
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn_first.sock;
    }
}

server {
    listen 8082;
    server_name MY_IP;

    location /second_project {
        root /home/ubuntu/second_project;
    }
    
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn_second.sock;
    }
}

server {
    listen 8083;
    server_name MY_IP;

    location /third_project {
        root /home/ubuntu/third_project;
    }
    
    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn_third.sock;
    }
}

Вышеуказанный подход не работает, поэтому я заменил proxy_pass в каждом на http://unix:/run/gunicorn.sock -> и если я это сделаю, только последнее приложение (8083) работает, когда я отправляю запросы к endpoint из postman (http://MY_IP:8083/some_endpoint). Остальные 2 выдают ошибку django о том, что маршрут не найден (404)

Помогите, пожалуйста, как я могу убедиться, что все 3 приложения запущены

(http://MY_IP:8081/some1_endpoint)
(http://MY_IP:8082/some2_endpoint)
(http://MY_IP:8083/some3_endpoint)

Если вы можете указать, какую часть(и) из 1-6 можно отредактировать, было бы здорово. Заранее спасибо.

Вы упомянули, что gunicorn.sock работает (для одного из сайтов). Была ли перезапущена конфигурация сокетов и служб после внесения первоначальных изменений и запущены ли все службы?

sudo systemctl restart <name>.socket
sudo systemctl restart <name>.service
sudo systemctl status <name>.service

Доступны ли эти службы напрямую (т.е. без использования nginx в качестве прокси)? Рассмотрите возможность модификации gunicorn exec и просмотрите журнал ошибок.

ExecStart=/home/ubuntu/NTH_project/venv/bin/gunicorn --workers 3 --error-logfile /path/to/error.log ...

После подтверждения доступности сервисов, проверьте конфигурацию nginx на наличие ошибок, убедившись, что proxy_params находится в ожидаемом месте, или удалите эту строку, если это проблематично, и введите все необходимые настройки прокси напрямую.

sudo nginx -t

После проверки перезапустите nginx, чтобы восстановить сокетное соединение с Gunicorn и убедиться в отсутствии дальнейших проблем.

sudo systemctl restart nginx
sudo systemctl status nginx
tail var/log/nginx/error.log
Вернуться на верх