当我意识到答案是什么时,我已经完成了 99% 的问题,所以我想我还是可以发布它 - 连同答案 - 以防它可以帮助别人
我已经启动并运行了一个 flask 应用程序很长一段时间,现在没有任何问题。
在我的应用程序的 __init__.py
中我在页面顶部添加了一个简单的导入语句:import thepackage
在所有通常的 flask 和 sqlalchemy 导入之后。
- 如果我从虚拟环境中启动 python 解释器
import thepackage
有效。 - 在解释器中
from app import thepackage
也有效。 - Flask 的开发服务器工作:
app.run(host='0.0.0.0')
当我访问my.ip.adr.ess:5000
时提供网页 - gunicorn 也是,
gunicorn --bind 0.0.0.0:5000 wsgi:app
在my.ip.adr.ess:5000
提供网页. - 但是,启用 nginx 并尝试访问位于
websitesdomain.com
抛出 502。这是/var/log/nginx/error.log
的示例:
2018/03/09 03:07:56 [crit] 12444#12444: *2 connect() to unix:/home/me/myapp/myapp.sock failed (2: No such> file or directory) while connecting to upstream, client: xxx.xxx.xxx.xxx, server: websitesdomain.com, request: "GET / HTTP/1.1", upstream: "http://unix:/home/me/myapp/myapp.sock:/", host: "websitesdomain.com"
- 如果我删除导入,一切都会像往常一样工作。
- 我已经仔细检查了我在
/etc/systemd/system/myapp.service
中设置的虚拟环境的路径,但是 Flask 和 gunicorn 都在里面,没有任何问题。
然后我意识到
最佳答案
问题是环境变量。
正在导入的包依赖于在我的 ~/.profile
中定义的环境变量。当然,当从我的主目录中执行时,Python 解释器、Flask 开发服务器和 gunicorn 从命令行可以使用这些。
但是,该应用程序并未在我的家庭环境中提供服务,而是一个创建套接字并从中喂食 gunicorn 的 systemd 单元文件。
这就是我所要做的:
/etc/systemd/system/myapp.service
[Unit]
...
[Service]
...
Environment='PATH=/home/me/path/to/my/venv/bin'
# Added all of the required environment variables in here
Environment='variable_name=variable value'
Environment='another_var=anothervalue'
...
服务无法启动,因为包试图连接到主机和密码为 None 的数据库(os.getenv('varname')
的结果,其中 varname
不存在。因为服务无法启动,所以从未创建套接字,这就是 nginx 记录有关找不到套接字的错误的原因。
我在这上面浪费了很多时间,希望有一天这能帮别人省去同样的麻烦!
关于python - Flask、Nginx、Gunicorn - 包导入导致 502 Bad Gateway(这是环境变量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49186574/