我有一个 django 1.1 网站,我想在 wsgi 中运行(因为这似乎是 apache 上推荐的部署)。我希望它以 www 用户身份运行(apache 以 www-data 身份运行)。我理想情况下希望这能发挥作用http://主机名/~www/(~www/public_html)以及http://虚拟主机名/。我还希望这对以后可能使用 wsgi 的其他用户也有效。我能实现这一点吗?我一直在盯着文档,试图弄清楚从哪里开始,但我无法将 userdir 和 wsgi 结合起来,让我以用户 xxx 的身份为每个用户 xxx 运行 ~xxx/public_html/index.wsgi。
答案1
首先,看看 mod_wsgi 守护进程模式。它允许您委托 WSGI 应用程序在不同的守护进程中运行。然后可以让这些进程以指定用户身份运行,而无需使用 suxec。请参阅:
http://code.google.com/p/modwsgi/wiki/QuickConfigurationGuide#Delegation_To_Daemon_Process
如果要运行 UserDir 配置的目录,而用户有权控制应用程序的安装位置,则不能使用 WSGIScriptAlias,而需要使用 AddHandler 方法来设置 mod_wsgi。请参阅:
http://code.google.com/p/modwsgi/wiki/ConfigurationGuidelines#The_Apache_Alias_Directive
UserDir 指令隐式提供 Alias 指令,因此您只需要担心 AddHandler 指令等。
但请注意,由于 Apache 中的优先规则,您可能无法在“/”处使用 WSGIScriptAlias 作为同一虚拟主机,因为这可能会掩盖用户目录。这意味着您需要依靠 AddHandler 和 mod_rewrite 修复程序,如果按照文档该部分后面部分所述安装在站点根目录上。
建议您使用官方 mod_wsgi 邮件列表来了解更多详细信息。
答案2
我的具体问题是通过以下方式解决的:
在 VirtualHost 块中:
DocumentRoot /home/www/public_html WSGIDaemonProcess ~www user=www group=www
在 userdir.conf 中:
RewriteEngine On RewriteCond %{REQUEST_URI} ^/~([^/]+) RewriteRule . - [E=URL_USER:~%1] WSGIProcessGroup %{ENV:URL_USER}
在 ~www/public_html/.htaccess 中
Options +ExecCGI RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ /~www/index.wsgi/$1 [QSA,PT,L] RewriteRule ^$ /~www/index.wsgi/$1 [QSA,PT,L]
还有一些我并不真正需要的东西:
目录.conf:
DirectoryIndex index.wsgi
wsgi.conf
AddHandler wsgi-script .wsgi