Nginx & Django & Gunicorn – Redirecionando subdomínio para aplicativo

Nginx & Django & Gunicorn – Redirecionando subdomínio para aplicativo

Fiz uma extensa pesquisa sobre o assunto, mas nada poderia me ajudar.

Atualmente estou construindo um site Django e usando o Nginx para reverter o proxy para o Gunicorn.

Estou tentando separar meus aplicativos em subdomínios. (blog.example.com, admin.example.com, user.example.com etc.)

Cuidei dos registros DNS e eles estão funcionando adequadamente, pois meu projeto inicial usava apenas Nginx.

Posso acessar os aplicativos navegando até a "subpasta" example.com/blog.

A configuração fica assim:

/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/exemplo:

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;
    }
} 

Adicionei outro serverblock para blog.example.com e adicionei /blog na linha proxy_pass: proxy_pass http://unix:/run/gunicorn.sock/blog;esperando que ele redirecione para a pasta do aplicativo.

Sou novo no método de soquete e não sei como conseguir o redirecionamento.

Estou ciente de que o Nginx deve lidar com o redirecionamento e tudo mais, mas não sei como prosseguir.

Qualquer ajuda é muito apreciada.

Responder1

Você poderia ter um serviço gunicorn por aplicativo:

/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

Em seguida, aponte o nginx para os respectivos .sockarquivos:

/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;
    }
}

Responder2

Você deveria usararquivos de serviço e soquete separadospara cada aplicativo e usohosts explícitos em vez de soquetes unix.

Mude os termos unix:/run/blogcom algo como 127.0.0.1:8000no seutomadaeserviçoarquivos. WorkingDirectoryO parâmetro deve ser o mesmo em todos os arquivos de serviço, deve apontar o diretório que contém manage.py. Finalmente você deve definir proxy_pass http://127.0.0.1:8000/blog/;em seunginxconfiguração.

/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/;
    }
} 

informação relacionada