You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单Django项目多应用绑定多域名的Apache部署配置咨询

单Django项目多应用绑定独立域名的Apache2部署方案

核心思路

无需为每个应用单独创建wsgi.py文件,利用Apache虚拟主机将所有域名请求导向同一个项目wsgi入口,再通过Django的域名路由分发机制,根据请求的Host头将流量转发到对应应用的URL配置。同时保持共用同一个virtualenv和分表的MySQL数据库。

Apache2虚拟主机配置

在Apache的sites-available目录下创建三个虚拟主机配置文件(或合并到一个文件),每个域名对应一个<VirtualHost>块,全部指向项目的wsgi.py文件,并共用同一个Python虚拟环境:

示例配置(app1.domain.com,其余域名配置逻辑一致)

<VirtualHost *:80>
    ServerName app1.domain.com

    # 替换为你的pyenv虚拟环境路径和项目根路径
    WSGIDaemonProcess mydjango python-home=/home/your_user/.pyenv/versions/mydjango_env python-path=/var/www/mydjango
    WSGIProcessGroup mydjango

    # 指向项目根目录下的wsgi.py
    WSGIScriptAlias / /var/www/mydjango/mydjango/wsgi.py

    # 静态文件映射,替换为你的静态文件目录
    Alias /static/ /var/www/mydjango/static/
    <Directory /var/www/mydjango/static/>
        Require all granted
    </Directory>

    # wsgi.py文件权限配置
    <Directory /var/www/mydjango/mydjango/>
        <Files wsgi.py>
            Require all granted
        </Files>
    </Directory>
</VirtualHost>
  • 三个虚拟主机可共用同一个WSGIDaemonProcess进程组,确保python-home指向同一个virtualenv路径即可。
  • 替换配置中的所有路径为你的项目实际路径。

配置完成后启用站点并重启Apache:

sudo a2ensite app1.domain.com.conf
sudo a2ensite app2.domain.com.conf
sudo a2ensite app3.domain.com.conf
sudo systemctl restart apache2

Django项目路由修改

修改项目根目录下的urls.py,根据请求域名动态加载对应应用的URL配置:

根urls.py示例代码

from django.contrib import admin
from django.urls import include, path
from django.http import HttpResponseNotFound

def dispatch_by_domain(request):
    host = request.get_host()
    if host == 'app1.domain.com':
        from app1 import urls as app1_urls
        return include(app1_urls)
    elif host == 'app2.domain.com':
        from app2 import urls as app2_urls
        return include(app2_urls)
    elif host == 'app3.domain.com':
        from app3 import urls as app3_urls
        return include(app3_urls)
    else:
        return HttpResponseNotFound("Invalid domain")

urlpatterns = [
    path('', dispatch_by_domain),
    # 如需全局admin后台则保留,否则可移除
    path('admin/', admin.site.urls),
]

数据库分表配置

每个应用的models.py中,通过db_table参数指定对应的数据表:

class App1Model(models.Model):
    # 字段定义
    class Meta:
        db_table = 'app1_core_data'

验证步骤

  1. 确认所有域名的DNS解析已指向服务器IP。
  2. 访问每个域名,检查是否加载对应应用的页面。
  3. 测试数据写入操作,确认数据存储到对应分表中。
  4. 检查静态文件加载状态,若异常调整Apache的静态文件Alias配置。

内容的提问来源于stack exchange,提问作者Balaji Gandham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 07:30:13