Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Nginx反向代理WebSocket响应403的解决办法

Nginx反向代理WebSocket响应403的解决办法

作者头像
颇忒脱
发布于 2018-10-19 06:42:11
发布于 2018-10-19 06:42:11
3.7K30
代码可运行
举报
运行总次数:0
代码可运行

在Nginx反向代理一个带有WebSocket功能的Spring Web程序(源代码地址)时,发现访问WebSocket接口时总是出现403响应,Nginx的配置参考的是官方文档:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http {
    // ssl 相关配置 ...
    
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    server {
        listen 8020;
        location /ws {
            proxy_pass http://some-ip:8080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
        }
    }
}

唯一不同的是我们的Nginx配置了https。

于是打开Spring日志查看直接访问和通过Nginx访问的差别。

直接访问的日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG ... o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/ws/gs-guide-websocket/786/kz0qai5l/websocket]
DEBUG ... s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /gs-guide-websocket/786/kz0qai5l/websocket
DEBUG ... s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/gs-guide-websocket/786/kz0qai5l/websocket]
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : Matching patterns for request [/gs-guide-websocket/786/kz0qai5l/websocket] are [/gs-guide-websocket/**]
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : URI Template variables for request [/gs-guide-websocket/786/kz0qai5l/websocket] are {}
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : Mapping [/gs-guide-websocket/786/kz0qai5l/websocket] to HandlerExecutionChain with handler [org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@307f6b8c] and 1 interceptor
DEBUG ... o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/ws/gs-guide-websocket/786/kz0qai5l/websocket] is: -1
DEBUG ... o.s.web.cors.DefaultCorsProcessor        : Skip CORS processing: request is from same origin
DEBUG ... o.s.w.s.s.t.h.DefaultSockJsService       : Processing transport request: GET http://localhost:8080/ws/gs-guide-websocket/786/kz0qai5l/websocket
DEBUG ... o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
DEBUG ... o.s.web.servlet.DispatcherServlet        : Successfully completed request

通过Nginx访问的日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG ... o.s.web.servlet.DispatcherServlet        : DispatcherServlet with name 'dispatcherServlet' processing GET request for [/ws/gs-guide-websocket/297/jp1c3ab5/websocket]
DEBUG ... s.w.s.m.m.a.RequestMappingHandlerMapping : Looking up handler method for path /gs-guide-websocket/297/jp1c3ab5/websocket
DEBUG ... s.w.s.m.m.a.RequestMappingHandlerMapping : Did not find handler method for [/gs-guide-websocket/297/jp1c3ab5/websocket]
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : Matching patterns for request [/gs-guide-websocket/297/jp1c3ab5/websocket] are [/gs-guide-websocket/**]
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : URI Template variables for request [/gs-guide-websocket/297/jp1c3ab5/websocket] are {}
DEBUG ... o.s.w.s.s.s.WebSocketHandlerMapping      : Mapping [/gs-guide-websocket/297/jp1c3ab5/websocket] to HandlerExecutionChain with handler [org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler@307f6b8c] and 1 interceptor
DEBUG ... o.s.web.servlet.DispatcherServlet        : Last-Modified value for [/ws/gs-guide-websocket/297/jp1c3ab5/websocket] is: -1
DEBUG ... o.s.w.s.s.t.h.DefaultSockJsService       : Processing transport request: GET http://localhost:8080/ws/gs-guide-websocket/297/jp1c3ab5/websocket
DEBUG ... o.s.w.s.s.s.OriginHandshakeInterceptor   : Handshake request rejected, Origin header value https://some-host.com not allowed
DEBUG ... o.s.w.s.s.s.HandshakeInterceptorChain    : org.springframework.web.socket.server.support.OriginHandshakeInterceptor@25ce6ad4 returns false from beforeHandshake - precluding handshake
DEBUG ... o.s.web.servlet.DispatcherServlet        : Null ModelAndView returned to DispatcherServlet with name 'dispatcherServlet': assuming HandlerAdapter completed request handling
DEBUG ... o.s.web.servlet.DispatcherServlet        : Successfully completed request

注意到直接访问的日志里有这么一条:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG ... o.s.web.cors.DefaultCorsProcessor        : Skip CORS processing: request is from same origin

通过Nginx访问的日志里有这么一条:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
DEBUG ... o.s.w.s.s.s.OriginHandshakeInterceptor   : Handshake request rejected, Origin header value https://some-host.com not allowed

然后Google查询相关解决办法,找到github上的这个issue,所以只需要修改Nginx的配置,添加proxy_set_header Origin "";就行了:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http {
    // ssl 相关配置 ...
    
    map $http_upgrade $connection_upgrade {
        default upgrade;
        '' close;
    }

    server {
        listen 8020;
        location /ws {
            proxy_pass http://some-ip:8080;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection $connection_upgrade;
            proxy_set_header Origin "";
        }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
3 条评论
热度
最新
牛逼,感谢大佬!
牛逼,感谢大佬!
回复回复点赞举报
WOC,感谢大佬,这个问题困扰了我三四天了,在不能修改后端代码只能通过nginx硬解决的情况下,网上那一大堆解决方案毛用都没有,感谢感谢
WOC,感谢大佬,这个问题困扰了我三四天了,在不能修改后端代码只能通过nginx硬解决的情况下,网上那一大堆解决方案毛用都没有,感谢感谢
回复回复点赞举报
谢谢,半天没搞定。加了Origin直接好了
谢谢,半天没搞定。加了Origin直接好了
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Web服务器-Nginx代理WebSocket
作者介绍:简历上没有一个精通的运维工程师,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。
运维小路
2025/04/11
760
Web服务器-Nginx代理WebSocket
nginx 配置websocket
Nginx 代理 WebSocket 的要点是设置Upgrade和Connection响应头。 配置 Nginx 根据Upgrade(即$http_upgrade)来设置Connection:
用户4877748
2020/07/21
6.9K0
nginx反向代理配置详解
查看本篇文章链接:https://bt.ciilii.com/show/news-6.html
西里网
2025/03/06
3290
go-websocket 分布式IM
基于golang实现的分布式聊天系统,支持一对一聊天,聊天室等功能。为了测试方便发送消息数据暂未存入数据库,后期会加入数据库,也可自行加入数据库,方便永久存储聊天内容,以及支持消息必达等功能。
孤烟
2022/03/19
1.4K0
Nginx系列之websocket反向代理
经过以上简单的配置,nginx -s reload后,nginx即可作为websocket反向代理服务器。这段配置的关键在于server配置段中的proxy_http_version、proxy_set_header指令,分别设置http_veresion、Upgrade、Connection头部,从而实现http到webdocket的升级。
yxxhero
2022/05/31
3.3K0
WebSocket使用Nginx反向代理解决Wss服务问题
WebSocket 可以减小客户端与服务器端建立连接的次数,减小系统资源开销,只需要一次 HTTP 握手,整个通讯过程是建立在一次连接/状态中,也就避免了 HTTP 的非状态性,服务端会一直与客户端保持连接,直到你关闭请求,同时由原本的客户端主动询问,转换为服务器有信息的时候推送
沈唁
2019/12/12
18.7K0
Nginx代理WebSocket方法
前一篇文章讲了一下什么是WebSocket协议,这里在回顾一下,并且聊一聊如何用nginx来代理WebSocket。
没有故事的陈师傅
2022/04/05
6K0
nginx 代理websocket
与server一级在上面添加 map $http_upgrade $connection_upgrade { default upgrade; '' close; }  在server里配置 location /ws { proxy_pass http://127.0.0.1:24445/agentServer; proxy_http_version 1.1; p
DencyCheng
2022/05/11
5100
nginx 代理websocket
Nginx支持WebSocket反向代理-学习小结
WebSocket是目前比较成熟的技术了,WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择。其为HTML5的一部分,WebSocket相较于原来开发这类app的方法来说,其能使开发更加地简单。大部分现在的浏览器都支持WebSocket,比如Firefox,IE,Chrome,Safari,Opera,并且越来越多的服务器框架现在也同样支持WebSocket。
洗尽了浮华
2018/08/22
3K0
Nginx支持WebSocket反向代理-学习小结
【Nginx】Nginx部署实战——静态文件+反向代理+均衡负载+Https+Websocket
Nginx是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。前一段时间听说Igor Sysoev被俄罗斯警方带走了,不知道放出来了没有。言归正常,来看一下nginx的相关配置如何满足我们的日常需求吧。
DDGarfield
2022/06/23
2.4K0
基于websocket单台机器支持百万连接分布式聊天(IM)系统
使用golang实现websocket通讯,单机可以支持百万连接,使用gin框架、nginx负载、可以水平部署、程序内部相互通讯、使用grpc通讯协议。
link1st
2019/09/19
7.4K0
基于websocket单台机器支持百万连接分布式聊天(IM)系统
Nginx学习之反向代理WebSocket配置实例
写在开始 去年,做过一款竞赛打分的APP。具体需求,同组教师之间可以相互通信,及时通知同组人员,其他组员做了那些操作(当然,这只是针对特定操作)。 实现方案 采用目前比较成熟的WebSocket技术,WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择。其为HTML5的一部分,WebSocket相较于原来开发这类app的方法来说,其能使开发更加地简单。大部分现在的浏览器都支持WebSocket,比如Firefox,IE,Chrome,Safari,Opera,并且越来越多
小柒2012
2018/04/16
1.8K0
nginx代理Websocket
有需求使用nginx反向代理websockt,因为webSocket协议是基于http协议的,因此可以使用nginx反向代理webSocket.
古人诗
2020/03/18
1.5K0
nginx 代理websocket
nginx实现对websocket 反向代理。 keepalive_timeout 1800; map $http_upgrade $connection_upgrade { default upgrade; '' close; } server { listen 80; server_name localhost; location / { proxy_pass
地球流浪猫
2020/01/02
8970
nginx 设置 websocket 反向代理
废话不多说,nginx 配置如下: #user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #pid logs/nginx.pid; events { worker_connections 1024; } http { include mime
前Thoughtworks-杨焱
2021/12/08
5400
nginx反向代理配置详解
西里网
2025/03/23
2010
nginx配置websocket支持wss
128.190.82.105:8888是真正的服务端地址,nginx所在域名是proxy.hello.com,代理的端口号是8888,所以前端访问的时候这样配置:
后端技术探索
2018/12/24
8.1K0
nginx配置websocket支持wss
Nginx Websocket 配置
WebSocket 是一种基于 TCP 连接的全双工通信的协议,其工作在应用层,建立连接的时候通过复用 Http 握手通道,完成 Http 协议的切换升级,即切换到 WebSocket 协议,协议切换成功后,将不再需要客户端发起请求,服务端就可以直接主动向客户端发送数据,实现双向通信。
Se7en258
2021/05/18
5.4K0
Nginx Websocket 配置
「应用中间件」使用NGINX作为WebSocket代理
WebSocket协议提供了一种创建支持客户端和服务器之间实时双向通信的web应用程序的方法。作为HTML5的一部分,WebSocket使开发这些类型的应用程序比以前可用的方法容易得多。大多数现代浏览器都支持WebSocket,包括Chrome、Firefox、Internet Explorer、Opera和Safari,现在越来越多的服务器应用程序框架也支持WebSocket。
架构师研究会
2019/09/25
1.6K0
「应用中间件」使用NGINX作为WebSocket代理
WebSocket协议 8 问
WebSocket是一种比较新的协议,它是伴随着html5规范而生的,虽然还比较年轻,但大多主流浏览器都已经支持。它使用方便、应用广泛,已经渗透到前后端开发的各种场景中。
xjjdog
2019/09/24
9320
WebSocket协议 8 问
相关推荐
Web服务器-Nginx代理WebSocket
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验