apache - ws协议(protocol)和apache mod_proxy_wstunnel配置: error 500

标签 apache websocket mod-proxy

尝试通过我的 Apache2 服务器访问 ws://localhost:8080/时出现错误 500。此服务器运行 OpenSuse Leap 42.1 和 Apache 2.4.16。

这些 Apache2 模块已启用:mod_proxy、mod_proxy_http、mod_proxy_wstunnel。

当从本地网络调用请求时,一切正常。网址示例:http://<myhost-ip-address>/api/ws/<some-url> .它返回状态 101 和响应:Upgrade: websocket .没关系。

来自外部网络的同类请求失败。网址示例:ws://www.mysite.com/api/ws/<some-url> .它返回错误 500。

Apache 访问日志包含:GET /api/ws/<some-url> HTTP/1.1" 500 ...
Apache 错误日志包含:[proxy:warn] AH01144: No protocol handler was valid for the URL /api/ws/<some-url>. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.
我的 httpd.conf:

<VirtualHost *:80>
ServerName mysite.com
ServerAlias mysite.com
# Redirection for ws protocol
ProxyPreserveHost On
ProxyVia full
ProxyRequests OffHere
RewriteEngine On
RewriteCond %{REQUEST_URI}  ^/api/ws/(.*)           [NC]
RewriteCond %{QUERY_STRING} transport=websocket     [NC]
RewriteRule /(.*)           ws://localhost:8080/$1  [P,L]
# Proxy pass
ProxyPass           /api/ws/            ws://localhost:8080/api/ws/
ProxyPassReverse    /api/ws/            ws://localhost:8080/api/ws/
# DocumentRoot
DocumentRoot /srv/www/vhosts/mysite.com
<Directory "/srv/www/vhosts/mysite.com">
    Options Indexes SymLinksIfOwnerMatch
    AllowOverride None
    ...
</Directory>
# URL as parameter
AllowEncodedSlashes NoDecode

我遵循了这些以前的 StackOverflow 答案(感谢):
websockets , node.js , socket-io ,但没有运气。

我的配置一定有问题。有任何想法吗 ?

编辑

正如adona9所建议的,这里是调试日志:
proxy_util.c(1784): AH00925: initializing worker ws://localhost:8080/api/ws/ shared
proxy_util.c(1826): AH00927: initializing worker ws://localhost:8080/api/ws/ local
...
mod_authz_core.c(809): AH01626: authorization result of Require user <user>: granted
mod_authz_core.c(809): AH01626: authorization result of <RequireAny>: granted
mod_charset_lite.c(219): AH01448: incomplete configuration: src unspecified, dst unspecified
mod_proxy.c(1159): AH01143: Running scheme ws handler (attempt 0)
mod_proxy_http.c(1944): AH01113: HTTP: declining URL ws://localhost:8080/api/ws/<some-url>
mod_proxy_wstunnel.c(341): AH02900: declining URL ws://localhost:8080/api/ws/<some-url>  (not WebSocket)
[proxy:warn] H01144: No protocol handler was valid for the URL /api/ws/<some-url>. If you are using a DSO version of mod_proxy, make sure the proxy submodules are included in the configuration using LoadModule.

有任何想法吗 ?

最佳答案

所以我最终花了一天半的时间研究和阅读深度 apache2 配置。这就是我能够解决这个问题的方法:

  • 使用 forensic_logs 和 DumpIO 在 apache2 端找出我的初始请求 header 。
  • 记录来自 websocket 客户端的请求 header 。

  • 验证请求 header 中都包含升级 header 和连接类型 websocket。这些问题很可能是网络过滤或删除特定头文件的结果。

    我的问题是我使用的是不支持 websocket 连接的 AWS 经典负载均衡器。

    在阅读其他论坛时,一些公司的防火墙也会从他们的连接中删除特定的头文件,所以也可能是这样。

    因此,如果您已经三重检查以确保安装了正确的模块,则很可能是网络相关的错误。

    如果您有网络图,请检查每个特定节点和网关并验证输入和输出请求 header 是否相同。

    关于apache - ws协议(protocol)和apache mod_proxy_wstunnel配置: error 500,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37712669/

    相关文章:

    websocket - vert.x sockJS 实现延迟消息发送

    apache - mod_proxy 中的 no-jk 等效项

    apache - 如何使用 docker 设置一个小型网站

    java - 如何使用 Apache Poi 库读取 xls 和 xlsx?

    apache - 使用句点重定向目录以查询 htaccess 中的字符串

    python - 使用 fastcgi 在共享主机上部署站点

    amazon-web-services - 我可以将参数传递到与 AWS API Gateway 的 WebSocket 连接吗?

    使用 libtomcrypt 计算 websocket Sec-WebSocket-Accept 值

    apache - 在 Apache Server mod_proxy 指令中为所有 ProxyPass 映射设置超时

    .htaccess - 收到错误 "Invalid command ' SSLProxyCheckPeerCN'