61

我想在使用 Debian 5 的同一服务器下托管多个站点,假设我有和site1,并假设我的 ip 是:site2site3155.55.55.1

site1: 155.55.55.1:80  , script at /opt/django/site1/
site2: 155.55.55.1:8080, script at /opt/django/site2/
site3: 155.55.55.1:8090, script at /opt/django/site3/

这是我的 apache 默认值:

<VirtualHost *:80>
    ServerName /
    ServerAlias  */
    DocumentRoot /opt/django/site1/
    LogLevel warn
    WSGIScriptAlias / /opt/django/site1/apache/django.wsgi
    Alias /media /opt/django/site1/media/statics
    Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media 
</VirtualHost>

<VirtualHost *:80>
    DocumentRoot "/usr/share/phpmyadmin"
    ServerName /phpmyadmin
    Alias /phpmyadmin /usr/share/phpmyadmin
    <Directory /usr/share/phpmyadmin>
        Options Indexes FollowSymLinks
        AllowOverride None
        Order Deny,Allow
        Allow from all
    </Directory>
</VirtualHost>

这是我的 wsgi 配置site1,位于/opt/django/site1/apache/django.wsgi

import os, sys
import django.core.handlers.wsgi

sys.path.append('/opt/django')
sys.path.append('/opt/django/site1')

os.environ['DJANGO_SETTINGS_MODULE'] = 'site1.settings'
application = django.core.handlers.wsgi.WSGIHandler()

如何添加site2site3,它们是基于 Django 的站点,并且将像 一样提供服务site1

4

2 回答 2

108

您的 ServerName/ServerAlias 指令是错误的。ServerName 应该是主机名。您可能应该只删除 ServerAlias。

然后只需执行明显和重复的 VirtualHost/Listen 指令,只需更改文件系统中脚本的端口号和位置。

最后,不要将 DocumentRoot 设置为您的 Django 代码所在的位置,因为如果您填充 Apache 配置,它会更容易意外地公开您的源代码以供下载。因此,只需从 Django 站点的 VirtualHost 中删除 DocumentRoot 指令。

Listen 80

<VirtualHost *:80>
ServerName www.example.com
WSGIScriptAlias / /opt/django/site1/apache/django.wsgi
Alias /media /opt/django/site1/media/statics
Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media

<Directory opt/django/site1/apache>
Order allow,deny
Allow from all
</Directory>

<Directory /home/myuser/Django-1.1/django/contrib/admin/media>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Listen 8080

<VirtualHost *:8080>
ServerName www.example.com
WSGIScriptAlias / /opt/django/site2/apache/django.wsgi
Alias /media /opt/django/site2/media/statics
Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media

<Directory opt/django/site2/apache>
Order allow,deny
Allow from all
</Directory>

<Directory /home/myuser/Django-1.1/django/contrib/admin/media>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

Listen 8090

<VirtualHost *:8090>
ServerName www.example.com
WSGIScriptAlias / /opt/django/site3/apache/django.wsgi
Alias /media /opt/django/site3/media/statics
Alias /admin_media  /home/myuser/Django-1.1/django/contrib/admin/media

<Directory opt/django/site3/apache>
Order allow,deny
Allow from all
</Directory>

<Directory /home/myuser/Django-1.1/django/contrib/admin/media>
Order allow,deny
Allow from all
</Directory>
</VirtualHost>

我还添加了缺少的目录指令以允许访问静态文件。但是,您应该查看路径。

确保您阅读:

http://code.google.com/p/modwsgi/wiki/IntegrationWithDjango http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#Hosting_Of_Static_Files

了解更多信息。


更新 1

顺便说一句,由于您在同一个 Apache 中使用 PHP,因此最好使用 mod_wsgi 守护程序模式并将每个 Django 实例推送到自己的单独进程中。这允许这些进程是多线程的,即使主要的 Apache 进程由于 PHP 而被迫是单线程的。与使用 prefork MPM 在嵌入式模式下在每个进程中运行多个 Django 实例相比,最终结果将使用更少的内存。您的 Django 代码只需要是线程安全的。除了上述配置之外,还需要将 WSGIDaemonProcess/WSGIProcessGroup 添加到每个 Django VirtualHost,其中每个 VirtualHost 的守护进程组的名称不同。

<VirtualHost *:80>
WSGIDaemonProcess site1 display-name=%{GROUP}
WSGIProcessGroup site1
... existing stuff
</VirtualHost>

<VirtualHost *:8080>
WSGIDaemonProcess site2 display-name=%{GROUP}
WSGIProcessGroup site2
... existing stuff
</VirtualHost>

<VirtualHost *:8090>
WSGIDaemonProcess site3 display-name=%{GROUP}
WSGIProcessGroup site3
... existing stuff
</VirtualHost>

这也允许您更轻松地重新启动每个 Django 实例,而无需重新启动整个 Apache。读:

http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process http://code.google.com/p/modwsgi/wiki/ReloadingSourceCode

于 2009-10-12T10:13:05.123 回答
2

将所有 virtualHost 配置放在一个地方可以正常工作,但 Debian 有自己的概念,将它们分隔在 /etc/apache2/sites-available 中每个站点的文件中,通过在 ../sites-enabled 中进行符号链接来激活它们。通过这种方式,服务器管理员还可以为每个站点管理员 unix 用户分配对配置文件的单独访问权限,脚本可以检查站点是否处于活动状态等。

基本上,为 Django-Admin 安装提供一个中央操作指南会很好,当前大量单独的文档、链接和博客文章对 Django 的普及并没有真正的帮助。

于 2013-11-02T12:16:43.797 回答