Django 多项目单域名部署方法

73 阅读2分钟

通常情况下,我们会将 Django 项目部署在不同的域名或子域名下,也就是一个项目对应一个域名。但是,也存在一种情况是多个完全不同的 Django 项目需要部署在同一个域名下,并且每个项目拥有不同的 URL 路径。 这种部署方式可以方便地在同一台服务器上开发和测试多个 Django 项目,只需访问不同的 URL 即可。下面是一些常见的问题:

  • 如何在 Apache 下使用 mod_python 或 mod_wsgi 设置多个 Django 项目?
  • 如何在 urls.py 中进行相应的配置?
  • 如何设置 Apache 的配置文件和虚拟环境?

huake_00198_.jpg

2、解决方案

方法一:使用多个应用程序 这种方法适用于项目里面有多个应用程序的情况。可以将所有应用程序放在同一个 Django 项目中,然后在 urls.py 中分别配置每个应用程序的 URL 路径。这种方式的好处是项目管理起来比较简单,也不需要做额外的配置。

方法二:使用子域名 这种方法适用于项目之间关联性较小的情况。可以为每个项目创建一个子域名,然后将项目部署到相应的子域名下。这样,每个项目都有自己的域名,可以通过不同的子域名来访问不同的项目。

方法三:使用多个 WSGI 脚本 这种方法适用于每个项目都是独立的应用程序的情况。可以为每个项目创建一个单独的 WSGI 脚本,然后在 Apache 的配置文件中分别配置这些脚本。这样,每个项目都可以独立运行,并且可以通过不同的 URL 路径来访问。

方法四:使用 Apache 中的 mod_wsgi 这种方法适用于在 Apache 中使用 mod_wsgi 来部署 Django 项目。可以将每个项目部署到不同的 Apache 虚拟主机下,然后在虚拟主机中配置相应的 WSGI 脚本。这样,每个项目都可以独立运行,并且可以通过不同的 URL 路径来访问。

以下是一些具体的配置示例:

Apache 配置

<VirtualHost *:80>
    ServerName example.com
    ServerAlias www.example.com

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

    <Directory /path/to/project1/apache>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

<VirtualHost *:80>
    ServerName example2.com
    ServerAlias www.example2.com

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

    <Directory /path/to/project2/apache>
        Order deny,allow
        Allow from all
    </Directory>
</VirtualHost>

Django 配置

# settings.py

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/'

# urls.py

from django.conf.urls.defaults import patterns, include

urlpatterns = patterns('',
    url(r'^gallery/', include('gallery.urls')),
    url(r'^blog/', include('blog.urls')),
)