为什么我们必须将 nginx 与 gunicorn 一起用于容器内的 flask 部署

Why do we must use nginx with gunicorn for flask deployment inside container

我一直在使用 nginx 作为 gunicorn 的反向代理;在 docker 容器内的生产环境中运行烧瓶服务器。 我的问题是为什么我们在容器内使用 nginx,因为 gunicorn 本身就是 http 服务器。 我正在使用 Istio 在 kubernetes 中部署图像。因为我已经在使用 Istio,所以我应该删除 nginx 吗?

我想从图片中删除 nginx,因为很难同时配置 nginx 和 gunicorn,它们都可以正常工作,但是在上传大数据时,例如 800MB json 文件,nginx 会抛出 504 错误网关。 我已尝试将 nginx 和 gunicorn 配置为不超时,但它不会 work.After nginx 通过查看 pod/container 日志 gunicorn 仍在处理数据来响应 504 错误网关,因此这意味着 gunicorn 没有抛出这个错误只有nginx是。 这里是配置。

Nginx http 部分

proxy_connect_timeout       3600;
proxy_send_timeout          3600;
proxy_read_timeout          3600;
send_timeout                3600;

location @proxy_to_app {
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
  proxy_set_header Host $http_host;
  proxy_connect_timeout 3600s;
  proxy_read_timeout 3600s;
  proxy_send_timeout 3600s;
  send_timeout 3600s;
  proxy_redirect off;
  proxy_pass http://app_server;
}

Gunicorn 配置:

gunicorn --worker-tmp-dir /dev/shm/ --workers=2 --threads=4 --worker-class=gthread --limit-request-field_size 125000000 --limit-request-line 125000000 --timeout 3600 --keep-alive 3600 --bind unix:/tmp/gunicorn.sock run:app

在研究了这个话题之后,我自己回答了。 不建议 运行 容器内的多个进程 ref: here 所以在容器内部不应该使用 nginx 将请求重定向到实际的 uwsgi 服务器。我们可以直接使用 uwsgi 服务,将单个进程分叉给多个工作人员。