python - Flask、Nginx、Gunicorn - 包导入导致 502 Bad Gateway(这是环境变量)

标签 python linux nginx flask environment-variables

当我意识到答案是什么时,我已经完成了 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:appmy.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/

相关文章:

Artifactory 上的 Docker 注册表 - 登录失败

php - 使用 nginx 在 ubuntu 16、php 7 中显示 php 文件的白屏

android - Cordova 构建失败

写入后计算文件偏移量

java - 为什么netty无法接收多个并发连接创建(8000+ conns,不是一一)?

python - 如何以正确的方式在 python 中使用 FlatBuffers ?

linux - 使用 AWK 生成 HTML 表格报告

python - 从 SWIG 包装的 C++ 函数中获取当前的 Python 调用堆栈

python - 如何在 mac os x 上安装 leveldb

python - time.strftime() 不更新