问题情景:
最近开发新增加一个项目,需要支持https wss协议
访问https://test.aa.com 使用nginx反向代理到后端tomcat web应用
访问https://test.aa.com/AAASService/websocket 反向代理到后端tomcat的websocket
一开始以为都是默认支持wss,就按照配置https协议配置了,后来发现行不通,在后端查看tomcat日志如下:
org.springframework.web.servlet.PageNotFound - No mapping found for HTTP request with URI [/AAASService/websocket/123456] in DispatcherServlet with name 'dispatcherServlet'
查看nginx日志访问状态返回404
网上搜索了一圈终于找到原因:
1.websocket需要tomcat7.0以上才支持
2.nginx需要配置相应的参数
解决:
nginx配置:
location / {
access_log /usr/local/nginx/log/qrcode.access.log main; error_log /usr/local/nginx/log/qrcode.error.log warn; proxy_pass http://10.20.168.81:9090; }
location /QRMSService/websocket {
access_log /usr/local/nginx/log/qrcode.access.log main;
error_log /usr/local/nginx/log/qrcode.error.log warn;
proxy_pass http://10.20.168.81:9090/QRMSService/websocket;
proxy_set_header Upgrade $http_upgrade; #需要添加这两行配置,让nginx响应websocket请求
proxy_set_header Connection "upgrade";
proxy_connect_timeout 4s; #为了防止socket链接很快就断掉需要按照各自的需求配置如下三个参数
proxy_read_timeout 7200s;
proxy_send_timeout 12s;
}
重新加载nginx 测试访问正常