You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Docker环境中通过Nginx代理Vite的HMR请求?解决WebSocket连接失败问题

解决Vite HMR WebSocket连接失败的思路

结合你的配置和报错信息,我整理了几个针对性的排查和解决方向:

1. 修正Vite HMR的客户端连接端口

你的报错显示WebSocket请求尝试连接 wss://url.xyz:3300/__vite_hmr,但通常Nginx会在443端口提供HTTPS服务(而非3300)。Vite默认会用自己的server.port作为WebSocket端口,这就导致客户端直接连到了Vite的端口,而不是经过Nginx的HTTPS代理。

你可以在vite.config.ts里指定HMR的客户端端口为Nginx的HTTPS端口(一般是443):

export default defineConfig({
  server: {
    host: true,
    port: 3300,
    hmr: {
      path: '/__vite_hmr',
      clientPort: 443, // 匹配Nginx的HTTPS监听端口
      protocol: 'wss', // 明确使用WebSocket Secure协议
    },
  },
})

或者直接指定完整的客户端WebSocket地址:

hmr: {
  path: '/__vite_hmr',
  clientURL: 'wss://url.xyz/__vite_hmr',
}

2. 检查Nginx的SSL配置完整性

因为你使用的是wss协议,Nginx必须正确配置SSL证书才能建立安全连接。确保你的Nginx配置中包含以下SSL相关指令:

server {
  listen 443 ssl;
  ssl_certificate /path/to/your/cert.pem;
  ssl_certificate_key /path/to/your/private.key;
  # 可选但推荐的SSL优化配置
  ssl_protocols TLSv1.2 TLSv1.3;
  ssl_ciphers HIGH:!aNULL:!MD5;
}

如果证书无效或配置缺失,浏览器会直接拒绝建立wss连接。

3. 验证Nginx代理的连通性

确认Nginx所在环境能正常解析并访问http://cr-frontend:3300

  • 如果是Docker环境,检查cr-frontend服务是否和Nginx在同一个网络,能否通过服务名正常访问
  • 可以在Nginx容器内执行curl http://cr-frontend:3300/__vite_hmr测试连通性,看是否能得到Vite的HMR响应

同时查看Nginx的错误日志(通常路径是/var/log/nginx/error.log),里面可能会有代理失败的具体原因,比如连接超时、主机名解析失败等。

4. 确保Nginx location的优先级

你的location ~* /__vite_hmr是正则匹配,要确保它在其他可能拦截该路径的location规则之前。比如如果有location /这样的通用规则放在前面,可能会优先匹配导致HMR请求没有被正确代理。调整location的顺序,让HMR的规则排在更前面。

5. 检查Vite的HMR监听配置

虽然你设置了host: true让Vite监听0.0.0.0,但可以额外指定HMR的监听地址,确保它能被Nginx访问到:

hmr: {
  path: '/__vite_hmr',
  host: 'cr-frontend', // 和Nginx代理的主机名一致
}

内容的提问来源于stack exchange,提问作者Andre Pena

火山引擎 最新活动