Nginx & Django & Gunicorn – Umleitung der Subdomäne zur App

Nginx & Django & Gunicorn – Umleitung der Subdomäne zur App

Ich habe ausführlich zu diesem Thema gesucht, aber nichts konnte mir helfen.

Ich erstelle derzeit eine Django-Site und verwende Nginx als Reverse-Proxy für Gunicorn.

Ich versuche, meine Apps in Subdomänen aufzuteilen. (blog.example.com, admin.example.com, user.example.com usw.)

Ich habe mich um die DNS-Einträge gekümmert und sie funktionieren entsprechend, da mein ursprüngliches Projekt nur Nginx verwendet hat.

Ich kann auf die Apps zugreifen, indem ich zum „Unterordner“ example.com/blog navigiere.

Die Konfiguration sieht folgendermaßen aus:

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

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

Ich habe einen weiteren Serverblock für blog.example.com hinzugefügt und /blog in die Proxy_Pass-Zeile eingefügt: proxy_pass http://unix:/run/gunicorn.sock/blog;in der Hoffnung, dass eine Weiterleitung zum App-Ordner erfolgt.

Ich bin mit der Socket-Methode noch nicht vertraut und weiß nicht, wie ich die Umleitung erreiche.

Mir ist bewusst, dass Nginx die Weiterleitung und alles andere handhaben sollte, aber ich weiß nicht, wie ich weiter vorgehen soll.

Jede Hilfe wird sehr geschätzt.

Antwort1

Sie könnten einen Gunicorn-Dienst pro App haben:

/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

Verweisen Sie nginx dann auf die entsprechenden .sockDateien:

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

Antwort2

Du solltest benutzenseparate Service- und Socket-Dateienfür jede App und Nutzungexplizite Hosts statt Unix-Sockets.

Ersetzen Sie die Begriffe unix:/run/blogdurch etwas wie 127.0.0.1:8000in IhremSteckdoseUndServicefiles. WorkingDirectoryParameter sollte in allen Servicedateien gleich sein, er sollte auf das Verzeichnis verweisen, das enthält manage.py. Schließlich sollten Sie proxy_pass http://127.0.0.1:8000/blog/;in IhremnginxKonfig.

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

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

verwandte Informationen