![Nginx & Django & Gunicorn — перенаправление поддомена в приложение](https://rvso.com/image/747332/Nginx%20%26%20Django%20%26%20Gunicorn%20%E2%80%94%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BD%D0%B0%D0%BF%D1%80%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%BF%D0%BE%D0%B4%D0%B4%D0%BE%D0%BC%D0%B5%D0%BD%D0%B0%20%D0%B2%20%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B5.png)
Я провел обширный поиск по этой теме, но ничего не помогло.
В настоящее время я создаю сайт на Django и использую Nginx для обратного прокси-сервера к Gunicorn.
Я пытаюсь разделить свои приложения на поддомены. (blog.example.com, admin.example.com, user.example.com и т. д.)
Я позаботился о записях DNS, и они работают соответствующим образом, поскольку мой первоначальный проект использовал только Nginx.
Я могу получить доступ к приложениям, перейдя в «подпапку» example.com/blog.
Конфигурация выглядит так:
/etc/systemd/system/gunicorn.socket:
[Unit]
Description=Gunicorn socket for example.com
[Socket]
ListenStream=/run/example.sock
[Install]
WantedBy=sockets.target
/etc/systemd/system/gunicorn.service:
[Unit]
Description=gunicorn daemon for example.com
Requires=gunicorn.socket
After=network.target
[Service]
User=example
Group=www-data
WorkingDirectory=/home/example/project
ExecStart=/home/sammy/project/projectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/gunicorn.sock \
project.wsgi:application
[Install]
WantedBy=multi-user.target
/etc/nginx/sites-available/example:
server {
listen 80;
server_name server_domain_or_IP;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/example/project;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/gunicorn.sock;
}
}
Я добавил еще один блок сервера для blog.example.com и добавил /blog в строку proxy_pass: proxy_pass http://unix:/run/gunicorn.sock/blog;
надеясь, что он перенаправит в папку приложения.
Я новичок в методе сокетов и не знаю, как добиться перенаправления.
Я знаю, что Nginx должен обрабатывать перенаправление и все такое, но не знаю, как действовать дальше.
Любая помощь будет высоко оценена.
решение1
У вас может быть одна служба gunicorn на приложение:
/etc/systemd/system/blog.example.com.service
[Unit]
Description=gunicorn daemon for blog.example.com
Requires=gunicorn.socket
After=network.target
[Service]
User=example
Group=www-data
WorkingDirectory=/home/example/project/blog
ExecStart=/home/sammy/project/projectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/blog.example.com.sock \
project.wsgi:application
[Install]
WantedBy=multi-user.target
/etc/systemd/system/admin.example.com.service
[Unit]
Description=gunicorn daemon for admin.example.com
Requires=gunicorn.socket
After=network.target
[Service]
User=example
Group=www-data
WorkingDirectory=/home/example/project/admin
ExecStart=/home/sammy/project/projectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind unix:/run/admin.example.com.sock \
project.wsgi:application
[Install]
WantedBy=multi-user.target
Затем укажите nginx на соответствующие .sock
файлы:
/etc/nginx/sites-available/blog.example.com
server {
listen 80;
server_name blog.example.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/example/project;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/blog.example.com.sock;
}
}
/etc/nginx/sites-available/admin.example.com
server {
listen 80;
server_name admin.example.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/example/project;
}
location / {
include proxy_params;
proxy_pass http://unix:/run/admin.example.com.sock;
}
}
решение2
Вам следует использоватьотдельные файлы служб и сокетовдля каждого приложения и использованияявные хосты вместо unix-сокетов.
Измените термины like unix:/run/blog
на что-то подобное 127.0.0.1:8000
в вашемразъемиуслугаfiles. WorkingDirectory
параметр должен быть одинаковым во всех служебных файлах, он должен указывать на каталог, содержащий manage.py
. Наконец, вы должны установить proxy_pass http://127.0.0.1:8000/blog/;
в вашемnginxконфиг.
/etc/systemd/system/blog.example.com.socket
Unit]
Description=Gunicorn socket for blog.example.comg
[Socket]
ListenStream=8000
[Install]
WantedBy=sockets.target
/etc/systemd/system/blog.example.com.service
[Unit]
Description=gunicorn daemon for blog.example.com
Requires=blog.example.com.socket
After=network.target
[Service]
User=example
Group=www-data
WorkingDirectory=/home/example/project/blog
ExecStart=/home/sammy/project/projectenv/bin/gunicorn \
--access-logfile - \
--workers 3 \
--bind 127.0.0.1:8000 \
project.wsgi:application
[Install]
WantedBy=multi-user.target
/etc/nginx/sites-available/blog-example:
server {
listen 80;
server_name blog.example.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/example/project;
}
location / {
include proxy_params;
proxy_pass http://127.0.0.1:9000/blog/;
}
}