问题背景
刚进项目组,第一个任务就是一句话“业务平台http1.1升级到http2.0”。心想,改了协议就行了吧,甚至不需要改造代码,于是开始过了下项目架构,nginx做请求转发的springboot项目,好,那就改下nginx的协议呗。
解决方法
于是在nginx.conf监听端口后面追加http2,然后把proxy_http_version 1.1注释掉。
然后启动nginx报错了,发现nginx缺少支持http2.0的模块--with-http_v2_module,然后找源码,重新编译启用模块,运行。浏览器访问项目,查看network,协议改成了h2。
问题产生
最后开始联调,联调场景如下:
其他业务系统是通过ios SDK推送消息(默认使用http2.0协议,所以有了这次改造),然后nginx监听443端口,通过协议代理模块,请求其他网域的服务器并返回响应。
联调出现问题,之前未改造之前,据说是接收不到Http2请求;改造后,自身的业务日志正常接收请求并返回响应,无报错。但是调用方报错如下:
io.netty.handler.codec.http2.Http2Exception:First received frame was not SETTINGS.Hex dump for first 5 bytes:485454502f
应该是调用方接收到的报文的第一个数据帧错误?是不是说Nginx并没有实现http2.0的升级?还是协议代理(业务代码)这里需要对http2进行兼容处理?还请各位能提供点思路,实在有点迷茫了- -。