◄返回
在 Apache 上使用 WebSocket 反向代理 | @a1375625918

在 Apache 上使用 WebSocket 反向代理

2025/02/22 00:18

分类:运维


在 Apache HTTP Server 中,比较常见的 WebSocket 反向代理配置应该是在 mod_proxy_wstunnel 的说明 中提到的这种:

1
2
3
4
5
ProxyPass / http://example.com:9080/
RewriteEngine on
RewriteCond %{HTTP:Upgrade} websocket [NC]
RewriteCond %{HTTP:Connection} upgrade [NC]
RewriteRule ^/?(.*) "ws://example.com:9080/$1" [P,L]

一些看不懂的方括号让 mod_rewrite 完成了条件匹配和代理行为。

我应该从来没有想过弄懂它是什么意思,至少能跑就行。


注意到 mod_proxy_wstunnel 模块被标记了弃用,现在可以使用 Apache HTTP Server 2.4.47 或者更高版本,按照 mod_proxy 的示例 来配置:

1
ProxyPass "/some/ws/capable/path/" "http://example.com/some/ws/capable/path/" upgrade=websocket

一条配置解决之前需要 n 条配置的事情,十分优雅。


常与 ProxyPass 一起使用的命令还有 ProxyPassReverse ,在 Reverse Proxy Guide 提到它可以对 Location: Header 进行修改,这样就不会在重定向时被带到源服务器的地址。

如果没有重定向,或者 Web 应用正确配置了 Base URL ,大概也可以不加?或者就顺手加一个上去,又不会吃亏?

我之前也从未打算去查资料,也从不关心多出来的这一条配置有什么作用。


此外,我还从之前的配置文件中看到了这样的写法:

1
2
ProxyPass / ws://localhost:6666/
ProxyPass / http://localhost:6666/

DeepSeek 告诉我,这样可能会造成路径冲突,导致无法正常使用。但是在我的环境中,WebSocket 和 HTTP 又都能正常建立连接。我还真不清楚这里发生了什么,甚至忘记了当时为什么会这么写。

(我和我的程序有一个)能跑就行,但不推荐各位使用。


© 2025 @a1375625918

findway.top 蜀ICP备2023008060号-1 川公网安备51019002005558号