解决websocket在部署到服务器https下无法使用的问题

news/2025/1/15 14:12:53/

目录

一、问题

1.1 问题描述

1.2 问题详细描述

二、解决

2.1 https下的链接类型

2.2 修改Nginx的配置

一、问题

1.1 问题描述

一个小项目中使用到了websocket,这个websocket在本地完全是完全正常运行的,不管是前后台的信息通讯 还是 异常报错接收无任何异常,但当把后台代码部署到阿里云服务器后,websocket就再也链接不上了;

(PS: 博主的websocket是应用在uni-app中的,因此使用的是uni-app自带的websocket,这个本质上没有任何区别~)

1.2 问题详细描述

uni-app端的简易websocket代码,大致如下;

// 建立websocket
uni.connectSocket({url: Setting.wsUrl
});// 打开
uni.onSocketOpen(res => {console.log('--- 数据通信已打开 ---');
});uni.onSocketError((res) => {console.log('--- 数据通信连接失败,请检查 ---');
});uni.onSocketMessage((res) => {// console.log('收到服务器内容:' + res.data);this.resultData(JSON.parse(res.data))
});

当项目启动打开websocket页面,与后台链接成功后前台会打印出:--- 数据通信已打开 ---,

运行后在本地正确打印了结果

但是 当后台文件打包部署到阿里云服务器 后,websocket链接异常,无法正确打印结果;

二、解决

我在这里一共遇到了 两个错误,第一个分别是 https下的链接类型 以及 nginx配置异常 这两个问题,这两个问题解决后,websocket即可正常使用了;

2.1 https下的链接类型

这个问题主要在于链接中的类型写错了,需要把 ws 改写成 wss ,如本地的时候由于使用的是http类型,因此websocket的链接写成了

ws://localhost:5002

但当部署到服务器之后,由于服务器是https的格式,因此ws显然不再合适了,需要改成 wss,即

wss://www.xxxxxx.com/xxx/

放到具体uni-app代码中就是这样

// 建立websocket
uni.connectSocket({url: "ws://localhost:5002"
});// 需要改成 wss 开头的
uni.connectSocket({url: "wss://www.xxxx.com/xxxx"
});

这样,就将兼容https下的websocket了;

2.2 修改Nginx的配置

除了改wss外,nginx同样要修改,默认情况下的Nginx是不支持的,因此需要手动去开通这个功能;

首先,找到Nginx的配置文件,然后在配置文件中为需要开通websocket的后台加上这几条语句

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;  

以我这边为例,改之前是这样的

server {listen 443 ssl;server_name www.xxxx.com;# access_log  /var/log/nginx/access.log  main;# error_log  /var/log/nginx/error.log;ssl_certificate      #填写解压的pem文件ssl_certificate_key  #填写解压的key文件# ssl on;ssl_session_cache    shared:SSL:10m;ssl_session_timeout  50m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root 前台文件;}location /api/ {proxy_pass 后台接口地址;}location /api2/ {proxy_pass 后台接口地址;}
}

改完之后如下

server {listen 443 ssl;server_name www.xxxx.com;# access_log  /var/log/nginx/access.log  main;# error_log  /var/log/nginx/error.log;ssl_certificate      #填写解压的pem文件ssl_certificate_key  #填写解压的key文件# ssl on;ssl_session_cache    shared:SSL:10m;ssl_session_timeout  50m;ssl_ciphers  HIGH:!aNULL:!MD5;ssl_prefer_server_ciphers  on;location / {root 前台文件;}location /api/ {proxy_pass 后台接口地址;}location /api2/ {proxy_pass 后台接口地址;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; }
}

加上之后 重启Nginx,websocket即可正常使用了,解决问题;


http://www.ppmy.cn/news/98522.html

相关文章

XDP入门--eBPF程序实现网桥/二层交换机转发功能

本文目录 1、试验环境2、eBPF字节码源代码实现3、用户态应用层管理与控制程序的源代码实现4、编译与运行5、测试结果 我们在此文的进阶部分 或者 此文中已经描述了如何设置Linux网桥,并将多个以太接口加入网桥后实现一个最基本的二层交换机的二层交换转发功能。Linu…

Linux下的yum和vim

目录 一、Linux软件包管理器yum1.1 何为软件包?1.2 rzsz工具1.3 如何安装和卸载软件?1.4 Linux的软件生态 二、vim文本编辑器 一、Linux软件包管理器yum 1.1 何为软件包? 软件包可以理解成是windows下别人提前编译好的安装包程序&#xff0…

Linux——使用命令行参数管理环境变量

目录 使用命令行参数获取用户在DOS命令行输入的指令: 方法:代码如下: 使用命令行参数获取并打印部分或者整体环境变量的方法: 方法1: 运行结果: 方法2:使用外部链接environ: 使用命令行参数…

应该选择网络安全还是程序员?

很长的时间我都在思考这个问题.,根据自己的经验和朋友们的讨论后得出了一些结论,网络安全 这个概念太广,我就以安服/渗透岗作为比较的对象,题主可以参考一下: 程序员: 优点: 1.薪资非常高&a…

【js】对象属性的拦截和Proxy代理与Reflect映射的用法与区别

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录 对象属性的拦截介绍SetGet 对象的拦截介绍使用对象属性拦截和对象拦截区别练习题 映射…

Etcdctl 命令v3

一、v3必须导出环境变量 export ETCDCTL_API3 二、查看版本 etcdctl version 三、写入键 1.基本 etcdctl put foo bar 2.绑定租约 etcdctl put foo bar --leasexxxx 四、获取键 1.基本 etcdctl get foo 2.按十六进制获取 etcdctl get foo --hex 3.只读取键值 et…

Spring高手之路——深入理解与实现IOC依赖查找与依赖注入

本文从xml开始讲解,注解后面给出 文章目录 1. 一个最基本的 IOC 依赖查找实例2. IOC 的两种实现方式2.1 依赖查找(Dependency Lookup)2.2 依赖注入(Dependency Injection) 3. 在三层架构中的 service 层与 dao 层体会依…

数字信号处理8:利用Python进行数字信号处理基础

我前两天买了本MATLAB信号处理,但是很无语,感觉自己对MATLAB的语法很陌生,看了半天也觉得自己写不出来,所以就对着MATLAB自己去写用Python进行的数字信号处理基础,我写了两天左右,基本上把matlab书上的代码…