Nginx 忽略 gRPC 服务器的 proxy_bind 指令

Nginx ignoring proxy_bind directive for gRPC server

我正在尝试使用 nginx proxy_bind 指令让到 gRPC 服务器的上游流量使用特定的网络接口。出于某种原因,nginx 似乎完全忽略了该指令并仅使用默认网络接口。我尝试对不使用 gRPC 的不同服务器使用 proxy_bind 指令(我相信它是 http1.1)并且工作正常,所以我相信 nginx 忽略了 proxy_bind指令,因为与服务器相关的东西是 gRPC 服务器。我已经通过 运行 ss 确认它适用于普通服务器而不是 gRPC 服务器,并寻找来自我试图绑定的 ip 的流量。有流量,但它只会转到普通服务器。所有到 gRPC 服务器的流量都有默认的本地 ip。

这是 gRPC 服务器的服务器配置块,其中 proxy_bind 不工作:

server {
    listen 8980 http2;

    # set client body size to 128M to prevent HTTP 413 errors
    client_max_body_size 128M;
    # set client buffer size to 128M to prevent writing temp files
    client_body_buffer_size 128M;

    # We have plenty of RAM, up the output_buffers
    output_buffers 256 128M;

    # Allow plenty of connections
    http2_max_concurrent_streams 100000;
    keepalive_requests 100000;
    keepalive_timeout 120s;

    # Be forgiving with grpc
    grpc_connect_timeout 240;
    grpc_read_timeout 2048;
    grpc_send_timeout 2048;
    grpc_socket_keepalive on;

    proxy_bind <local ip>;

    location / {
        proxy_set_header Host $host;
        grpc_pass grpc://my8980;
    }
}

这是 proxy_bind 工作的普通服务器的服务器配置块:

server {
    listen 4646;

    # set client body size to 16M to prevent HTTP 413 errors
    client_max_body_size 64M;
    # set client buffer size to 32M to prevent writing temp files
    client_body_buffer_size 64M;

    # We have plenty of RAM, up the output_buffers
    output_buffers 64 64M;

    # Fix Access-Control-Allow-Origin header
    proxy_hide_header Access-Control-Allow-Origin;
    add_header Access-Control-Allow-Origin $http_origin;
        
    proxy_bind <local ip>;

    location / {
        proxy_set_header Host $host;
        proxy_pass http://myapp1;
        proxy_buffering off;
    }
}

grpc_pass 指令属于 ngx_http_grpc_module, while proxy_set_header, proxy_hide_header and proxy_bind directives comes from ngx_http_proxy_module。这些模块是两个不同的东西。 ngx_http_grpc_module 有自己的 grpc_set_headergrpc_hide_headergrpc_bind 类似物,可以代替使用。