Welcome! Log In Create A New Profile

Advanced

nginx + grpc-web

June 28, 2018 11:19AM
I try to use nginx + grpc + grpc-web client JS library (https://github.com/grpc/grpc-web).

Nginx-1 is compiled using the following setup:
nginx version: nginx/1.15.0
built by gcc 7.2.0 (Ubuntu 7.2.0-8ubuntu3.1~16.04.york0)
built with OpenSSL 1.0.2g 1 Mar 2016
TLS SNI support enabled
configure arguments: --with-threads --with-file-aio --with-http_ssl_module --with-http_v2_module

Nginx-2 that comes with the grpc-web javascript library on docker image is compiled using the following setup:
nginx version: nginx/1.11.13
built by gcc 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.9)
built with OpenSSL 1.0.2h 3 May 2016
TLS SNI support enabled
configure arguments: --with-http_ssl_module --with-http_v2_module --with-cc-opt='-I /usr/local/include -I /github/grpc-web -I /github/grpc-web/third_party/grpc/third_party/protobuf/include -I /github/grpc-web/third_party/grpc/third_party/protobuf/src -I /github/grpc-web/third_party/grpc/include -I /github/grpc-web/third_party/grpc' --with-ld-opt='-L/github/grpc-web/third_party/grpc/third_party/protobuf/src/.libs -L/github/grpc-web/third_party/grpc/libs/opt -lgrpc++ -lgrpc -lprotobuf -lpthread -ldl -lrt -lstdc++ -lm' --with-openssl=/github/grpc-web/third_party/openssl --add-module=/github/grpc-web/net/grpc/gateway/nginx

The grpc service is running on port 50051.

I want to use the grpc-web client JS library to call grpc service from webpage, and I use the same following nginx.conf for Nginx-1 and Nginx-2.
master_process off;
daemon off;
worker_processes 1;
pid nginx.pid;
error_log stderr debug;

events {
worker_connections 1024;
}

http {
access_log off;
client_max_body_size 0;
client_body_temp_path client_body_temp;
proxy_temp_path proxy_temp;
proxy_request_buffering off;
server {
listen 8080;
server_name localhost;
location ~ \.(html|js)$ {
root html;
}
location /helloworld.Greeter {
grpc_pass localhost:50051;
if ($request_method = 'OPTIONS') {
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Transfer-Encoding,Custom-Header-1,X-Accept-Content-Transfer-Encoding,X-Accept-Response-Streaming,X-User-Agent';
add_header 'Access-Control-Expose-Headers' 'Content-Transfer-Encoding';
}
}
}
}

If I use Nginx-2, the web JS client can connect to the service.

For Nginx-1, the web JS client cannot connect to the service. Nginx returns the following error:
[error] 26125#26125: *1 upstream rejected request with error 2 while reading response header from upstream, client: 192.168.50.101, server: localhost, request: "POST /helloworld.Greeter/SayHello HTTP/1.1", upstream: "grpc://127.0.0.1:50051", host: "localhost:8080", referrer: "http://localhost:8080/hello.html"

From the chrome console, I received the following error
POST http://localhost:8080/helloworld.Greeter/SayHello 502 (Bad Gateway)
goog.net.XhrIo.send @ compiled.js:395
module$contents$grpc$web$GrpcWebClientBase_GrpcWebClientBase.rpcCall @ compiled.js:438
proto.helloworld.GreeterClient.sayHello @ compiled.js:631
echo @ hello.html:49
send @ hello.html:66
(anonymous) @ hello.html:78
dispatch @ jquery.min.js:3
q.handle @ jquery.min.js:3

Uncaught Error: Unknown base64 encoding at char: <
at c (compiled.js:429)
at Object.goog.crypt.base64.decodeStringInternal_ (compiled.js:429)
at Object.goog.crypt.base64.decodeStringToUint8Array (compiled.js:428)
at goog.net.XhrIo.<anonymous> (compiled.js:432)
at goog.net.XhrIo.goog.events.EventTarget.fireListeners (compiled.js:279)
at Function.goog.events.EventTarget.dispatchEventInternal_ (compiled.js:281)
at goog.net.XhrIo.goog.events.EventTarget.dispatchEvent (compiled.js:276)
at goog.net.XhrIo.onReadyStateChangeHelper_ (compiled.js:401)
at goog.net.XhrIo.onReadyStateChangeEntryPoint_ (compiled.js:400)
at goog.net.XhrIo.onReadyStateChange_ (compiled.js:400)


It seems that Nginx-1 might have some issue with the encoding or the translation of http1 to http2. Do you have any suggestion of what is the issue?

Thanks a lot!
Don
Subject Author Posted

nginx + grpc-web

donald.williams.0018 June 28, 2018 11:19AM

Re: nginx + grpc-web

Maxim Dounin June 29, 2018 11:14AM

Re: nginx + grpc-web

donald.williams.0018 June 29, 2018 07:48PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 318
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready