使用apache和mod_wsgi的多个django站点

Hel*_*nar 57 python django hosting mod-wsgi apache2

我想举办它使用Debian的5同一服务器下的几个场所,说我有site1,site2site3,并承担我的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/
Run Code Online (Sandbox Code Playgroud)

这是我的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>
Run Code Online (Sandbox Code Playgroud)

这是我的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()
Run Code Online (Sandbox Code Playgroud)

如何添加site2site3,这都是基于Django的网站,将送达样site1

Gra*_*ton 104

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

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

最后,不要将DocumentRoot设置为Django代码的位置,因为如果填充Apache配置,它会更容易意外地将源代码暴露给下载.因此,只需从VirtualHost中删除Django站点的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>
Run Code Online (Sandbox Code Playgroud)

我还添加了缺少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代码只需要线程安全.除上述之外的配置是将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>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 哇谢谢你温柔而详细的解释格雷厄姆!我在公司内部运行我的网站,因此它没有域,但有一个内部 dns,并且只能通过 http://mysite/ 在本地访问,在这种情况下,我应该将 ServerName www.example.com 更改为 ServerName mysite 吗? (2认同)
  • 我没有说'DocumentRoot不应该在虚拟主机'.我说'不要将DocumentRoot设置为Django代码的位置'.DocumentRoot引用一个目录.如果未定义WSGIScrtipAlias,Apache将从针对DocumentRoot列出的目录中提供文件.因此,让DocumentRoot引用源代码所在的目录是不明智的,因为如果由于某种原因没有应用WSGIScriptAlias,人们可以下载源代码. (2认同)