通过子域在同一 Droplet 中的两个或多个 Django 项目

Posted

技术标签:

【中文标题】通过子域在同一 Droplet 中的两个或多个 Django 项目【英文标题】:Two or More Django Projects in Same Droplet via Subdomain 【发布时间】:2015-06-29 18:16:37 【问题描述】:

我有两个 django 项目。当此人访问 www.example.com 时,我希望为 django 项目 A 提供服务。

当此人访问 blog.example.com 时,我希望为 django 项目 B 提供服务。

如何在配置方面使用 nginx 和 gunicorn 实现这一目标?

我已完成子域 DNS 设置。我在提供页面的 nginx-gunicorn 方面需要帮助。

我使用了 DO 的一键安装 django,所以如果配置可以与他们的设置一致,那就太好了。

不知道这个问题是属于这里还是服务器故障。

【问题讨论】:

这篇文章可能会因为过于宽泛而被关闭,但我强烈推荐 Michał Karzyński 在Serving multiple Django applications with Nginx and Gunicorn 上的帖子。 @rnevius 谢谢。但我认为这是一个针对 nginx 和 gunicorn 的配置的具体问题。而已。除非这也太宽泛了。我肯定会检查你的链接。 您基本上需要复制 DO 设置的配置文件。分别是:/etc/init/gunicorn.conf/etc/nginx/sites-available/django.confgunicorn.conf 指向的gunicorn.py 【参考方案1】:

原理是使用 nginx 作为 HTTP 请求的代理,将它们代理到两个 gUnicorn 实例,并行运行您的两个 Django 应用程序,具体取决于它们的 Host 标头。

为此,您需要使用 nginx 设置两个不同的服务器配置。每个都有不同的server_name。这两个服务器将代理到在不同端口上运行的两个不同 gUnicorn 实例。

Nginx 配置

# Server definition for project A
server 
    listen             80;
    server_name        <projectA domain name>;

    location / 
        # Proxy to gUnicorn.
        proxy_pass             http://127.0.0.1:<projectA gUnicorn port>;
        # etc...
    


# Server definition for project B
server 
    listen             80;
    server_name        <projectB domain name>;

    location / 
        # Proxy to gUnicorn on a different port.
        proxy_pass             http://127.0.0.1:<projectB gUnicorn port>;
        # etc...
    

最好将这两个定义拆分到单独的文件中。还记得把它们链接到/etc/nginx/sites-enabled/

新贵配置

这两个文件需要放在/etc/init/中。

projecta_gunicorn.conf:

description "Gunicorn daemon for Django project A"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

# If the process quits unexpectadly trigger a respawn
respawn

setuid django
setgid django
chdir /home/django/<path to projectA>

exec /home/django/<path to project A virtualenv>/bin/gunicorn --config /home/django/<path to project A gunicorn.py> <projectA name>.wsgi:application

projectb_gunicorn.conf:

description "Gunicorn daemon for Django project B"

start on (local-filesystems and net-device-up IFACE=eth0)
stop on runlevel [!12345]

# If the process quits unexpectadly trigger a respawn
respawn

setuid django
setgid django
chdir /home/django/<path to projectB>

exec /home/django/<path to projectB virtualenv>/bin/gunicorn --config /home/django/<path to projectB gunicorn.py> <projectB name>.wsgi:application

gUnicorn 配置

项目Agunicorn.py

bind = '127.0.0.1:<projectA gUnicorn port>'
raw_env = 'DJANGO_SETTINGS_MODULE=<projectA name>.settings'

项目 Bgunicorn.py:

bind = '127.0.0.1:<projectB gUnicorn port>'
raw_env = 'DJANGO_SETTINGS_MODULE=<projectB name>.settings'

【讨论】:

感谢您的回答。逐渐带我去那里。我已经进行了所有配置并且一切顺利,除了当我访问 blog.example.com 时,我得到一个 Nginx 错误网关。 www.example.com 运行良好。但是子域一抱怨nginx的网关不好。我仍在寻找原因,也许在某个地方出错了。如果您有任何提示,请。 表示nginx无法代理请求到gUnicorn,gUnicorn实例是否在运行?如果是,是否运行在nginx配置的proxy_pass指定的端口上? 现在重新检查。我认为其中一个可能是罪魁祸首。 你知道吗,它现在可以工作了。你知道罪魁祸首是什么吗? sudo reboot 是我需要的。在重新检查和重新检查之后,我意识到一切都很完美,直到我记得 /etc/init/* 中的内容仅在重新启动后才加载。感谢您的回答。正是我正在寻找的那种指导。 你也可以跑service project[a or b]_gunicorn start!如果您希望将您对项目所做的更改考虑在内,则必须运行 service project[a or b]_gunicorn reload

以上是关于通过子域在同一 Droplet 中的两个或多个 Django 项目的主要内容,如果未能解决你的问题,请参考以下文章

IIS下具有SSL的多个子域[关闭]

使用 Plesk Obsidian 在同一订阅中的多个通配符域

将多个子域映射到同一个 Amazon S3 存储桶

如果所有子域都指向同一个网站,cookie 是不是会在多个子域之间共享? [复制]

用Scrublet推断单细胞实验中的doublet

Firebase主机在同一个项目中支持多少个域名(不是子域名)?