nginx在https环境下代理 WebSocket 遇到的问题

前几天开始测试的时候出现了点问题,项目用到了 WebSocket 协议,访问直接抛 403,也是,如果是 nginx 处理 WebSocket 请求不做点特殊配置就直接返回 403,所以就添加了一下 nginx 代理 WebSocket 的配置。

nginx 代理 WebSocket 配置

在 nginx.conf 的 http 模块添加如下内容

  1.        map $http_upgrade $connection_upgrade {

  2.        default upgrade;

  3.        ''      close;

  4.    }

域名 location

  1.        proxy_http_version 1.1;

  2.        proxy_set_header Upgrade $http_upgrade;

  3.        proxy_set_header Connection "upgrade";

 

配置完以上内容即可正常访问 WebSocket,经过测试没有发现问题,http 环境下。

启用全站 https 之后发现的问题

再然后,昨天吧,某汪表示想先开启全站 https,然后我就随便搞了个证书,调了一下配置,也就启了全站 https,但是启完之后没有做测试,以为没出什么叉子,结果今天下午准备正式对外了,才发现 websocket 又特么崩了,访问直接返回 403,卧槽?怎么崩的?有人改配置了?我看了一下配置文件,没变,还是之前的样子,相关配置也都在。

然而他的后台也抛异常了

SockJS

  1. in a frame because it set multiple 'x-frame-options' headers with conflicting values ('deny, sameorigin'). falling back to 'deny'.

服务端报警告:

  1. o.s.w.s.s.t.h.DefaultSockJsService: Origin check enabled but transport 'jsonp' does not support it.

同时过几秒后 Freemarker 会大量抛出异常

  1. java.lang.IllegalStateException: getOutputStream() has already been called for this response

最后把矛头指向了 https,是不是启 https 才出现的问题,然后又把 https 的注释掉了,以 http 的形式访问了一下,返回 101,http 就木有问题,而 https 就崩了。

原因:某汪表示原因是因为 tomcat 没有获取到正确的协议,需要配置 nginx 将客户端请求的协议和端口也要传给 tomcat,所以在域名 location 添加了以下两行。

  1. proxy_set_header X-Forwarded-Port $Server_port;

  2. proxy_set_header X-Forwarded-Proto $scheme;

 

同时某汪那头 Spring Boot 配置文件里也要加上如下配置:

  1. server:

  2.    use-forward-headers: true

添加之后重载 nginx,再次访问,恢复正常了。

最后,附上完整的域名 location 配置文件

location / {

  1.  

  2. proxy_set_header Host $Host;

  3. proxy_pass http://127.0.0.1:8080;

  4. proxy_set_header X-Real-IP $remote_addr;

  5. proxy_set_header X-Forwarded-Proto $scheme;

  6. proxy_set_header X-Forwarded-Port $Server_port;

  7. proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

  8.  

  9. proxy_http_version 1.1;

  10. proxy_set_header Upgrade $http_upgrade;

  11. proxy_set_header Connection "upgrade";

  12.  

  13.  

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值