最近在写一个 HTTP/2 的代理。如果是不带 TLS 的话,是可以正常工作的,
server {
listen 8443 http2;
location / {
error_log /Users/jiajun/nginx_error_log.log debug;
grpc_pass grpc://127.0.0.1:2017;
}
}
执行一下:
$ go run example/grpc_client/main.go
calling to 127.0.0.1:2019
2019/01/28 11:50:46 gonna call c.SayHello...
2019/01/28 11:50:46 Greeting: Hello world
Nginx 日志是:
127.0.0.1 - - [28/Jan/2019:11:50:46 +0800] "POST /helloworld.Greeter/SayHello HTTP/2.0" 200 18 "-" "grpc-go/1.16.0" "-"
加证书之后:
server {
listen 8443 ssl http2;
ssl_certificate /Users/jiajun/127.0.0.1.crt;
ssl_certificate_key /Users/jiajun/127.0.0.1.key;
location / {
error_log /Users/jiajun/nginx_error_log.log debug;
grpc_pass grpc://127.0.0.1:2017;
}
}
执行一下:
$ go run example/grpc_client/main.go
calling to 127.0.0.1:2019
2019/01/28 11:53:06 gonna call c.SayHello...
2019/01/28 11:53:06 could not greet: rpc error: code = Unavailable desc = transport is closing
exit status 1
Nginx 日志:
127.0.0.1 - - [28/Jan/2019:11:53:06 +0800] "PRI * HTTP/2.0" 400 157 "-" "-" "-"
有同学遇到同样的问题吗?
此外,可以写一个简单的 demo 复现问题:
package main
import (
"crypto/tls"
"log"
)
func main() {
backendConn, err := tls.Dial("tcp", "127.0.0.1:8443", &tls.Config{InsecureSkipVerify: true})
if err != nil {
log.Printf("failed to dial: %s", err)
}
if _, err := backendConn.Write([]byte("PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n")); err != nil {
log.Printf("failed to write: %s", err)
}
b := make([]byte, 4096)
if _, err := backendConn.Read(b); err != nil {
log.Printf("failed to read: %s", err)
}
log.Printf("result: %s", b)
}
结果:
$ go run main.go
2019/01/28 14:59:50 result: HTTP/1.1 400 Bad Request
Server: nginx/1.15.8
Date: Mon, 28 Jan 2019 06:59:50 GMT
Content-Type: text/html
Content-Length: 157
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body>
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx/1.15.8</center>
</body>
</html>
1
justfly 2019-01-28 15:24:01 +08:00
很迷,你给的配置 nginx 监听的 8443 端口,log 里面却是连接 2019 端口。demo 里面去访问一个 http/2 服务,http/2 是二进制协议,你在 tls 连接上直接给的是纯文本协议。。。
|
2
gansteed OP |
3
popstk 2019-01-29 17:33:14 +08:00
https://github.com/grpc/grpc-go#the-rpc-failed-with-error-code--unavailable-desc--transport-is-closing
试试配下证书-> <code> certificate, err := credentials.NewServerTLSFromFile(crtFile, keyFile) if err != nil { log.Fatalf("can not load certificate: %v", err) } conn, err := grpc.Dial(address, grpc.WithTransportCredentials(certificate)) if err != nil { log.Fatalf("did not connect: %v", err) } </code> |