在mod_wsgi中运行的flask无法写入/ tmp

时间:2015-04-25 17:59:02

标签: python flask mod-wsgi

Apache v2.4.12-2

Mod_wsgi v4.4.8-1

Python v3.4.2

python-flask v0.10.1-5

Arch linux - kernel 3.12.36

我使用mod_wsgi和flask来托管服务器。我能够使用以下简化代码和通用.wsgi脚本重现此问题:

MainServer.py:

import flask

app = flask.Flask(__name__)

@app.before_first_request
def initstuff():
    test_file = '/tmp/test'
    with open(test_file, 'w') as f:
        f.write('test')

@app.route('/', methods=['GET'])
def rootdir():
    return 'Hello world'

MainServer.wsgi:

from MainServer import app as application

预期:包含内容' test'的文件写在/ tmp

实际结果:没有写入文件。日志中没有报告错误

如果我运行相同的代码但是指向我的用户有权写入的任何其他目录,它会按预期创建文件。 / tmp是我遇到此问题的唯一目录。

如果我直接运行上面的代码并使用flask内置服务器(app.run),它可以按预期在/ tmp中创建文件而不会出现任何问题。

我确保mod_wsgi服务器作为与app.run脚本相同的用户运行,并且该用户能够写入/ tmp。

- 编辑 -

直接从命令行运行httpd不会导致此问题。将httpd作为systemd服务启动

2 个答案:

答案 0 :(得分:3)

尝试将app记录器级别设置为DEBUG(并添加处理程序):

import logging
from logging.handlers import RotatingFileHandler
import flask

app = flask.Flask(__name__)

@app.before_first_request
def initstuff():
    test_file = '/tmp/test'
    with open(test_file, 'w') as f:
        f.write('test')

@app.route('/', methods=['GET'])
def rootdir():
    return 'Hello world'

if __name__ == '__main__':
    handler = RotatingFileHandler('app.log', maxBytes=10000, backupCount=1)
    handler.setLevel(logging.DEBUG)
    app.logger.addHandler(handler)
    app.run(host='0.0.0.0', port=8056, debug=True, use_reloader=False)

然后查看app.log以查看问题所在。

答案 1 :(得分:3)

我认为与此答案有关: https://unix.stackexchange.com/questions/167835/where-apaches-tmp-located

Apache可能正在使用private-tmp,导致/ tmp被重定向到/var/tmp/systemd-private--httpd.service - /