1

我在 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

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

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

4

3 回答 3

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身份运行的进程,它是父Apache进程,你的任何请求都没有在其中运行,因为它只是作为一个进程监视器来管理子工作进程,处理重启等

通常,在 Web 应用程序中,依赖于当前工作目录、HOME、USERNAME、PATH 等环境变量的值等东西被认为是不好的做法,因为它们并不总是根据托管环境。

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

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

于 2013-09-17T01:27:52.983 回答
1

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

WSGIDaemonProcess mysite user=ctaftest group=ctaftest threads=5
于 2013-09-16T12:53:20.580 回答
0

为了解决它,接受的答案有所帮助,但是我必须添加

`WSGIProcessGroup` directive also

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

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

WSGIProcessGroup ctaf.com
于 2013-09-17T12:36:15.653 回答