Python和WSGI - 默认输出文件夹在哪里? (CentOS的/阿帕奇)

时间:2014-03-08 23:19:10

标签: apache python-2.7 mod-wsgi

我使用CentOS 6在Apache服务器上运行WSGI下的Python.python脚本使用名为PyNGL的NCAR库的包装器。该库的目的是从提供的数据生成图形。

我试图将我的python脚本连接到web.py,但它也有一个直接执行的入口点。

这是奇怪的事情:

当我直接运行脚本时,它按预期工作,并在脚本目录中生成输出图像。但是,当我尝试通过web.py控制器(具有完全相同的参数)调用它时,它会失败。

我的apache错误日志包含:

warning:GKS:GCLRWK: -- cairo driver error: error opening output file

我猜这可能是一个权限问题,但我对尝试输出没有任何想法。

编辑:我想我已经确认它确实是权限错误。 我试图使用相对路径创建文件并得到类似的错误:

<type 'exceptions.IOError'> at /plot
[Errno 13] Permission denied: 'Output.txt'

此错误在此处引用此行:

with open("Output.txt", "w") as text_file: 
    text_file.write(str(self.__dict__))

现在我当然可以指定该文本文件的绝对路径,但不能指定PyNGL的图形输出。有没有办法确定它尝试输出的位置,或更改默认输出目录?

1 个答案:

答案 0 :(得分:2)

通常,您的应用程序将使用当前工作目录作为“/”运行。 Apache用户将无法写入该目录。

在任何Web应用程序中,您通常不应该依赖它在特定目录中运行,因为不同的Web服务器的行为与当前工作目录的行为不同。如果您认为它始终在特定目录中运行,那么您的应用程序本身就是不可移植的。更改应用程序的工作目录以解决这个问题通常也是不好的做法,因为在允许多个应用程序在同一进程中运行的托管机制中,如果每个应用程序都试图设置自己的工作目录,它们都会互相干扰

您应该做的是在读取和写入文件时始终使用绝对路径,而不是使用相对路径。为什么你说你不能使用绝对路径?

另请注意,您的应用程序将作为特殊用户运行,该用户无权访问创建文件的目录。因此,您需要打开对Apache用户的访问权限。最佳做法是限制Apache用户可以写入的内容。

现在,因为您正在使用mod_wsgi,所以一个可行的选择是确保使用mod_wsgi守护程序模式,并且在使用WSGIDaemonProcess指令时设置'home'选项以覆盖委派给该进程的单个WSGI应用程序的当前工作目录。您还可以设置“用户”和“组”选项,以使进程作为可以访问该目录的其他用户运行。