如何修复:使用 nginx 反向代理时收到 RST_STREAM,错误代码为 2

2024-02-18

我目前正在树莓派上使用dialogflow api。 使用 grpc 调用 StreamingDetectIntent 方法时一切正常。 我必须在我的产品上使用多个 api,因此,我尝试在它们前面放置一个反向代理。这样我就只能调用一个地址 我正在使用 nginx 将我的 GRPC 请求反向代理到 google api。 调用简单方法时没有问题,但是当调用像 StreamingDetectIntent 这样的流方法时,我在请求期间收到错误。

Dialogflow 获取来自客户端的音频流量没有问题,但获取请求的最后部分(下游流量)时遇到问题。

这是我的客户给我的错误:

grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with:
        status = StatusCode.INTERNAL
        details = "Received RST_STREAM with error code 2"
        debug_error_string = "{"created":"@1567173815.816362297","description":"Error received from peer ipv4:163.172.143.250:443","file":"src/core/lib/surface/call.cc","file_line":1041,"grpc_message":"Received RST_STREAM with error code 2","grpc_status":13}"
>

我可以在 Nginx 日志中看到错误:

upstream sent frame for closed stream 1 while reading upstream, client: ..., server: exemple.com, request: "POST /google.cloud.dialogflow.v2beta1.Sessions/StreamingDetectIntent HTTP/2.0", upstream: "grpcs://...:443", host: "example.com:443"

我尝试将 grpc_buffer_size 参数增加到大值,但没有成功。

这是我当前的 Nginx 配置:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log debug;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

    keepalive_timeout  65;

    client_max_body_size 4000M;
    grpc_read_timeout 1d;
    grpc_send_timeout 1d;
    # this seems to fix it; but see comment in README.md
    grpc_buffer_size 100M;

    include /etc/nginx/conf.d/*.conf;

    server {

        # SSL configuration
        listen 443 ssl http2;

        access_log /var/log/nginx/access_grpc.log main;

        location / {
            grpc_pass grpcs://dialogflow.googleapis.com:443;
        }

        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key/etc/letsencrypt/live/exemple.com/privkey.pem;
    }

    server {

        if ($host = example.com) {
            return 301 https://$host$request_uri;
        }

        listen 80 ;
        listen [::]:80 ;

        return 404; # managed by Certbot

    }

}


GRPC 元数据(尤其是用户代理)可能存在问题。看看这些问题:

https://github.com/grpc/grpc-go/issues/1888 https://github.com/grpc/grpc-go/issues/1888

https://github.com/improbable-eng/grpc-web/issues/145 https://github.com/improbable-eng/grpc-web/issues/145

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何修复:使用 nginx 反向代理时收到 RST_STREAM,错误代码为 2 的相关文章

随机推荐