精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

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

問題描述:

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

解決思路:

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

GET /chat HTTP/1.1Host: server.example.comUpgrade: websocketConnection: UpgradeSec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw==Sec-WebSocket-Protocol: chat, superchatSec-WebSocket-Version: 13Origin: http://example.com

這請求類似http協議,里面多了陌生的內容是:

Upgrade: websocketConnection: Upgrade

當時一臉懵逼,這是什么玩意啊?然后我就百度了下,原來這個就是Websocket的核心,他會告訴Apache、Nginx等服務器我發起的是websocket請求,不是http!下面的三個參數Sec-WebSocket-Key、Sec-WebSocket-Protocol、Sec-WebSocket-Version作用大概就是驗證請求確實是websocket,同時指定協議版本吧。
這時候我恍然大悟!我的項目使用了nginx做了轉發,那么會不會是因為我沒有配置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下的請求轉到8081端口處理,把/sell/webSocket請求轉發到指定的請求接口,發現404錯誤消失,webSocket服務也可以訪問到。但是出現了一個新的問題就是,webSocket連接后沒有保持連接,大約一分鐘之后就會斷開,原因是因為在第一次請求后到第二次請求到來的時間超過了默認的最大時間,超時了。這里提供一個解決思路:
需要配置的三個核心參數:

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

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

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

我這里之所以這么設置,是考慮到了具體的業務情況,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";}

問題解決,坑爹啊!

本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Nginx支持WebSocket反向代理
WebSocket 結合 Nginx 實現域名及 WSS 協議訪問
websocket+前后端分離+https的nginx配置
Nginx代理websocket為什么要這樣做?
軟件開發nginx怎樣配置歡迎頁即首頁到index.html靜態文件,其它帶后綴的請求都到to
Nginx+Tomcat+Redis負載均衡實現session共享
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 新龙县| 乡城县| 元江| 同江市| 阜康市| 济宁市| 马鞍山市| 绩溪县| 佛山市| 山阴县| 信宜市| 阳东县| 新疆| 高陵县| 浙江省| 什邡市| 忻州市| 雷波县| 灵寿县| 唐河县| 萨迦县| 兰西县| 江陵县| 德江县| 芷江| 辛集市| 衢州市| 登封市| 达州市| 台北市| 屯门区| 历史| 沈阳市| 政和县| 谷城县| 邳州市| 仙居县| 买车| 晋城| 潞城市| 根河市|