Apache websocket 重定向到 Tomcat:mod_proxy 和 mod_proxy_wstunnel

2023-12-11

我正在尝试使用 mod_proxy 和 mod_proxy_wstunnel 模块将流量从 Apache 重定向到 Tomcat。 HTTP 流量重定向没有问题,但我无法使用迄今为止尝试过的任何配置成功重定向 websocket 流量。

我正在使用 Apache 2.4.28 和 Tomcat 8.5.13

我必须说,当我在没有 Apache 的情况下使用 Tomcat 时,websockets 工作得非常好:

enter image description here

适用于此配置的 Tomcat 连接器如下:

<Connector URIEncoding="UTF-8"
        compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
        compression="on"
        compressionMinSize="1024"
        connectionTimeout="20000"
        noCompressionUserAgents="gozilla, traviata"
        port="443"
        protocol="org.apache.coyote.http11.Http11AprProtocol"
        SSLEnabled="true"
        scheme="https"
        secure="true">
        <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
        <SSLHostConfig>
            <Certificate certificateKeyFile="/opt/tomcat/cert/privkey.pem"
                         certificateFile="/opt/tomcat/cert/cert.pem"
                         certificateChainFile="/opt/tomcat/cert/chain.pem"
                         type="RSA" />
        </SSLHostConfig>
    </Connector>

到目前为止一切都很清楚。现在我在 Tomcat 前面启动一个 Apache 服务器,我更改的第一件事是 Tomcat 连接器,如下所示:

<Connector URIEncoding="UTF-8"
    compressableMimeType="text/html,text/xml,text/plain,text/css,text/javascript,application/javascript"
    compression="on"
    compressionMinSize="1024"
    connectionTimeout="20000"
    noCompressionUserAgents="gozilla, traviata"
    port="8080"
    protocol="org.apache.coyote.http11.Http11AprProtocol">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>

在 Apache 中,我成功加载了下一个模块(我已经检查过它们确实已加载):

LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so
LoadModule ssl_module modules/mod_ssl.so

这是我在 vhosts.conf 文件中尝试的配置之一:

<VirtualHost *:443>
    ServerName www.example.com
    ServerAdmin [email protected]
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
    CustomLog /var/log/httpd/lavnet_access.log combined
    ErrorLog /var/log/httpd/lavnet_error.log

    SSLProxyEngine on
    #websocket
    RewriteEngine on
    RewriteCond %{HTTP:Upgrade} "(?i)websocket"
    RewriteRule ^/(.*)$ wss://www.example.com/$1 [P]
    #rest
    ProxyPass "/" "http://www.example.com:8080/"
    ProxyPassReverse "/" "http://www.example.com:8080/"

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>

这是我取得的最佳结果的配置,但它仍然无法工作。当我尝试建立此连接时,lavnet_error.log 中的日志跟踪似乎相当不错:

