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_header
、grpc_hide_header
和 grpc_bind
类似物,可以代替使用。
我正在尝试使用 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_header
、grpc_hide_header
和 grpc_bind
类似物,可以代替使用。