使用nginx - uwsgi - flask部署GCP失败

rsaldnfx  于 2023-02-11  发布在  Nginx
关注(0)|答案(1)|浏览(183)

我有一个非常简单的 flask 应用程序,部署在GKE上,并通过谷歌外部负载平衡器暴露。并从后端服务获得随机502响应(添加了一个自定义的头后端服务和nginx,以确保源和我可以看到后端服务的头,而不是nginx的)
设置为:
LB -〉后端服务-〉neg -〉pod(nginx -〉uwsgi),其中pod是使用flask构建并通过uwsgi和nginx部署的应用程序。
这个场景是以简单安全的方式处理图片上传。发送者发送一个带有上传请求的令牌给我。
我的 flask 应用程序
1.接收请求并使用“请求”经由另一服务检查所发送的令牌。
1.如果令牌有效,则继续处理图像并返回200
1.如果令牌无效,则停止并发回401响应。
首先,我对200和401产生了怀疑。并将所有响应恢复为200。在一些预期的响应之后,服务器开始响应502并继续发送。“最开始的一些消息成功了”。
nginx错误日志包含以下行

2023/02/08 18:22:29 [error] 10#10: *145 readv() failed (104: Connection reset by peer) while reading upstream, client: 35.191.17.139, server: _, request: "POST /api/v1/imageUpload/image HTTP/1.1", upstream: "uwsgi://127.0.0.1:21270", host: "example-host.com"

我的uwsgi.ini文件如下;

[uwsgi]
    socket = 127.0.0.1:21270
    master
    processes = 8
    threads = 1
    buffer-size = 32768
    stats = 127.0.0.1:21290
    log-maxsize = 104857600
    logdate
    log-reopen
    log-x-forwarded-for
    uid = image_processor
    gid = image_processor
    need-app
    chdir = /server/
    wsgi-file = image_processor_application.py
    callable = app
    py-auto-reload = 1
    pidfile = /tmp/uwsgi-imgproc-py.pid

我的nginx.conf如下所示

location ~ ^/api/ {
        client_max_body_size 15M;
        include uwsgi_params;
        uwsgi_pass 127.0.0.1:21270;
    }

最后,我的应用程序有一个带有简单JSON响应的healthcheck方法。它不做任何额外的事情,只是返回。如上所述,这从来不会失败。
编辑:pod中的我的nginx访问日志显示响应为401,而客户端接收到的是502。

iqih9akk

iqih9akk1#

对于那些将面临同样问题的人来说,问题是后数据读取(或不读取)。
nginx期望得到被代理的post数据,在我们的例子中是uwsgi,app,但是根据我的逻辑,在某些情况下我没有读取它并返回响应。
设置uwsgi后缓冲解决了该问题。

post-buffering = %(16 * 1024 * 1024)

这让我想到了这个解决方案;
https://stackoverflow.com/a/26765936/631965Nginx uwsgi (104: Connection reset by peer) while reading response header from upstream

相关问题