1、wss心跳每30秒一次,3次收不到心跳即90秒钟收不到心跳断开连接

2、nginx配置ssl访问wss配置如下


worker_processes  1;



events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    #gzip  on;
    	# WS server
	map $http_upgrade $connection_upgrade {
		default upgrade;
		'' close;
	}

	upstream wsbackend {
		server 127.0.0.1:18085;
		keepalive 1000;
	}
    server {
       listen 443 ssl;
    server_name localhost;
 
    # 证书路径
    ssl_certificate jerry2.pem;
    ssl_certificate_key jerry2.key;
 
    ssl_session_timeout 5m;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;

       location / {
			proxy_http_version 1.1;
			proxy_pass http://wsbackend;
			proxy_redirect off;
			proxy_set_header Host $host;
			proxy_set_header X-Real-IP $remote_addr;
			proxy_read_timeout 90s;
			proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			proxy_set_header Upgrade $http_upgrade;
			proxy_set_header Connection $connection_upgrade;
		}

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
       
    }

}

其中 proxy_read_timeout 90s; 设置90秒,三次收不到心跳nginx断开连接。

4、然后使用java代码访问wss,心跳超时断线重连出现以下报错信息

13:47:15.816 [WebSocketClient-SecureIO-1] ERROR c.p.p.c.HelmetWSSHandler - [processClose,103] - 头盔链接关闭sessionId=0错误吗:CloseReason: code [1006], reason [Unexpected Status of SSLEngineResult after an unwrap() operation]
javax.websocket.DeploymentException: The HTTP request to initiate the WebSocket connection to [wss://127.0.0.1:443] failed
	at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:493)
	at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:197)
	at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:154)
	at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:171)
	at com.pojo.prj.service.impl.DeviceServiceImpl.helmetWSSLogin(DeviceServiceImpl.java:233)
	at com.pojo.prj.service.impl.DeviceServiceImpl$$FastClassBySpringCGLIB$$85d8c6d.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:687)
	at com.pojo.prj.service.impl.DeviceServiceImpl$$EnhancerBySpringCGLIB$$2ed12b9f.helmetWSSLogin(<generated>)
	at com.pojo.prj.config.HelmetWSSHandler.processClose(HelmetWSSHandler.java:104)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:103)
	at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:556)
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:502)
	at org.apache.tomcat.websocket.WsFrameClient.close(WsFrameClient.java:132)
	at org.apache.tomcat.websocket.WsFrameClient.access$100(WsFrameClient.java:31)
	at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.failed(WsFrameClient.java:175)
	at org.apache.tomcat.websocket.WsFrameClient$WsFrameClientCompletionHandler.failed(WsFrameClient.java:148)
	at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$WrapperFuture.fail(AsyncChannelWrapperSecure.java:472)
	at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$ReadTask.run(AsyncChannelWrapperSecure.java:339)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: java.lang.InterruptedException
	at java.base/java.util.concurrent.locks.AbstractQueuedSynchronizer.tryAcquireSharedNanos(AbstractQueuedSynchronizer.java:1367)
	at java.base/java.util.concurrent.CountDownLatch.await(CountDownLatch.java:278)
	at org.apache.tomcat.websocket.AsyncChannelWrapperSecure$WrapperFuture.get(AsyncChannelWrapperSecure.java:506)
	at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServerRecursive(WsWebSocketContainer.java:350)
	... 25 more

5、解决方法,修改nginx配置

proxy_read_timeout 90s;

把90改成3600,这个数值一定要大于心跳超时的时间。

更多推荐