Python Django应用程序的系统用户,配置了Apache httpd并将mod_wsgi-3.4设置为root

Python Django应用程序的系统用户,配置了Apache httpd并将mod_wsgi-3.4设置为root,python,django,apache,mod-wsgi,Python,Django,Apache,Mod Wsgi,我正在httpd中运行我的django web应用程序 在httpd.conf中,这就是我所拥有的 Listen 8090 User ctaftest Group ctaftest 当我启动httpd服务器时 netstat-anp | grep httpd 我明白了 请注意,除了1个进程之外,所有其他httpd进程都使用ctaftest用户运行 这就是我的问题 在我看来,如果我这样做的话 dir_path = os.path.expanduser("~/dir_path") 我得到了/ro

我正在httpd中运行我的django web应用程序

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

Listen 8090
User ctaftest
Group ctaftest
当我启动httpd服务器时
netstat-anp | grep httpd

我明白了

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

这就是我的问题

在我看来,如果我这样做的话

dir_path = os.path.expanduser("~/dir_path")
我得到了
/root/dirpath
我期望的
/home/ctaftest/dirpath

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


当我从httpd运行时有什么问题?当我从
httpd
运行Django webapp时,如何让用户
ctaftest
本身成为当前用户?Apache配置的其余部分中的WSGIDaemonProcess配置是什么样子的?您可以在那里设置用户

WSGIDaemonProcess mysite user=ctaftest group=ctaftest threads=5

首先,如果您致电:

os.path.expanduser("dir_path")
它应该返回:

dir_path
你的意思是:

os.path.expanduser("~/dir_path")
无论如何,当您使用mod_wsgi的嵌入式模式时,您的代码在Apache子工作进程中运行。这些过程可以与其他Apache模块(如PHP和Perl模块)共享。因为它是一个共享环境,无论是mod_wsgi还是任何web应用程序代码都不能冒昧地认为它可以更改进程的当前工作目录。因此,当前工作目录继承自Apache启动时使用的目录,即文件系统的根目录

出于类似的原因,您无法覆盖可能设置的环境变量,因此,如果Apache作为Apache启动时的根用户通过HOME,那么当您使用os.path.expanduser(“~”)时,波浪线将替换为HOME设置的任何内容

因此,您看到的是非常正常的,包括一个仍以root身份运行的进程,这是父Apache进程,在该进程中,您的任何请求都不会运行,因为它只是作为一个进程监视器来管理子工作进程、处理重启动等

一般来说,在web应用程序中,依赖当前工作目录、环境变量(如HOME、USERNAME、PATH等)的值被视为不好的做法,因为它们并不总是根据宿主环境设置为合理的值

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


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

为了解决这个问题,公认的答案很有帮助,但我不得不补充一点

`WSGIProcessGroup` directive also
所以我配置了这样的东西

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

WSGIProcessGroup ctaf.com

谢谢@FoxMaSk的格式化,我会注意下一次做得更好。没问题,我们也在这里讨论这个问题。你是对的,我指的是os.path.expanduser(“~/dir\u path”),我在问题中也纠正了这一点。我现在被另一个问题耽搁了,稍后我会回来回答您的其他意见。当您在linux中安装firefox时,它会创建一个隐藏目录/home/user/.mozilla。在我的情况下,我需要将通过webapp上传的一些文件存储在某个路径中。您提到的是一个选项,在安装自述文件中,我可以在某个地方写上“创建一个目录”dir_path“并在webapp的配置中配置它”。我只是试图在安装过程中通过依赖~指向的路径来避免此步骤。另外,我不想将文件存储在/tmp of/path中。现在可以工作了,我正在使用wsgi的dameon模式。你觉得这个理由怎么样?那就不要依赖expanduser()。使用pwd模块中的函数自己查找当前用户的主目录,然后从中构造实际路径。它成功了,thankyou@Jordan我还必须添加WSGIProcessGroup指令
WSGIDaemonProcess ctaf.com user=ctaftest group=ctaftest threads=10 python-path=/home/ctaftest/virtualpython/CTAFWEB_PRODUCTION/ctafweb

WSGIProcessGroup ctaf.com