https协议下配置websocket问题(踩坑)_uncaught domexception: failed to construct 'websoc_喜羊羊love红太狼的博客-程序员宅基地

技术标签: 网络  websocket  网络协议  

目录

场景:

 本地环境

本地环境前端:

本地环境后端

现场环境:

nginx配置

问题一:

原因:https协议下不能使用ws去访问

问题二:改用wss建立连接后提示连接失败

正确的配置

理论知识

场景:

在本地开发环境中一直使用的是windows+http+websocket,本地测试都是正常的,但是部署到线上时使用的是https,导致websocket一直连接失败

 本地环境

本地环境前端:

ws://ip.端口/GisqPlatformExplorer/ws/login.do

其中loginWebSocketUrl=ws://192.168.xx.xx:8082

本地环境后端

原理就是:当我websocket访问路径含有/ws/login.do时,会对该访问进行loginwebsocketHandler处理。我这里功能主要是访问该路径时,记录用户登录登出日志的功能(前面博客有写过)。

现场线上环境:

linux+https+nginx+websocket

nginx配置


worker_processes  1;
events {
    worker_connections  1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;
    client_max_body_size   1024M;

    #gzip  on;

    server {
        listen       11921 ssl;
        server_name  localhost;
		
		ssl_certificate			.\ssl\8872433_xxx.cn.pem;
		ssl_certificate_key		.\ssl\8872433_xxx.cn.key; 
		ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;
        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
		
      location /GisqPlatformExplorer/ws/login.do {
        proxy_pass http://xx.xx.xx.xx:8081;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection "Upgrade";
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Real-IP $remote_addr;  
    }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    # HTTPS server
    server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      ssl/cert.crt;
        ssl_certificate_key  ssl/cert.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
        location /GisqPlatformExplorer/ {
            proxy_pass http://localhost:8081;
        }
    }
}

问题一:

Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS

原因:https协议下不能使用ws去访问

解决方案:改成wss://xx.xx.xx.xx:11921/GisqPlatformExplorer/ws/login.do与websocket建立连接

问题二:改用wss建立连接后提示连接失败

WebSocket connection to 'wss://xx.xx.xx.xxx:11921/GisqPlatformExplorer/ws/login.do' failed 

 有两个地方要注意:

一个是域名问题:使用wss时必须要使用域名去访问。

一个是nginx配置问题:   ‘

错误的配置:

原因主要是加“/”与不加“/”的区别没有搞清楚:nginx中斜杠(/)详解,配置location、proxy_pass时,加“/”与不加“/”的区别

参考:nginx中斜杠(/)详解_nginx_脚本之家

          Nginx中proxy_pass的斜杠(/)问题 - 达摩院的BLOG - 博客园

 
    location /GisqPlatformExplorer/ws/login.do {
        proxy_pass http://xx.xx.xx.xx:8081/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;  
}


实际访问代理地址:http://xx.xx.xx.xx7:8081/

正确的配置

  location /GisqPlatformExplorer/ws/login.do {
        proxy_pass http://127.0.0.1:8081/GisqPlatformExplorer/ws/login.do;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;  
}

实际访问代理地址:http://127.0.0.1:8899/GisqPlatformExplorer/ws/login.do

    location /GisqPlatformExplorer/ws/login.do {
        proxy_pass http://127.0.0.1:8081;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Real-IP $remote_addr;  
}

实际访问代理地址:http://127.0.0.1:8081/GisqPlatformExplorer/ws/login.do

再次测试访问wss://xx.xx.xx.xxx:11921/GisqPlatformExplorer/ws/login.do路径时建立连接成功。

理论知识

(不了解必定会踩坑)

1.http情况下用ws,https情况下必须要使用wss

https相当于使用http+ssl认证,使用https时websocket访问(比如建立链接时)必须要使用wss

2. 使用域名

https下一般都是域名去访问的,存在有域名解析的过程,因此wss时也要使用域名

3.使用域名+指定端口

这个之前没有了解过,只是认为域名就包含了端口,其实也是可以指定端口的下面是现场环境访问的路径

nginx斜杠问题:

参考如下写的不错,很容易理解

Nginx中proxy_pass的斜杠(/)问题 - 达摩院的BLOG - 博客园

location /api1/ {
    proxy_pass http://localhost:8080;
}

在访问http://localhost/api1/xxx时,会代理到http://localhost:8080/api1/xxx

location /api2/ {
    proxy_pass http://localhost:8080/;
}

当访问http://localhost/api2/xxx时,http://localhost/api2/(注意最后的/)被替换成了http://localhost:8080/,然后再加上剩下的xxx,于是变成了http://localhost:8080/xxx。

主要看proxy_pass http://localhost:8080,这种方式称为不带URI方式;

proxy_pass http://localhost:8080/xx或http://localhost:8080/,这种方式称为带URI方式;

其中不带URI方式主要是匹配(保留匹配路径及后面的所有),而带URI方式主要是替换(将匹配到的相同部分替换掉,然后保留完全匹配后面的所有)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_38423256/article/details/128465212

智能推荐

fork 与vfork 的异同_简述fork与vfork的区别-程序员宅基地

