【问题标题】:Flask, Nginx, Gunicorn - Package Import Causes 502 Bad Gateway (it was Environment Variables)Flask、Nginx、Gunicorn - 包导入导致 502 Bad Gateway(它是环境变量)
【发布时间】:2018-08-17 14:25:35
【问题描述】:

当我意识到答案是什么时,我 99% 都写出了这个问题,所以我想我还是把它贴出来——连同答案——以防它可以帮助某人

我已经有一个烧瓶应用程序启动并运行了很长一段时间,没有任何问题。

在我的应用程序的 __init__.py 中,我在页面顶部添加了一个简单的导入语句:import thepackage 在所有常用的烧瓶和 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 失败(2:没有这样的>文件或目录) 连接上游时,客户端:xxx.xxx.xxx.xxx,服务器: websitedomain.com,请求:“GET / HTTP/1.1”,上游: “http://unix:/home/me/myapp/myapp.sock:/”,主机:“websitesdomain.com”

  • 如果我删除导入,一切都会照常运行。
  • 我已经仔细检查了我在 /etc/systemd/system/myapp.service 中设置的虚拟环境的路径,但是 Flask 和 gunicorn 在那里没有问题。

然后我意识到

【问题讨论】:

标签: python linux nginx flask environment-variables


【解决方案1】:

问题在于环境变量。

导入的包依赖于在我的~/.profile 中定义的环境变量。当然,在我的主目录中执行时,Python 解释器、Flask 开发服务器和命令行中的 gunicorn 都可以使用这些。

但是,该应用程序并没有在我的家庭环境中提供服务,而是一个 systemd 单元文件,用于创建套接字并从中获取 gunicorn。

这就是我所要做的:

/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 会记录有关找不到套接字的错误。

我在这件事上浪费了很多时间,希望有一天这能帮别人省去同样的麻烦!

【讨论】:

    猜你喜欢
    • 2018-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    相关资源
    最近更新 更多