微信小程序使用nginx1.24代理,访问wss报错

问题遇到的现象和发生背景

困扰我三天的问题:使用uniapp开发一个即时聊天功能,前端是运行在微信小程序,域名都配置好了,使用nginx-1.24.0作代理,
代码如下:

map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
location /wss/ {
        
       
        proxy_pass http://127.0.0.1:8080/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
         }
操作环境、软件版本等信息

阿里云 centos8.2 nginx 1.24 稳定版本

尝试过的解决方法

发布生产环境之后,使用wss可以访问到nginx,因为access.log中有记录
如下:
"GET /wss/im/eyJhbGdYraqNi0s_qdSuxVbPlOs HTTP/1.1" 302 0 "https://servicewechat.com/wx65433f6809b19dk2/devtools/page-frame.html" "wechatdevtools desktopapp appservice port/48912 token/4b477f0bd34cc80ef4a42242673c4a23 runtime/2"

小程序端报错

WebSocket connection to 'wss:/xxxx:7985/wss/im/eyJhbiOiJ0b2tlbklkIn0.NyoyMclPKuXdYraqNi0s_qdSuxVbPlOs' failed: 

配置怎么更换都不起作用,不通过nginx代理直连可以成功访问后台,不会报错。

我想要达到的结果

希望通过大家们帮忙解决掉这个问题,谢谢啦

根据你提供的信息,你遇到的问题是在使用uniapp开发微信小程序的即时聊天功能时,通过Nginx代理的WebSocket连接无法正常工作,但直连后台可以成功访问且不报错。

在这种情况下,有几个可能的原因和解决方法可以尝试:

确保Nginx配置正确:确保你在Nginx配置中正确设置了WebSocket代理。请确保以下配置项是否正确设置在你

的Nginx配置文件中的http块中:


map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

location /wss/ {
    proxy_pass http://127.0.0.1:8080/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
}

此配置将请求转发到http://127.0.0.1:8080/,并在HTTP头部设置升级和连接升级。
检查后台服务器的WebSocket支持:确保您的后台服务器支持WebSocket协议。请确保后台服务器能够处理WebSocket连接请求并进行适当的处理。

检查防火墙和安全组设置:检查您的服务器防火墙和安全组设置,确保WebSocket流量被允许通过。确保服务器的端口7985是开放的,并允许与该端口的WebSocket连接。

检查证书配置:如果您的网站使用HTTPS,确保Nginx配置中正确配置了SSL证书,并且证书有效。

检查前端代码:确保您的前端代码正确设置了WebSocket连接地址,并且与Nginx代理的配置相匹配。

  • 你可以看下这个问题的回答https://ask.csdn.net/questions/693217
  • 除此之外, 这篇博客: 前端与Nginx[介绍,安装,负载均衡调度,算法,配置]中的 说白啦是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:

根据你提供的信息,出现错误的地方可能有两个方面:

  1. Nginx代理配置错误
    你的Nginx配置中建立了wss的代理,但是可以看到你的请求访问的是/wss路径,而你的代理却是http://127.0.0.1:8080/,可能会导致代理失败。建议修改Nginx代理配置如下:
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}
location /wss/ {
    proxy_pass ws://127.0.0.1:8080/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
    proxy_set_header X-Real-IP $remote_addr;
}

这里使用ws协议替代http协议,并将代理地址指向ws协议的地址。

  1. 小程序可能存在跨域请求问题
    小程序本身存在跨域请求限制,需要在小程序端配置特定的请求头和配置。如果你确认Nginx代理配置没有问题,可以尝试在小程序端修改请求头中的origin为Nginx代理地址,例如:
wx.connectSocket({
    url: "wss://xxxx:7985/wss/im/eyJhbiOiJ0b2tlbklkIn0.NyoyMclPKuXdYraqNi0s_qdSuxVbPlOs",
    header: {
        "content-type": "application/json",
        "origin": "https://xxxx" // Nginx代理地址
    },
    success: function (res) {
        console.log('websocket连接成功')
    },
    fail: function (res) {
        console.log('websocket连接失败')
    }
})

如果以上两个方法都无法解决问题,建议你查看后端日志,看看后端是否可以正常接收到WSS请求,排除后端服务异常的可能原因。

困扰我三天的问题:使用uniapp开发一个即时聊天功能,前端是运行在微信小程序,域名都配置好了,使用nginx-1.24.0作代理,
代码如下:


map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
location /wss/ {
        
       
        proxy_pass http://127.0.0.1:8080/;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header X-Real-IP $remote_addr;
         }

操作环境、软件版本等信息
阿里云 centos8.2 nginx 1.24 稳定版本

尝试过的解决方法
发布生产环境之后,使用wss可以访问到nginx,因为access.log中有记录
如下:
"GET /wss/im/eyJhbGdYraqNi0s_qdSuxVbPlOs HTTP/1.1" 302 0 "https://servicewechat.com/wx65433f6809b19dk2/devtools/page-frame.html" "wechatdevtools desktopapp appservice port/48912 token/4b477f0bd34cc80ef4a42242673c4a23 runtime/2"

小程序端报错

WebSocket connection to 'wss:/xxxx:7985/wss/im/eyJhbiOiJ0b2tlbklkIn0.NyoyMclPKuXdYraqNi0s_qdSuxVbPlOs' failed:
配置怎么更换都不起作用,不通过nginx代理直连可以成功访问后台,不会报错。

我想要达到的结果

问题出在nginx未能识别 URL ,导致无法访问,