两个Django项目同时运行,mod_wsgi代理werid

两个Django项目同时运行,mod_wsgi代理werid,django,mod-wsgi,Django,Mod Wsgi,我试图同时运行两个Django项目。我碰巧在使用mod_wsgi,发现这个网站的行为很奇怪。也许会有一个解决办法,但我想知道我遗漏了什么,以及如何解决这个问题 在apache配置中 # Setup the Python environment # As root owns basically everything on a Amazon AMI and root # cannot be used. Create a folder under /var/run/wsgi # with the ow

我试图同时运行两个Django项目。我碰巧在使用mod_wsgi,发现这个网站的行为很奇怪。也许会有一个解决办法,但我想知道我遗漏了什么,以及如何解决这个问题

在apache配置中

# Setup the Python environment
# As root owns basically everything on a Amazon AMI and root
# cannot be used. Create a folder under /var/run/wsgi
# with the owner as ec2-user and group ec2-user.
WSGISocketPrefix /var/run/wsgi
# Call your daemon process a name
WSGIDaemonProcess pydaemon processes=1 threads=5
# Call your daemon process group a name
WSGIProcessGroup pydaemon
# Point to where the handler file is. This will be different
# If you are using some other framework.
WSGIScriptAlias /test /var/www/html/test/wsgi.py
WSGIScriptAlias /proto /var/www/html/proto/wsgi.py
Apache重新启动后,如果我连接到“/proto”,则会显示proto站点。但是,如果我连接到“/test”,而不重新启动Apache,则仍会显示原型站点,并且我无法访问测试站点

现在我重新启动Apache,这次我首先转到“/test”。测试场地来了!但是,如果我转到“/proto”,它仍然显示测试站点,而不是proto站点

是什么让这一切发生的?为了以防万一,我为每个应用程序添加了不同的会话路径,但问题仍然存在


[更新]

我还尝试了以下方法,给不同的WSGI应用程序组命名,但运气不好

Alias /cuedit /var/local/test/wsgi.py
<Location /test>
SetHandler wsgi-script
Options +ExecCGI
WSGIApplicationGroup test
</Location>
Alias /proto /var/local/proto/wsgi.py
<Location /proto>
SetHandler wsgi-script
Options +ExecCGI
WSGIApplicationGroup proto
</Location>
Alias/cuedit/var/local/test/wsgi.py
SetHandler wsgi脚本
选项+执行CGI
WSGIApplicationGroup测试
别名/proto/var/local/proto/wsgi.py
SetHandler wsgi脚本
选项+执行CGI
WSGIApplicationGroup协议

[更新]

我从守护程序模式改为嵌入式模式。我猜问题在于两个实例共享同一个mod_wsgi守护进程,因此它们的命名空间冲突


我希望它们应该得到正确的处理,但在守护进程模式下,我无法正确处理

问题可能与Apache在WSGI应用程序之间共享Python子解释器有关。尝试将此添加到Apache配置以避免共享:

WSGIApplicationGroup %{GLOBAL}

查看深入的解释和其他提示(也查看注释)。

我也有两个Django项目,但是每个项目都运行在不同的端口(httpd config)上,看起来像这样:

<VirtualHost *:80>
    ServerAdmin xx
    ServerName xx
    ServerAlias xx
    ErrorLog /path/to/first/project/logs/error.log
    CustomLog /path/to/first/project/logs/access.log combined

    Alias /static/ /path/to/first/project/sitestatic

    WSGIDaemonProcess app processes=1 threads=15 display-name=%{GROUP}
    WSGIProcessGroup app

    WSGIScriptAlias / /path/to/first/project/django.wsgi

    <Directory /path/to/first/project/apache>
       Order deny,allow
       Allow from all
     </Directory>
</VirtualHost>

<VirtualHost *:8080>
    ServerAdmin xx
    ServerName xx
    ServerAlias xx
    ErrorLog /path/to/second/project/logs/error.log
    CustomLog /path/to/second/project/logs/access.log combined

    WSGIDaemonProcess app1 processes=1 threads=15 display-name=%{GROUP}
    WSGIProcessGroup app1

    WSGIScriptAlias / /path/to/second/project/apache/django.wsgi

     <Directory /path/to/second/project/apache>
         Order deny,allow
         Allow from all
     </Directory>
</VirtualHost>

服务器管理员xx
服务器名xx
服务器别名xx
ErrorLog/path/to/first/project/logs/error.log
CustomLog/path/to/first/project/logs/access.log组合
别名/static//path/to/first/project/sitestatic
WSGIDaemonProcess app PROCESS=1线程=15显示名称=%{GROUP}
WSGIProcessGroup应用程序
WSGIScriptAlias//path/to/first/project/django.wsgi
命令拒绝,允许
通融
服务器管理员xx
服务器名xx
服务器别名xx
ErrorLog/path/to/second/project/logs/error.log
CustomLog/path/to/second/project/logs/access.log组合
WSGIDaemonProcess app1 PROCESS=1线程=15显示名称=%{GROUP}
WSGIProcessGroup app1
WSGIScriptAlias//path/to/second/project/apache/django.wsgi
命令拒绝,允许
通融

