多个Django站点与Apache&mod_wsgi

我想在使用Debian 5的同一台服务器上托pipe几个站点,比如我有site1site2site3 ,并假设我的ip是155.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> 

这里是我的site1 wsgiconfiguration,在/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

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

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

最后,不要将DocumentRoot设置为Django代码的位置,因为如果你填充了Apacheconfiguration,它会更容易意外地暴露你的源代码下载。 所以,从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> 

我也添加了缺less的目录指令,允许访问静态文件。 但是,您应该查看path。

确保你阅读:

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实例推送到它自己独立的进程中。 这允许这些进程是multithreading的,即使主要的Apache进程由于PHP而被强制为单线程。 与使用prefork MPM的embedded模式下在每个进程中运行多个Django实例相比,最终结果将less得多。 您的Django代码只需要线程安全。 除了上面的configuration之外,还可以将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

把所有的virtualHostconfiguration放在一个地方工作正常,但Debian有自己的概念,把/ etc / apache2 / sites-available中的每个站点的文件分开放在一个文件中,这些文件通过../sites-enabled中的symlinking激活。 通过这种方式,服务器pipe理员也可以为每个site-admin unix用户的configuration文件分配不同的访问权限,脚本可以检查一个站点是否处于活动状态等。

基本上,有一个Django-Admin安装的核心howto是很好的,目前大量单独的文档,链接和博客文章对Django的扩散没有什么帮助。