[Tue Oct 10 16:46:39.014980 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(2209): [client XX.XX.XX.109:11208] AH00944: connecting wss://www.example.com:443/rest/notify/675/fgcw02lm/websocket to www.example.com:443
[Tue Oct 10 16:46:39.016495 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(2418): [client XX.XX.XX.109:11208] AH00947: connected /rest/notify/675/fgcw02lm/websocket to www.example.com:443
[Tue Oct 10 16:46:39.016567 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(2887): AH02824: WSS: connection established with XX.XX.XX.109:443 (*)
[Tue Oct 10 16:46:39.016590 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(3054): AH00962: WSS: connection complete to XX.XX.XX.109:443 (www.example.com)
[Tue Oct 10 16:46:39.016603 2017] [ssl:info] [pid 10558:tid 47319680603904] [remote 217.61.129.109:443] AH01964: Connection to child 0 established (server www.example.com:443)
[Tue Oct 10 16:46:39.026370 2017] [proxy:debug] [pid 10558:tid 47319680603904] proxy_util.c(2171): AH00943: WSS: has released connection for (*)

但这是 Chrome 显示的错误:

enter image description here enter image description here

我也尝试过其他配置:

<VirtualHost *:443>
    ServerName www.example.com
    ServerAdmin [email protected]
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
    CustomLog /var/log/httpd/lavnet_access.log combined
    ErrorLog /var/log/httpd/lavnet_error.log
    SSLProxyEngine on

    ProxyPass "/rest/notify/" "wss://www.example.com:8080/rest/notify"
    ProxyPassReverse "/rest/notify/" "wss://www.example.com:8080/rest/notify"

    ProxyPass "/" "http://www.example.com:8080/"
    ProxyPassReverse "/" "http://www.example.com:8080/"

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>

但在这种情况下,我收到“500(内部服务器错误)”,并且我还可以在 lavnet_error.log 中看到接下来的跟踪:

[Tue Oct 10 17:14:14.778824 2017] [proxy:warn] [pid 11924:tid 47694559057664] [client XX.XX.XXX.189:11665] AH01144: No protocol handler was valid for the URL /rest/notify/info (scheme 'wss'). If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule., referer: https://www.example.com/equipment-command-panel/8287/8482

我尝试了很多配置,但无法使其工作。我希望你可以帮助我。

Thanks.


经过多次尝试我终于解决了。接下来是工作配置,以防有人需要:

这是Apache的vhost.conf文件:

<VirtualHost *:443>
    ServerName www.example.com
    ServerAdmin [email protected]
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
    CustomLog /var/log/httpd/lavnet_access.log combined
    ErrorLog /var/log/httpd/lavnet_error.log

    ProxyPreserveHost On
    ProxyPass / http://www.example.com:8080/
    ProxyPassReverse / http://www.example.com:8080/
    ProxyRequests Off
    RewriteEngine on
    RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
    RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
    RewriteRule .* ws://www.example.com:8080%{REQUEST_URI} [P]

    SSLEngine on
    SSLCertificateFile    /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
</VirtualHost>

这是 Tomcat 中 server.xml 中定义的连接器:

<Connector URIEncoding="UTF-8"
    connectionTimeout="20000"
    port="8080"
    protocol="org.apache.coyote.http11.Http11AprProtocol">
    <UpgradeProtocol className="org.apache.coyote.http2.Http2Protocol" />
</Connector>

Thanks.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Apache websocket 重定向到 Tomcat:mod_proxy 和 mod_proxy_wstunnel 的相关文章

  • java.lang.ClassNotFoundException:javax.mail.MessagingException

    我想使用 eclipse 将电子邮件从我的 gmail 帐户发送到另一个邮件帐户 我使用 apache tomcat 7 0 34 作为我的 Web 服务器 并使用端口 8080 作为 apache 服务器 HTTP 1 1 并使用 JRE
  • Apache 虚拟主机始终重定向到 /dashboard

    我遇到的问题似乎是一个常见问题 但我找到的任何解决方案似乎都不适合我的情况 我正在尝试设置一个虚拟主机 以便我可以通过 mytestdomain local 访问我的 Laravel 安装的公共文件 但是当我在 google chrome
  • Capistrano 和 XSendFile 配置

    我正在尝试使用 Apache 2 2 Passenger 4 0 59 和 XSendFile 0 12 配置 Rails 生产服务器 应用程序通过 Capistrano 部署 部署的应用程序生成 可能很大 PDF Rails root t
  • Magento 中的子域 htaccess 问题

    public html www domain com public html subdomain subdomain domain com public html htaccess public html subdomain htacces
  • 文件不存在时.htaccess 重定向

    我正在使用 htaccess 将用户重定向到我的主控制器 并且工作正常 但是当我调用一个不存在的js文件时 如下所示 这个js文件不只是说404 文件不存在 而是获取index php的内容 我应该如何进行 这是我的 htaccess
  • 请求的操作失败 - Apache 错误

    当我尝试启动 Apache 2 2 服务器时 它显示以下消息 请求的操作失败 在命令提示符中显示如下 C Documents and Settings amth gt net start apache2 2 The Apache2 2 se
  • 如何在MAMP中设置环境变量?

    如何在 MAMP 版本 3 3 中设置环境变量 我可以在我的 PHP 应用程序中使用它 我已经更新了 Applications MAMP Library bin envvars and envvars std file并添加以下行 Lice
  • 通过 AJP 将 REMOTE_USER 转发到 tomcat(例如用于 shibboleth)

    今天我刚刚遇到了以下问题 1 我将apache配置为基本身份验证 需要有效用户 这有效 2 我进一步配置 apache 将某些路径 在我的例子中为 idp 的请求转发到 tomcat servlet shibboleth IDP 结果是 s
  • PHP 从命令行启动 gui 程序,但 apache 不启动

    首先 我阅读了有类似问题的人的一些帖子 但所有答案都没有超出导出 DISPLAY 0 0 和 xauth cookies 这是我的问题 提前感谢您的宝贵时间 我开发了一个小库 它使用 OpenGL 和 GLSL 渲染货架 过去几天我将它包装
  • WebSocket 和 Origin 标头字段

    以下引用自 RFC6455 WebSocket 协议 不打算处理来自任何网页的输入但 仅对于某些站点应验证 Origin 场是原点 他们期望 如果服务器不接受指示的来源 那么它应该用回复来响应 WebSocket 握手 包含 HTTP 40
  • webhook 和 websocket 之间的区别?

    我一直想进行实时聊天 几年前我用 PHP Ajax Mysql 完成了这个任务 并破坏了我的服务器 然后我尝试使用 Flash 文本文件 我放弃了 10年没有尝试过 但最近我听说了 webhooks 和 websockets 它们似乎都是做
  • 如何通过ssh检查ubuntu服务器上是否存在php和apache

    如何通过ssh检查Ubuntu服务器上apache是 否安装了php和mysql 另外如果安装的话在哪个目录 如果安装了其他软件包 例如 lighttpd 那么它在哪里 确定程序是否已安装的另一种方法是使用which命令 它将显示您正在搜索
  • Apache 2.4 URL 重写:/server/?Server=ServerName 到 /server/ServerName [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 我试图简单地将 URL 重写为 server ServerName from server Server ServerName所以这样
  • CodeIgniter 项目给出 303/压缩错误

    尝试设置一个基于 CodeIgniter 的项目进行本地开发 LAMP 堆栈 并且一旦更新了所有配置文件 这意味着我成功地为 CodeIgniter 生成了有意义的引导错误 我在浏览器中收到此错误 Chrome Error 330 net
  • 如何使用 POCO 发送 websocket PONG 响应

    我正在尝试使用 POCO 1 7 5 设置 websocket 服务器 POCO的样本发现here https github com pocoproject poco blob develop Net samples WebSocketSe
  • 如果django项目位于子文件夹和子域中,如何编写.htaccess?

    我的 django 站点的路径是 staging ninjawebsite com clients project 我希望将其视为基本网址 django 项目位于public html clients project子文件夹 一切似乎都工作
  • NodeJs/WS:如何抛出服务器端在客户端处理的错误?

    当我的 websocket 有超过 2 个连接时 我试图在服务器端抛出错误 我有这个不错的客户端onerror方法 但我无法到达我的代码的那部分 我正在使用 nodeJS 和包ws其中有关于错误处理的最小文档 服务器 js theWebSo
  • NoInitialContextException:heroku 战争部署

    我一直在开发一个 J2EE 项目 并且在其中使用连接池 也通过部署在 heroku 上的数据库进行访问 我使用以下代码来设置 Connection 对象 Context initContext new InitialContext Cont
  • PHP Github Pull 脚本错误“权限被拒绝(公钥)”

    我已经设置了一个 PHP 脚本来执行 GitHub 拉取 这包含在我的 Github 文件夹中 home mysite public html github github pull php 我的服务器已经有 SSH 公钥 就像我执行git
  • 从子域中的 ../ 路径

    假设我创建了一个子域 http subdomain mydomain com http subdomain mydomain com 最初是在这个网址 http mydomain com subfolder folder http mydo

随机推荐

  • 在 JFreeChart 中将原点从 (0,0) 移动到 (0,50)

    As shown in image the graph is from line y 0 here i want to plot a graph from y 50 how can i specify this in JFreeChart
  • Web服务中的Web方法属性是什么?

    Web服务中的Web方法属性是什么 例如 WebMethod EnableSession true ScriptMethod UseHttpGet true public string GetApplicationDomains strin
  • JavaFX - 如何让 VBox 子级与 VBox 父级一起成长

    VBox classBox new VBox className new Text defaultClass classBox setAlignment Pos CENTER classBox getChildren add classNa
  • 单独使用CSS绘制圆形[重复]

    这个问题在这里已经有答案了 是否可以仅使用可以在大多数浏览器 IE Mozilla Safari 上运行的CSS来绘制圆圈 是的 画一个盒子并给它一个边框半径 该半径是盒子宽度的一半 circle background f00 width
  • 如何从Iphone调用wcf服务

    我想开发一个系统 Iphone应用程序可以通过wcf服务访问我的数据库 我是新的 wcf 服务 我想知道我应该制作哪个服务 休息或 以及为什么它们相互通信 WCF 服务的核心是 SOAP Web 服务 因此您应该能够使用 iPhone SO
  • Android:以编程方式获取设备名称

    这就是我尝试过的 mTextView setText MODEL android os Build MODEL nDEVICE android os Build DEVICE nBRAND android os Build BRAND nD
  • 当 Next.js 中的路由处于活动状态时定位活动链接

    如何像我们在 React Router 4 中那样定位 Next js 中的活动链接 意思是 当活动链路的路由处于活动状态时 为活动链路指定一个类别 一个简单的解决方案基于useRouter hook import Link from ne
  • 如何使用 jQuery ajax 调用 PHP 函数?

    我有一个名为 myfunctions php 的文件 其中有很多函数 例如 function sendForm save form function fn2 do something Other functions 和 jquery 代码
  • 两个连续的 [NSDate date] 总是会返回不同的时间吗?

    dateS 和 date 总是不同吗 Two NSDate date following each other NSDate dateA NSDate date Line X NSDate dateB NSDate date Line X
  • 最后手段的性能优化策略[关闭]

    Closed 这个问题需要多问focused 目前不接受答案 该网站上已经有很多性能问题 但我发现几乎所有问题都非常针对具体问题并且相当狭窄 并且几乎都重复了避免过早优化的建议 我们假设 代码已经可以正常工作了 所选择的算法对于问题的情况来
  • Java:枚举与整数

    在 Java 中使用标志时 我看到了两种主要方法 其中一个使用 int 值和一行 if else 语句 另一种是使用枚举和大小写切换语句 我想知道使用枚举与整数作为标志在内存使用和速度方面是否存在差异 Both ints and enums
  • C# 使用 varbinary 调整 jpg 图像大小,转换为字节并保存到数据库中

    我正在尝试调整使用 FileUpload 控件上传的 jpg 图像的大小 并将其转换为字节 然后将其保存到数据库 SQL Server 2008 作为 varbinary MAX 我所做的和下面显示的代码是我设法将其转换为字节并以 varb
  • 使用单词边界时如何忽略特殊字符

    s sopa sop sopaa sopii 如何忽略 使用单词边界时 re sub r b sop b sopa s 输出 sopa sop sopaa sopii 看来你想要这样的东西 gt gt gt s sopa sop sopaa
  • 允许在Excel中显示超过15位数字

    我正在编写一个简单的 VBA Excel 脚本 我遇到了一些问题 因为我使用这种方式删除了数字的科学格式 Columns b ad NumberFormat 0 但后来我意识到其中一列有 23 位数字 比 15 位数字长 因为我需要在 Ex
  • 验证日期时如何在jqgrid中使用monthNames?

    在我的 jqgrid 中 当我单击 添加新记录 时 我的日期字段已预先填充当前日期 日期的格式为 yyyy MMM d 例如 2010 Jan 23 日期是必填字段 当我单击提交按钮时 它验证失败并显示错误 表明该日期无效 并且需要 Y m
  • 如果现场评估失败,如何保持在同一选项卡上

    我有主页选项卡和验证选项卡 我喜欢验证用户输入 如果用户输入有效 则切换回主页选项卡 否则留在验证选项卡上 此时 在我单击提交按钮后 即使用户输入无效 它也会切换回主页选项卡 索引 xhtml
  • REGEX 用逗号分隔的唯一数字

    我正在尝试验证以逗号分隔的数字 1 31 的唯一列表 不重复 i e 2 4 6 7 1 是有效输入 2 2 6无效 2有效 2 无效 1 2 3 4 15 6 7 31有效 1 2 3 4 15 6 7 32 无效 20 15 3 I t
  • 连接设备列表中的闪烁选项不允许我调试任何应用程序

    我有一个奇怪的问题 当我尝试在连接的设备中部署应用程序时 我有一个闪烁的选项 出现一秒钟 然后消失 然后再次出现 依此类推 当我尝试在任何连接的或虚拟设备中调试应用程序时 我收到此错误 01 23 18 49 36 Launching ap
  • 用户注册时自动创建个人资料 (Laravel 5)

    我正在尝试为我的注册用户创建一个个人资料页面 在此页面上 将显示身份验证 用户数据 姓名 电子邮件 还会显示额外的个人资料信息 城市 国家 地区 电话号码等 我已经建立了一对一的关系 但我遇到了一个问题 创建用户后 我想自动为该特定用户创建
  • Apache websocket 重定向到 Tomcat:mod_proxy 和 mod_proxy_wstunnel

    我正在尝试使用 mod proxy 和 mod proxy wstunnel 模块将流量从 Apache 重定向到 Tomcat HTTP 流量重定向没有问题 但我无法使用迄今为止尝试过的任何配置成功重定向 websocket 流量 我正在