日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

springboot + websocket + linux服務器(nginx)404問題解決

 jackeyqing 2019-04-07

問題描述:

最近基于springboot做一個微信公眾號,內(nèi)嵌一個小的購物商城系統(tǒng),用戶下單后,使用websocket往商家管理系統(tǒng)發(fā)送消息。在本地測試沒有任何問題,但是部署到centos服務器上之后一直報錯404??偨Y(jié)了網(wǎng)上很多解決方法都不行,網(wǎng)上討論的都是說tomcat版本太低,因為websocket需要tomcat7.0以上才支持。但是我是用springboot+maven搭建的項目,使用的是springboot內(nèi)嵌的tomcat服務器,我查看了maven,發(fā)現(xiàn)tomcat版本是8.0+。那么就不是tomcat版本問題了。

解決思路:

排除了tomcat問題,jdk版本也是1.8+,websocket部署到服務器上還是404,網(wǎng)上還有人說是tomcat的jar包和項目jar沖突,可是我springboot項目使用的內(nèi)嵌tomcat,于是我利用Maven Helper(非常好用的idea插件)查看了下依賴發(fā)現(xiàn)并沒有沖突??ㄔ谶@里很久,我特地看了下websocket請求格式:
Websocket握手格式:

GET /chat HTTP/1.1
Host: server.
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==
Sec-WebSocket-Protocol: chat, superchat
Sec-WebSocket-Version: 13
Origin: http://

這請求類似http協(xié)議,里面多了陌生的內(nèi)容是:

Upgrade: websocket
Connection: Upgrade

當時一臉懵逼,這是什么玩意啊?然后我就百度了下,原來這個就是Websocket的核心,他會告訴Apache、Nginx等服務器我發(fā)起的是websocket請求,不是http!下面的三個參數(shù)Sec-WebSocket-Key、Sec-WebSocket-Protocol、Sec-WebSocket-Version作用大概就是驗證請求確實是websocket,同時指定協(xié)議版本吧。
這時候我恍然大悟!我的項目使用了nginx做了轉(zhuǎn)發(fā),那么會不會是因為我沒有配置nginx響應websocket請求呢?答案是肯定的!

配置nginx反向代理響應webSocket請求

需要在代理的請求配置中加入下面的配置:

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

nginx配置如下:

server {
 listen       80;
 server_name  localhost;
 #charset koi8-r;

 location / {
     root   /usr/java/myproject/sell;
     index  index.html index.htm;
 }

 location /sell/ {
     proxy_pass http://127.0.0.1:8081/sell/;
 }

location /sell/webSocket {
    proxy_pass http://127.0.0.1:8081/sell/webSocket; 
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

這段配置就是把所有的/sell下的請求轉(zhuǎn)到8081端口處理,把/sell/webSocket請求轉(zhuǎn)發(fā)到指定的請求接口,發(fā)現(xiàn)404錯誤消失,webSocket服務也可以訪問到。但是出現(xiàn)了一個新的問題就是,webSocket連接后沒有保持連接,大約一分鐘之后就會斷開,原因是因為在第一次請求后到第二次請求到來的時間超過了默認的最大時間,超時了。這里提供一個解決思路:
需要配置的三個核心參數(shù):

proxy_connect_timeout 4s; 
proxy_read_timeout 7200s; 
proxy_send_timeout 12s; 

proxy_read_timeout是服務器對連接等待的最大時間,也就是說,當你webSocket使用nginx轉(zhuǎn)發(fā)的時候,用上面的配置來說,如果72000秒內(nèi)沒有通訊,依然是會斷開的,你可以按照需求來設定。

比如說,我這里設置了7200s(2小時),那么如果我2小時內(nèi)有通訊,或者2小時內(nèi)有心跳的話,是可以保持連接不中斷的。

我這里之所以這么設置,是考慮到了具體的業(yè)務情況,2小時比較合適。最終的配置如下:

server {
 listen       80;
 server_name  localhost;
 #charset koi8-r;

 location / {
     root   /usr/java/myproject/sell;
     index  index.html index.htm;
 }

 location /sell/ {
     proxy_pass http://127.0.0.1:8081/sell/;
 }

location /sell/webSocket {
    proxy_pass http://127.0.0.1:8081/sell/webSocket; 
    proxy_connect_timeout 4s; 
    proxy_read_timeout 7200s; 
    proxy_send_timeout 12s; 
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
}

問題解決,坑爹??!

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多