配置了Apache httpd和mod_wsgi-3.4的Django app的系统用户被设置为root

时间:2013-09-16 12:31:26

标签: python django apache mod-wsgi

我在httpd。

中运行我的django网络应用程序

在httpd.conf中,这就是我所拥有的。

Listen 8090
User ctaftest
Group ctaftest

在我启动httpd服务器之后 netstat -anp |grep httpd

我得到了

root     31621     1  1 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31625 31621  5 17:23 ?        00:00:02 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31626 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31627 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31628 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31629 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start
ctaftest 31646 31621  0 17:23 ?        00:00:00 /usr/local/httpd-python/bin/httpd -k start

请注意,除了1个进程之外,所有其他httpd进程都使用ctaftest用户

运行

现在这是我的问题。

在我看来,如果我这样做

dir_path = os.path.expanduser("~/dir_path")

我正在/root/dirpath /home/ctaftest/dirpath,因为我期待/home/ctaftest/dirpath

注意:当我使用Django开发服务器(runserver)时,我得到了预期的输出,  ctaftest

当我从httpd运行时出了什么问题?当我从httpd运行我的Django webapp时,如何让用户{{1}}本身成为当前用户

3 个答案:

答案 0 :(得分:1)

您的Apache配置的其余部分中的WSGIDaemonProcess配置是什么样的?您可以在那里设置用户。

WSGIDaemonProcess mysite user=ctaftest group=ctaftest threads=5

答案 1 :(得分:1)

首先,如果你打电话:

os.path.expanduser("dir_path")

它应该只返回:

dir_path

你的意思是:

os.path.expanduser("~/dir_path")

无论如何,当您使用mod_wsgi的嵌入模式时,您的代码将在Apache子工作进程中运行。这些进程可以与其他Apache模块共享,例如PHP和Perl模块。因为它是一个共享环境,所以mod_wsgi或任何Web应用程序代码都不能放肆地认为它可以改变进程的当前工作目录。因此,当前工作目录继承自Apache的启动,这将是文件系统的根目录。

出于类似的原因,您无法覆盖可能设置的环境变量,因此,如果Apache通过HOME传递为Apache启动的root用户,那么当您使用os.path.expanduser时('〜'),代字号将被HOME设置为替换。

所以你看到的是很正常的,包括一个仍以root身份运行的进程,它是父进程,其中没有任何请求正在运行,因为它只是作为一个进程监视器来管理子进程工作进程,处理重启等。

一般来说,在Web应用程序中,依赖于当前工作目录,环境变量(如HOME,USERNAME,PATH等)的值这些事情被认为是不好的做法,因为它们并不总是设置为明智的事物取决于托管环境。

所有人都说,如果使用mod_wsgi,你改为使用首选守护进程模式,那么因为此时它只运行你的Python web应用程序,mod_wsgi将覆盖HOME作为守护程序进程运行的用户的目录如。如果设置了诸如USER,USERNAME和LOGNAME之类的环境变量,它也将类似地覆盖那些具有与守护进程运行的用户相对应的值的变量。它甚至会将当前工作目录更改为该用户的主目录。

总结。您不应该将此类依赖项构建到Web应用程序中,而是通过配置指定此类内容,否则您将限制可移植性。如果由于某种原因不想这样做,那么请使用mod_wsgi的守护进程模式。

答案 2 :(得分:0)

要解决它,接受的答案有帮助,但我必须添加

`WSGIProcessGroup` directive also

所以我配置了这样的东西。

WSGIDaemonProcess ctaf.com user=ctaftest group=ctaftest threads=10 python-path=/home/ctaftest/virtualpython/CTAFWEB_PRODUCTION/ctafweb

WSGIProcessGroup ctaf.com