如何实现 WebSocket 反向代理?

createh51周前 (06-29)技术教程11

前言

为什么要代理 WebSocket?

是这样的,因为我们有个基于 electron 的桌面应用,他在本地提供 httpwebsocket 两个服务,客户端(浏览器)可以使用这些服务来完成一些核心业务需要。

问题是,目前该应用只支持 windows 平台,虽然生产环境对环境有所要求,但部分开发却是 mac 电脑,无法安装该客户端,总不能要求开发者安装个虚拟机,或者尽快开发个 mac 版,无论硬件还是软件,搭建开发环境的成本都太高。

于是设想在一台 windows 电脑上共享桌面应用服务,在测试环境做请求代理,以便持有 mac 或者安装应用有问题的同学进行无障碍快速接入。

这篇就讲下如何配置 webpacknginx 来完成这样的“小工程”。

架构设计

下图主要示意了如下几个方面:

  • 桌面服务被安装在可用的 windows 机器上
  • 开发环境通过配置 webpack 进行请求转发
  • 对于 mac 平台及不适配的情况,统一通过 nginx 进行请求转发

跨平台 socket 代理策略

webpack-dev-server

项目基于 vue-cli,首先需要对 vue.config.jswebpack 的代理部分进行修改。

先设置 VUE_APP_PROXY_URL,定义目标转发环境的(IP)地址,再添加 VUE_APP_PROXY_PLATFORM 决定是否开启转发功能。

# env.local
VUE_APP_PROXY_PLATFORM = mac
VUE_APP_PROXY_URL = 192.168.1.x:81
// vue.config.js
var proxy = {
  // 后端服务
  ['/api']: {
    target: process.env.VUE_PROXY_API,
  },
};

if (VUE_APP_PROXY_PLATFORM == 'mac') {
  proxy = Object.assign(proxy, {
    // 桌面应用 http 服务
    ['/app-api']: {
      target: 'http://' + process.env.VUE_APP_PROXY_URL,
    },
    // 桌面应用 websocket 服务
    ['/app-ws']: {
      target: 'ws://' + process.env.VUE_APP_PROXY_URL,
      ws: true, //开启 websocket 支持
      pathRewrite: {
        '^/app-ws': '/',
      },
    },
  });
}
module.exports = {
  // ...
  devServer: {
    host: '0.0.0.0',
    port: port,
    open: true,
    proxy: proxy,
  },
};

接下来只要在业务代码中,添加对应 /app** 前缀来匹配代理规则即可。

nginx

nginx 端配置简单,只需要对协议进行升级即可:

server {
  listen  81;

  # http 代理
  location /app-api/ {
    proxy_pass http://192.168.1.y:18455/;
  }

  # websocket 代理
  location / {
    proxy_pass http://192.168.1.y:18455/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
  }
}

最后

本文主要记录我在遇到这个问题时,实施的解决方案,但不具备通用性。不过也希望为有遇到类似场景问题的同学提供一个方向的解决思路。

相关文章

nginx解码特殊字符引发400问题处理案例分享

问题背景和现象公司任务管理使用的是开源的redmine,以前是单机部署(bitnami_redmine),后来由于项目数量、人员数量和任务数量的增加,卡顿问题比较明显,于是改造为基于k8s的分布式集群...

百万级并发架构全解:LVS + Nginx + Keepalived架构图解!

关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。百万级并发架构是大型架构经常涉及的,下面我重点来详解如何实现百万级并发架构@mikechen文章来源:mikech...

Nginx学习笔记(15) proxy_pass用法常见误区

两种常见用法# 带/和不带/用法区别 proxy_pass http://127.0.0.1:8090 proxy_pass http://127.0.0.1:8090/ ** 代理到上游服务器的UR...

nginx alias location 区别

Nginx 中的 alias 和 location 是两种不同的配置指令,用于实现不同的目的。location 指令用于定义 Nginx 的 URL 匹配规则,当请求的 URL 匹配某个 locati...

Helm 实战:用 Helm 部署一个 Nginx 应用

这一篇,我们将动手实战:用 Helm 从零部署一个 Nginx 应用,并掌握 Helm Chart 的结构和参数化技巧。一、准备环境在开始之前,你需要确保环境中具备以下工具:已部署的 Kubernet...