多个Django站点与Apache及mod_wsgi搭配使用
我想在同一台使用 Debian 5 的服务器上托管几个网站,比如我有 site1
、site2
和 site3
,假设我的 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
配置的 WSGI 文件,路径是 /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()
我该如何添加 site2
和 site3
,这两个网站都是基于 Django 的,和 site1
一样提供服务呢?
2 个回答
把所有的虚拟主机配置放在一个地方是可以的,但Debian有自己的做法,它把每个网站的配置文件分开放在/etc/apache2/sites-available目录下,然后通过在../sites-enabled目录中创建链接来激活这些配置。这样,服务器管理员就可以为每个网站的管理员用户分配不同的访问权限,脚本也可以检查某个网站是否处于激活状态等等。
总的来说,能有一个集中式的Django管理安装指南会很好,现在有那么多不同的文档、链接和博客文章,反而不太方便大家使用Django。
你的 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>
我还添加了缺失的 Directory 设置,以便允许访问静态文件。不过你还是要检查一下路径。
确保你阅读以下内容:
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 代码只需要是线程安全的。除了上面的配置外,还需要在每个 Django 的 VirtualHost 中添加 WSGIDaemonProcess 和 WSGIProcessGroup,守护进程组的名称在每个 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