前段时间,网站访问由http变更为https,但是由于webscoket功能受到影响,报错如下:
跟前端沟通解决方式问题,前端回复说很麻烦,暂时不要做了。
今天突发奇想,我是不是可以在nginx中修改配置,在前端打包给我的js文件中,修改webscoket路径也能解决这个问题。
1>
原js中配置的websocket地址为:119.3..:9080,修改为目前的网站域名,去掉端口号;
2>
修改nginx配置文件,因为原来是直接ip端口访问,nginx中并未配置相关信息,所以此处为添加配置信息:
location /websocket/ { proxy_pass http://127.0.0.1:9080/websocket/; #这个version一定要带这,不然nginx不认为他是一个webscoket访问,直接给你返回400proxy_http_version 1.1;proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}
注意:websocket配置,千万不要将其他的配置复制粘贴了之,我起初就是粘贴复制的,发现一直有问题,原来是多复制了个proxy_pass_header User-Agent;
。
3>
设置定时任务,因为nginx默认的连接超时时间为60s,我改成120s之后,还是会抛出异常:
java.io.EOFExceptionat org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1231)at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1141)at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:72)at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:59)at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868)at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1594)at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:748)
所以我设置了一个定时任务,30秒发一条信息到前端,前端收到后,再给我返回一条信息,
这里呢,我的是springboot项目,因为定时任务和websocket不能同时启动,所以从某网站cv了一段代码
@Configuration
public class ScheduledConfig {@Beanpublic TaskScheduler taskScheduler(){ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();taskScheduler.setPoolSize(10);taskScheduler.initialize();return taskScheduler;}
}
然后配置定时任务
@Scheduled(cron = "0/30 * * * * ?")
public void sentHeartBeadTask() {#方法自己定义,我这里是这样的,发送消息就简单了,不用贴代码了吧。msgWebSocket.KeepThread();
}
最后,我还是想让前端处理一下,每次修改服务器,都要改js中域名的问题。
学习这个东西呢,还是自己催着自己走,啥都可以试一试,万一成功了呢?