websocket返回200,获取websocket返回的数据

  websocket返回200,获取websocket返回的数据

  00-1010现象、抓包、问题检查、问题定位、解决方案1、解决方案2、原因讨论和总结

  00-1010生产环境websocket无法正常连接,服务器返回400错误请求。开发和测试环境是正常的。

  00-1010 src: nginx服务器172.16.177.193

  Dst:imp应用服务器172.16.177.218

  00-1010可以观察到报头中的主机值带有下划线。在一些中间件(如kafka、hadoop)中,对主机中的特殊字符也有限制。估计是表头问题。

  据调查,这个头来自nginx的上游。

  00-1010修改nginx的上游配置,删除下划线。

  00-1010既然下划线用在上游,为什么普通http请求正常,websocket返回400?

  看看普通http请求的数据包捕获。

  Src: nginx服务器172.31.47.151

  Dst: imp应用服务器172.31.47.153

  可以看到,报头中的主机是转发给目标服务器的,这个主机没有下划线,所以请求是正常的。

  所以如果不修改nginx中上行下划线的配置,其实可以在服务器中对应websocket的位置添加参数,从而转发原请求的主机。

  proxy _ set _ header Host $ hostproxy _ set _ header X-real-IP $ remote _ addr;proxy _ set _ header X-Forwarded-For $ proxy _ add _ X _ Forwarded _ For;

  配置的数据包捕获如下

  请求正常

  00-1010下划线主机,为什么被服务器返回400?按照上面的故障排除流程,应该是tomcat返回的。

  这一切都始于RFC协议规范。

  RFC-1034是关于DNS和域名基础的标准。在“3.5首选名称语法”中,提到主机名有格式规范:以字母开头,以字母或数字结尾,中间包括字母、数字或横杠。

  可以看出,RFC-1034标准中下划线是不允许的。

  Tomcat在8.x升级中遵循这个标准来验证主机。详情见链接。

  org . Apache . coyote . abstract processor # parse host

  org . Apache . Tomcat . util . http . parser . host # parse(Java . io . reader)

  00-1010我们日常配置主机参数时,尽量避免使用下划线。包括/etc/hosts下的配置。有时候,在集群环境中,为了管理方便,会对主机进行配置。此时,应避免使用下划线。因为中间件也可能遵循RTC规范。

  阅读延伸

  如果你看了上面的规范,你可能会有疑问,为什么:和网易163可以以数字开头?可以先了解一下域名解析流程。

  下面是一些科普的基本概念。

  域名是DNS数据库中资源的标识符标签域名的两个点之间的部分域名是一种特殊类型的域名,用于标识Internet主机

  域名是dns数据库中的唯一标识,标签是以“.”分隔的单位在域名中,主机名是地址的特殊域名映射。

  在1989年的RFC-1101中,“3.1网络名称语法”定义了网络术语的DNS编码规范。数字的开头是允许的,只要它不与八位字节形式的ip地址冲突。

  在1997年的RFC-2181中,“11名称语法”阐明了域名语法,下划线不应被DNS服务拒绝。

  近几年在一个CA/B论坛上,很多大厂都投票禁止在域名中使用下划线,否则无法正常申请SSL证书。

  有兴趣的朋友可以尝试建一个网站,做域名映射。需要说明的是,在做域名映射的时候,因为是主机名,A和MX记录不能加下划线。由于CNAME记录是针对域名的,因此它们是否受支持取决于您的DNS服务提供商。

  这就是这篇关于在线websocket return 400问题的故障排除的文章。关于websocket return 400问题的更多信息,请搜索Popular IT之前的文章或者继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: