【问题标题】:Flask + gunicorn proxy setup?Flask + gunicorn 代理设置?
【发布时间】:2020-11-05 15:55:40
【问题描述】:

我尝试将 Flask、gunicorn 和 nginx 连接在一起,但结果是 400 Bad request 和 500 Errors。 希望任何人都可以提供帮助。

nginx 配置

server {
    listen 8000;
    server_name 127.0.0.1;

    location /Hello {
        uwsgi_pass 127.0.0.1:8081;
    }
}

wsgi.py sn-p:

from app import app

app.run(host="127.0.0.1", port=8081)

app.py

app = Flask(__name__)
app.secret_key = "Not A Secret Anymore By Now"

@app.route('/Hello')
def hello():
  return("Hello")


#if __name__ == "__main__":
#  app.run(host='0.0.0.0', port=8000)

运行 cmd

export FLASK_APP=app
export FLASK_ENV=development
gunicorn --bind 0.0.0.0:8081 wsgi:app

测试用例

  1. curl http://localhost/ >>> 返回 nginx 主页
  2. curl http://localhost/Hello >>> 返回 404 Not found
  3. curl http://localhost:8000/ >>> 返回 nginx 主页
  4. curl http://localhost:8000/Hello >>> 返回 502 Bad Gateway
  5. curl http://localhost:8081 >>> 返回连接被拒绝

我试图让测试用例工作,但不知道为什么会出现错误,(nginx 已重新启动)。

谢谢。

【问题讨论】:

  • 已更新,def hello 正在返回“Hello”;
  • 使用uwsgi_pass 127.0.0.1:8081时; curl localhost:8000 失败。
  • 使用 prox_pass 127.0.0.1:8081 时; curl localhost:8000 返回 Nginx 页面

标签: python nginx flask gunicorn


【解决方案1】:

这里有几个问题...

您的视图函数结束时没有返回语句,这可能是第一个 500 错误的原因。更好的使用:

@app.route('/Hello')
def hello():
  print("Hello")
  return 'success'

此外,当您提到 uwsgi.py 是 emtpy 时,那里没有要导入的应用程序对象。最好将 gunicorn 命令指向有效的应用对象:

gunicorn --bind 0.0.0.0:8081 app:app

nginx 位置块也期望请求转到http://example.com/Hello/Hello。所以最好像下面这样制作位置块。 (还要确保端口与您提供给 gunicorn 的 --bind 标志的端口相同)。

location / {
    proxy_pass http://127.0.0.1:8081;
}

在这里,我还按照gunicorn deployment (with nginx) docs 使用了proxy_pass

现在请求应该可以工作了:

# Direct to app server...
curl -i  http://localhost:8081/Hello
HTTP/1.1 200 OK
Server: gunicorn/20.0.4
# ...
success

还有:

# Via nginx:
curl -i http://localhost/Hello
HTTP/1.1 200 OK
Server: nginx
...
success

请注意,在所有接口 (0.0.0.0) 上运行 gunicorn 意味着如果没有防火墙来防止外部请求可以直接到达应用服务器(绕过 nginx)。可能值得将 gunicorn 绑定到本地界面:--bind 127.0.0.1:8081

通常也要小心,在自己配置此类内容时,有很多方法会导致安全失误。祝你好运。

【讨论】:

  • curl -i localhost/Hello curl: (7) 无法连接到localhost 80端口:连接被拒绝
  • url localhost:8081 curl: (7) 无法连接到 localhost 端口 8081:连接被拒绝
猜你喜欢
  • 2018-11-04
  • 2018-06-15
  • 2012-05-19
  • 1970-01-01
  • 2014-01-12
  • 2016-05-06
  • 2019-09-24
  • 2014-12-17
  • 1970-01-01
相关资源
最近更新 更多