Nginx & Django & Gunicorn - 将子域名重定向到应用程序

Nginx & Django & Gunicorn - 将子域名重定向到应用程序

我对该主题进行了广泛的搜索,但没有任何内容可以帮助我。

我目前正在构建一个 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/示例:

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 添加了另一个服务器块,并在 proxy_pass 行上添加了 /blog: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 套接字

将类似术语更改unix:/run/blog为类似127.0.0.1:8000内容插座服务文件。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-示例:

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

相关内容