Flask内置服务器可正常写入文件,部署到远程VPS后无法写入
我明白你遇到的问题了——本地跑Flask内置服务器时一切正常,接口能返回成功,文件也能生成,但部署到VPS上后,明明接口返回是好的,就是找不到生成的data1.txt,连错误日志都没提示,折腾权限也没用,确实挺闹心的。
我帮你梳理几个最可能的原因和对应的解决办法,你可以逐一排查:
用绝对路径替代相对路径,解决工作目录不匹配问题
本地运行Flask时,脚本的工作目录就是你的项目根目录,所以用"data1.txt"这种相对路径会直接生成在项目里。但VPS上的WSGI服务器(比如Apache、Nginx+uWSGI)运行时,工作目录可能不是你的项目目录——比如可能默认在/root/或者服务器的系统目录下,文件其实生成了,但你找错地方了!
解决办法是改用绝对路径,让代码不管在哪运行,都把文件写到项目目录里。修改后的代码示例:import os from flask import Flask, request, make_response, jsonify @app.route("/json", methods=["POST"]) def json(): if request.is_json: req = request.get_json() # 获取当前脚本所在目录的绝对路径 current_dir = os.path.dirname(os.path.abspath(__file__)) # 拼接出文件的绝对路径 file_path = os.path.join(current_dir, "data1.txt") with open(file_path, "w") as f: f.write("text here") res = make_response(jsonify({"result": "okeydokey"})) return res检查父目录的权限,别只盯着文件本身
你已经尝试修改data1.txt的权限,但如果WSGI进程的运行用户(比如Apache的www-data、Nginx的nginx用户)没有项目目录的写入权限,就算文件本身权限对了,也没法创建/修改文件——因为创建文件需要父目录的写入权限。
解决步骤:- 先确认WSGI进程的运行用户:比如Apache通常是
www-data,uWSGI可以看配置里的User字段,或者用ps aux | grep uwsgi查看进程所属用户。 - 给项目目录设置正确的权限:
# 假设WSGI用户是www-data,项目目录是/var/www/your_app sudo chown -R www-data:www-data /var/www/your_app # 或者给目录的组添加写入权限(如果把WSGI用户加入了项目目录的组) sudo chmod -R g+w /var/www/your_app
注意:别用
777权限,太不安全,尽量用最小必要权限。- 先确认WSGI进程的运行用户:比如Apache通常是
排查SELinux/AppArmor的安全限制
很多VPS默认开启了安全模块(比如CentOS的SELinux、Ubuntu的AppArmor),这些模块会限制Web服务器进程的文件写入范围,就算目录权限正确,也会被悄悄拦截,而且不会记录到普通的error.log里。
可以先临时关闭测试:- CentOS/RHEL系(SELinux):
测试接口,如果文件能生成,说明是SELinux的问题。之后不要一直关闭SELinux,而是添加规则允许Web服务器写入你的项目目录(比如用sudo setenforce 0semanage fcontext命令配置)。 - Ubuntu系(AppArmor):
查看是否有对应的profile限制了Apache/uWSGI,然后调整profile规则允许写入你的项目目录。sudo aa-status
- CentOS/RHEL系(SELinux):
检查WSGI服务器的工作目录配置
有些WSGI服务器的配置里,chdir参数没设置正确,导致进程的工作目录不是你的项目目录,相对路径就会写到错误的位置。比如uWSGI的uwsgi.ini里,要确保有:[uwsgi] chdir = /var/www/your_app # 你的项目根目录 module = your_app:app # 其他配置...Apache的话,检查
WSGIDaemonProcess的home参数,或者确保WSGIScriptAlias指向的是正确的项目目录。
备注:内容来源于stack exchange,提问作者BridgeGuy

