Как настроить несколько проектов 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