将此作为解决方法:

WSGIDaemonProcess pydaemon-1 processes=1 threads=5
WSGIDaemonProcess pydaemon-2 processes=1 threads=5

WSGIScriptAlias /test /var/www/html/test/wsgi.py

<Location /test>
WSGIProcessGroup pydaemon-1
WSGIApplicationGroup %{GLOBAL}
</Location>

WSGIScriptAlias /proto /var/www/html/proto/wsgi.py

<Location /proto>
WSGIProcessGroup pydaemon-2
WSGIApplicationGroup %{GLOBAL}
</Location>
WSGIDaemonProcess pydaemon-1进程=1线程=5
WSGIDaemonProcess pydaemon-2进程=1线程=5
WSGIScriptAlias/test/var/www/html/test/wsgi.py
WSGIProcessGroup pydaemon-1
WSGIApplicationGroup%{GLOBAL}
WSGIScriptAlias/proto/var/www/html/proto/wsgi.py
WSGIProcessGroup pydaemon-2
WSGIApplicationGroup%{GLOBAL}
这将迫使每个应用程序进入单独的守护进程组,并且它们不应该相互干扰


如果这仍然不起作用,那么您的WSGI脚本文件可能会出现问题。

无法对Graham给出的答案发表评论,因此添加我自己的答案

对我来说,真正的问题是Python解释器,但我还必须为每个解释器添加Python路径。下面是一个配置示例:

WSGIDaemonProcess py_app1 processes=1 threads=5 python-path=/path/to/app1
WSGIScriptAlias /app1 /path/to/app1/wsgi.py
<Directory /path/to/app1>
    <Files wsgi.py>
        Order deny,allow
        Allow from all
    </Files>
</Directory>
<Location /app1>
    WSGIProcessGroup py_app1
    WSGIApplicationGroup %{GLOBAL}
</Location>

WSGIDaemonProcess py_app2 processes=1 threads=5 python-path=/path/to/app2
WSGIScriptAlias /app2 /path/to/app2/wsgi.py
<Directory /path/to/app2>
    <Files wsgi.py>
        Order deny,allow
        Allow from all
    </Files>
</Directory>
<Location /app2>
    WSGIProcessGroup py_app2
    WSGIApplicationGroup %{GLOBAL}
</Location>
wsgidaemonprocesspy\u app1进程=1线程=5 python路径=/path/to/app1
WSGIScriptAlias/app1/path/to/app1/wsgi.py
命令拒绝,允许
通融
WSGIProcessGroup py_app1
WSGIApplicationGroup%{GLOBAL}
WSGIDaemonProcess py_app2 processes=1 threads=5 python path=/path/to/app2
WSGIScriptAlias/app2/path/to/app2/wsgi.py
命令拒绝,允许
通融
WSGIProcessGroup py_app2
WSGIApplicationGroup%{GLOBAL}

请不要将代码放在
/var/www/html
下。在每种情况下,我在Apache错误日志中都没有发现错误,而访问日志显示每个目录上都有HTTP GETcorrectly@DanielRoseman你的意思是放在HTML目录之外吗?是的。这是代码,不是HTML。你不想冒着被按原样提供的风险。把它放在webroot之外。你肯定不想要这个。这将迫使它们以相同的方式运行,而不是分开运行。默认值应为“WSGIApplicationGroup%{RESOURCE}”,将它们分开。这篇博文建议这样做是为了解决另一类问题。我猜@Lycha的解决方案也可能相关,因为尽管%{GLOBAL}强制它们在同一个环境中运行,但它禁止使用子解释器,如果问题在子解释器中,它可能已经解决了问题。很遗憾,%{GLOBAL}没有解决问题。@GrahamDumpleton%{GLOBAL}和%{RESOURCE}(默认值)都没有解决问题,但是谢谢你们的评论!你帮我了解了更多关于mod_wsgi.btw的信息,我从来没想到Graham Dumpleton会对此发表评论!我本来会详细回答的,但在国外去PyCon有点忙。解决这样的技术问题对SO来说很难。我会给出一个变通的答案。谢谢你的回答。你知道如果我不使用虚拟主机为什么会出现问题吗?这是一个被低估的答案。它完美地满足了我的需要,这正是我所希望的。非常感谢你!不过,这是一个变通办法。除非WSGIApplicationGroup被强制使用单个解释器的方式覆盖,否则您所拥有的应该可以工作。