开源标准版系统长链接反向代理详解

一、nginx反向代理

复制代码
location /notice {
    proxy_pass http://127.0.0.1:50001/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
}
location /msg {
    proxy_pass http://127.0.0.1:50002/;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
}

Copy

这个 nginx 配置是为了反向代理 CRMEB 标准版的长连接服务。

复制代码
location /notice 对应的是公告长连接,proxy_pass 反向代理到 50001 端口。
location /msg 对应的是聊天长连接,proxy_pass 反向代理到 50002 端口。

Copy

关键的是下面的几行配置,这些配置的作用是:

复制代码
#设置代理使用 HTTP/1.1 协议,以支持 WebSocket 长连接。
proxy_http_version 1.1;

#将请求头中的 Upgrade 字段传递给后端服务器,通知后端需要升级到 WebSocket 协议。
proxy_set_header Upgrade $http_upgrade;

#将连接方式改为 "upgrade",通知需要升级到 WebSocket。
proxy_set_header Connection "upgrade";

Copy

后面的两行配置是设置代理时需要增加的 headers,用来传递真实 IP。

复制代码
#增加的 headers,传递真实 IP。
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;

Copy

所以总结一下,这些配置的作用就是让 nginx 支持对 WebSocket 的反向代理,实现长连接服务的反向代理。

这组 nginx 配置的实际作用是:

    1. 实现公告和聊天的长连接服务的反向代理。
    2. 通过 location 分别代理到不同端口,实现公告和聊天长连接的分离。
    3. 支持WebSocket协议,可以代理WebSocket长连接。
    4. 传递真实用户 IP,方便服务器获取。

将长连接服务部署在内网,通过 nginx 反向代理到公网。好处是:

    1. 可以实现内外网分离,服务器安全性更高。
    2. 可以随时调整长连接服务的部署,而不影响公网访问。
    3. 可以实现公告和聊天的分离部署,系统拆分更清晰。
    4. nginx 可以承载更多的长连接,有更好的性能。
    5. 有利于按域名进行访问控制。

所以实际上是利用 nginx 提供反向代理和负载均衡的功能,实现 CRMEB 长连接服务的反向代理,使得系统部署更加灵活安全。

二、apache反向代理

复制代码
ProxyPass /notice ws://127.0.0.1:50001/
ProxyPass /msg ws://127.0.0.1:50002/
ProxyPassReverse /notice ws://127.0.0.1:50001/
ProxyPassReverse /msg ws://127.0.0.1:50002/

Copy

其实默认的apache的方向代理应该是下方的配置

复制代码
# 公告长连接反向代理以及#聊天长连接反向代理
ProxyPass /notice ws://127.0.0.1:50001/
ProxyPass /msg ws://127.0.0.1:50002/
ProxyPassReverse /notice ws://127.0.0.1:50001/
ProxyPassReverse /msg ws://127.0.0.1:50002/

# 设置http version为1.1以支持websocket
ProxyProtocol http/1.1

# 将 Upgrade 和 Connection 请求头传递给后端
ProxyPassReverse "/notice" "upgrade"
ProxyPassReverse "/msg" "upgrade"

# 传递真实IP
ProxyPreserveHost On
RequestHeader set X-Real-IP %{REMOTE_ADDR}s
RequestHeader set X-Forwarded-For %{REMOTE_ADDR}s

Copy

但是Apache 从 2.4.11 版本开始,默认支持 HTTP/1.1 和 WebSocket 协议的反向代理。

也就是说,现在的 Apache 默认就可以代理 WebSocket 连接,不需要显式设置 Protocol 为 HTTP/1.1。

另外,Apache 在代理 WebSocket 时,会自动将 Upgrade 和 Connection 请求头传递给后端服务器。

所以您只需要指定目标服务器地址,而不需要设置协议版本和传递 Upgrade 头,Apache 会自动处理这些细节。

这也体现了 Apache 在反向代理能力上的进步与优化。

你仅仅添加 ProxyPass 和 ProxyPassReverse 就能工作,是因为:

    1. Apache 默认支持 WebSocket 反代,无需指定协议版本
    2. Apache 会自动传递 Upgrade 请求头
    3. 其他头信息在简单反代场景下可不传递

对于Apache来说,80端口和443端口的配置是可以不同的,是否都需要增加反向代理配置,主要取决于实际场景:

    1. 如果你只在80端口提供网站访问,那么只在80端口的VirtualHost中配置反向代理即可。
    2. 如果你在80端口提供普通网站访问,在443端口提供加密HTTPS访问,那么要分别在两个VirtualHost中根据需要配置反向代理。
    3. 如果你在80端口直接跳转到443端口,那么只需要在443端口的VirtualHost中配置反向代理即可。
    4. 如果你在80和443端口都提供网站服务,则需在两个VirtualHost中都配置反向代理,保证HTTP和HTTPS下功能一致。

以上就是对开源标准版的长链接反向代理的详细解读,谢谢大家关注CRMEB

相关推荐
程序员鱼皮12 分钟前
刚刚 Java 25 炸裂发布!让 Java 再次伟大
java·javascript·计算机·程序员·编程·开发·代码
w_y_fan22 分钟前
Flutter 滚动组件总结
前端·flutter
wuli金居哇24 分钟前
我用 Turborepo 搭了个 Monorepo 脚手架,开发体验直接起飞!
前端
Asort26 分钟前
JavaScript 从零开始(五):运算符和表达式——从零开始掌握算术、比较与逻辑运算
前端·javascript
BingoGo29 分钟前
2025 年 PHP 常见面试题整理以及对应答案和代码示例
后端·php
一枚前端小能手29 分钟前
🚀 缓存用错了网站更慢?前端缓存策略的5个致命误区
前端·javascript
艾小码30 分钟前
为什么你的页面会闪烁?useLayoutEffect和useEffect的区别藏在这里!
前端·javascript·react.js
艾小码30 分钟前
告别Vue混入的坑!Composition API让我效率翻倍的3个秘密
前端·javascript·vue.js
南雨北斗31 分钟前
VS Code 中手动和直接运行TS代码
前端
小高00733 分钟前
🔍说说对React的理解?有哪些特性?
前端·javascript·react.js