通过子域在同一 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.conf
和gunicorn.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 项目的主要内容,如果未能解决你的问题,请参考以下文章
使用 Plesk Obsidian 在同一订阅中的多个通配符域