python - 具有 apache 和 mod_wsgi 的多个 django 站点

标签 python django apache2 hosting mod-wsgi

我想在使用 Debian 5 的同一台服务器下托管多个站点,比如我有 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 的 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()

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

最佳答案

您的 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 代码只需要是线程安全的。除上述配置外,还需要为每个 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

关于python - 具有 apache 和 mod_wsgi 的多个 django 站点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1553165/

相关文章:

python - Apache 2 + mod_wsgi + WSGIScriptAlias

python - 图像分类器训练期间准确率接近 100%,但测试/验证期间准确率 <50%

python - 如何使用 unicode 字符重命名/替换所有文件和关联文件夹的特定关键字?

python - 如何在 Mongoengine 上创建抽象模型?

python - Django 中的负整数

python - 使用 apache 和 mod_wsgi 的 Flask hello world 仅在 webroot 中显示文件

javascript - Python 网络抓取 - 从哪里开始

python - 如何在 python 中将字符串拆分为列表并将两个已知标记合并为一个?

java - 在django框架中使用java代码

apache - 在 Linux + Apache2 中实现强制门户时绕过 iOS CNA