在单一域名上运行多个Django实例

9 投票
6 回答
6845 浏览
提问于 2025-04-16 01:11

我想找个好方法,在同一台服务器上安装多个完全不同的Django项目,而且只用一个域名。我的意思是,我希望能通过类似这样的地址来访问:

http://192.168.0.1/gallery/ # 一个Django照片库项目
http://192.168.0.1/blog/ # 一个博客项目

这样,我就可以在同一台服务器上开发和测试多个Django项目,只需要访问不同的URL。(注意:我觉得Django的Sites模块不适合我,因为这些项目需要是独立的)。举个例子,PHP的行为就类似,我可以在同一台服务器上安装像php-gallery和phpmyadmin这样的项目,只需不同的URL路径。

有没有人知道如何在同一台服务器上使用Apache(配合mod_python或mod_wsgi)设置多个Django项目,且每个项目有不同的URL的好资源?我想了解的内容包括如何设置apache.conf,可能的虚拟环境设置,以及如何修改urls.py来适应这种情况。我看到的大多数Django部署示例都是针对每个域名或子域名一个应用的。
任何建议都非常感谢。

谢谢,
Joe

6 个回答

3

其他人已经讨论过在一个Django项目中使用多个应用。如果你指的是不同的项目,或者每个项目里只有一个应用,那么简单的说,如果你使用mod_wsgi的话,每个项目就需要用一个单独的WSGIScriptAlias指令。这样做可以让每个项目独立运行。你还可以选择把每个项目分配给一个mod_wsgi守护进程组,这样就可以单独重启每个项目,而不需要重启整个Apache服务器。不过,守护进程模式只是一个额外的选项,并不是解决问题的关键。

6

在你的问题中,你似乎把 projectsapps 混用。其实它们在 Django 中是不同的概念。一个 project 包含了设置文件、数据库配置和整体的 URL 配置,它是你在域名根目录下想要的东西。而 app 是一段独立的功能代码,通常只完成一个特定的任务。

如果你想部署多个应用,你需要创建一个单独的项目,然后把每个应用复制到这个项目的目录里。如果你查看教程,你会看到如何在 URL 配置中包含一个应用。只需对每个应用重复这个步骤,确保正则表达式是正确的。

这里的关键是,你要让 Apache 服务器为你的整个 Django 项目工作,然后使用 Django 的内部 URL 配置来设置每个应用的访问路径。不要试图在同一个 URL 的根目录下运行多个项目——这几乎肯定是错误的做法。

如果你是指在一个域名下运行多个项目,我们通常用子域名来解决这个问题。

因为我们构建的 Django 项目通常是在部署时放在域名的根目录下,所以如果你使用 app1.example.comapp2 等等,你可以像部署时那样进行测试,确保每个域名的根目录都是正确的。你可以像配置顶级域名一样配置子域名,然后迁移到最终的部署就会很简单。

如果你想这样实际部署应用,创建一个总的 Django 项目,并使用 URL 配置将每个 Django 应用放在不同的子 URL 下。

16

我曾经遇到过不能使用子域名的情况,其实在Django中处理这个问题的方法很简单。

在你的设置文件中,几乎所有的内容都和普通的Django应用一样,唯一需要注意的是确保这些设置包含你的项目路径:

MEDIA_URL = 'http://192.168.0.1/gallery/media/'
ADMIN_MEDIA_PREFIX = '/gallery/admin_media/'
SESSION_COOKIE_PATH = '/gallery'
LOGIN_REDIRECT_URL = '/gallery/'
LOGIN_URL = '/gallery/accounts/login/'
LOGOUT_URL = '/gallery/accounts/logout/'

SESSION_COOKIE_PATH这个设置非常重要,它可以防止你在同一个域名下的所有应用互相覆盖对方的cookie。

以上的说明应该涵盖了Django这边的设置,但在网络服务器那边还有更多工作要做。例如,如果你使用的是apache+mod_wsgi,你需要确保每个项目都有自己的wsgi脚本,并且是这样加载的:

WSGIScriptAlias /gallery /path/to/gallery/apache/gallery.wsgi
Alias /gallery/media /path/to/gallery/media
Alias /gallery/admin_media /path/to/gallery/venv/lib/python2.6/site-packages/django/contrib/admin/media

等等。

撰写回答