【问题标题】:Serving two Django apps with Nginx使用 Nginx 为两个 Django 应用程序提供服务
【发布时间】:2020-09-27 12:55:18
【问题描述】:

我在 mysite.com 上有一个使用 Nginx 和 Gunicorn 运行的 Django 应用程序。我想部署第二个 Django 应用程序,以便在 mysite.com/secondapp 下可以访问,而我的第一个应用程序仍然只能通过 mysite.com em>

我按照 DigitalOcean 的教程进行操作,我目前对 App 1 的配置是:

/etc/systemd/system/gunicorn.socket

[Unit]
Description=gunicorn socket

[Socket]
ListenStream=/run/gunicorn.sock

[Install]
WantedBy=sockets.target

/etc/systemd/system/gunicorn.service

[Unit]
Description=gunicorn daemon
Requires=gunicorn.socket
After=network.target

[Service]
User=sammy
Group=www-data
WorkingDirectory=/home/sammy/myprojectdir
ExecStart=/home/sammy/myprojectdir/myprojectenv/bin/gunicorn \
          --access-logfile - \
          --workers 3 \
          --bind unix:/run/gunicorn.sock \
          myproject.wsgi:application

/etc/nginx/sites-available/myproject

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location /static/ {
        root /home/sammy/myprojectdir;
    }

    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
}

我的问题是:我是否需要为我的 App 2 创建 2 个单独的 .socket.service 文件以及如何让 App 2 可供 访问mysite.com/secondapp ?

【问题讨论】:

  • 除了@mgsxman给出的答案,看thisQ/A。
  • 非常感谢。它看起来完全符合我的需要。

标签: django nginx gunicorn


【解决方案1】:

是的,您需要创建 2 个单独的 .socket.service 文件。

然后您的 Nginx 配置将如下所示:

server {
    listen 80;
    server_name server_domain_or_IP;

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /static/ {
        root /home/sammy/myprojectdir;
    }
    location = /secondapp/static/ {
        root /home/sammy/myprojectdir-app2;
    }


    location / {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn.sock;
    }
    location /secondapp/ {
        include proxy_params;
        proxy_pass http://unix:/run/gunicorn-app2.sock:/;
    }
}

请注意,您必须将第二个应用配置为在正确位置搜索静态。

更新:

第二个应用程序上的所有路由也应从/route_path/ 更改为/secondapp/route_path/

【讨论】:

  • 感谢您的回答!在为第二个应用创建 .socket 和 .service 之前,我决定尝试添加 location /firstapp/ { include proxy_params; proxy_pass unix:/run/gunicorn.sock; } 来测试它是否工作。出于某种原因,我得到“未找到。在此服务器上找不到请求的 URL /firstapp/”。 Nginx 错误日志没有显示任何有用的信息。
  • 注意proxy_pass http://unix:/run/gunicorn-app2.sock:/; 处的尾随:/,因为套接字根是/,它接受连接。
  • 查看更新,尝试在第二个应用更改路线,然后离开proxy_pass http://unix:/run/gunicorn-app2.sock;
  • 效果很好,最后没有“:/”。您能否解释一下为什么我们不需要在“站点可用”中为 app2 创建单独的条目,而是将其附加到 app1 配置中?
  • 因为你不能在两个不同的配置中使用相同的server_name server_domain;。但是,如果您能够使用其他域名,例如server_name server_domain-app2;,这将是可能的
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 2015-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 2023-03-15
相关资源
最近更新 更多