vfork 与fork异同总结前言调⽤fork或vfork函数是Linux创建⼀个新进程的⽅法.fork由fork创建的新进程被称为⼦进程(child process)。该函数被调⽤⼀次,但返回两次。两次返回的区别是⼦进程的返回值是0,⽽⽗进程的返回 值则是新⼦进程的进程ID。fork之后经常跟随着exec。作为替代,使⽤了在写时复制(..._简述fork与vfork的区别

ros rviz 下发命令到远程主机-程序员宅基地

rviz控制远程主机,下发导航和重置位姿gedit ~/.bashrc在本机添加以下字段export ROS_MASTER_URI=http://192.168.1.102:11311 #填写远程主机ipexport ROS_HOSTNAME=`hostname -I` #不需要修改export ROS_IP=192.168.1.167 #填写本机ip或者添加以下字段,需要使用的时候就输入ros_ssh_on,不需要远程的时候就可以ros_ssh_offfunction ros

使用web3进行合约部署调用以及监听_web3 approve-程序员宅基地

token合约是官方提供的一个样例,这里给出我修改过的版本,方便演示.contract MyToken { /* Public variables of the token */ string public name; string public symbol; uint8 public decimals; /* This creates an..._web3 approve

Android studio 编译错误:CreateProcess error=206, 文件名或扩展名太长。_独上西楼-的博客-程序员宅基地

Android studio 编译错误:CreateProcess error=206, 文件名或扩展名太长。原因为 bin 文件的路径层级太多解决方法:Android Studio -> Run -> Edit Configurations -> Templates -> Application-> shorten command line: 选择 JAR manifest -java -cp classpath.jar classname [args]..

基于Linux的流水灯驱动实验,Linux下设备驱动程序开发(led流水灯驱动).doc_YJ林的博客-程序员宅基地

--(完美WORD文档DOC格式,可在线免费浏览全文和下载)值得下载!设备驱动程序的开发流程进行嵌入式Linux系统的开发,很大的工作量是为各种设备编写驱动程序。在ARM平台上开发嵌入式Linux的设备驱动程序与在其他平台上开发是一样的。总的来说,实现一个嵌入式Linux设备驱动的大致流程如下:(1)查看原理图,理解设备的工作原理(2)定义主设备号(3)在驱动程序中实现驱动的初始化。如果驱动程序采...

java mp3file_java 播放mp3文件-程序员宅基地

java播放mp3格式音频文件将jl1.0.0.1.jar拷贝到项目中,并添加到Library源代码package com.lt.music;import java.io.BufferedInputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import..._java能用flie类型接收mp3文件吗

随便推点

MySQL查看建库建表语句-程序员宅基地

有时候我们需要查看mysql的建表语句,以下是具体操作查看数据库创建语句SHOW CREATE DATABASE ZOO\G;类似的查看建表语句:查看所有存储引擎:SHOW ENGINES \G; 查看默认存储引擎:SHOW VARIABLES LIKE 'storage_engine';查看当前使用数据库:SELECT DATABASE();或者使用命令:STATUSwin下修改默认存储引擎,找...

Oracle 索引的创建,删除,修改_改索引 要清空数据吗-程序员宅基地

**1.创建索引 CREATE INDEX** CREATE [unique] INDEX [user.]index //索引名 ON [user.]table //建立索引的表名 (column [ASC | DESC] [,column[ASC | DESC] ] … )//建立索引的列,一个索引最多有16列,long列、long raw列不能建索引列 ,asc升序排列(默认)desc_改索引 要清空数据吗

[深度学习从入门到女装]Context Encoding for Semantic Segmentation-程序员宅基地

论文地址:Context Encoding for Semantic Segmentation 这是CVPR2018上的一篇oral,来自商汤科技CNNs are able to capture the informative representations with global receptive fields by stacking convolutional layers wi..._context encoding for semantic segmentation

像滤镜一样改变字体颜色-程序员宅基地

标题是什么意思?可能一开始觉得怪怪的,字体颜色不就是一个css的样式就改变了吗?css样式是改变整个字体的颜色,但是怎么改变半个甚至0.3333...个字体的颜色呢?先看看效果,预览网址CodePen地址:codepen.io/itagn/pen/a…从零开始html<div class="box"> <div class="down">东东么么哒<...

MySql面试题、知识汇总、牛客网SQL专题练习-程序员宅基地

数据库链接地址:Linux运维必会的100道MySql面试题之(一)Linux运维必会的100道MySql面试题之(二)Linux运维必会的100道MySql面试题之(三)Linux运维必会的100道MySql面试题之(四)史上最全的大厂Mysql面试题在这里企业面试题|最常问的MySQL面试题集合(一)企业面试题|最常问的MySQL面试题集合(二)面试中有哪些经典的数据库问题?...

白盒测试练习及答案-程序员宅基地

1、在白盒测试用例设计中,有语句覆盖、分支覆盖、条件覆盖、路径覆盖等,其中( A )是最强的覆盖准则。为了对如下图所示的程序段进行覆盖测试,必须适当地选取测试用例组。若x, y是两个变量,可供选择的测试用例组共有Ⅰ、Ⅱ、Ⅲ、Ⅳ四组,如表中给出,则实现判定覆盖至少应采取的测试用例组是( B )或( C );实现条件覆盖至少应采取的测试用例组是( D );实现路径覆盖至少应采取的测试用_白盒测试