通过 apache2 路由 mqtt 和 websocket 流量

Posted

技术标签:

【中文标题】通过 apache2 路由 mqtt 和 websocket 流量【英文标题】:Route mqtt and websocket traffic through apache2 【发布时间】:2020-04-21 12:27:02 【问题描述】:

我在 Ubuntu EC2 上设置了 emqx 代理。

当我尝试通过带有 IP 地址的 websocket 连接到 emqx 时,它工作正常。 但是当我使用子域时,连接失败。 我的 Apache 配置是

    <VirtualHost *:80>
  ServerName subdomain.example.com
  ServerAlias subdomain.example.com
  ServerAdmin admin@domain.in

  RewriteEngine On
  #RewriteCond %REQUEST_URI  ^/socket.io            [NC]
  #RewriteCond %QUERY_STRING transport=websocket    [NC]
  RewriteCond %HTTP:Upgrade =websocket [NC]
  RewriteRule ^/mqtt/(.*)           ws://localhost:8083/mqtt/$1 [P,L]

  ProxyPreserveHost On
  ProxyRequests Off

  ProxyPass / http://localhost:8083/
  ProxyPassReverse / http://localhost:8083/

  ErrorLog $APACHE_LOG_DIR/error.log
  CustomLog $APACHE_LOG_DIR/access.log combined

</VirtualHost>

Apache访问日志

我将 apache 的日志级别更改为“调试”,这些是错误日志。看起来它正在尝试查找 /mqtt 文件夹。

我已经启用了“proxy_wstunnel.load”模式。如何使用子域连接到 mqtt 和 ws?

【问题讨论】:

【参考方案1】:

ServerName下添加ServerAlias指令

例子:

ServerName domain.com
ServerAlias subdomain.domain.com

Try adding this too

ProxyPass "/" "http://127.0.0.1:8083/mqtt"
ProxyPassReverse "/" "http://127.0.0.1:8083/mqtt"

如果您不确定代理是否在使用 socket.io,请删除此行:

#RewriteCond %REQUEST_URI ^/socket.io

【讨论】:

你必须重启服务器 是的...我做到了。 sudo systemctl restart apache2 我刚刚更新了 apache conf。你能再检查一下问题吗? 我设置了日志级别来调试并添加了上面error.log文件的截图。你能再检查一下吗? 处理传入连接的后端逻辑是什么?

以上是关于通过 apache2 路由 mqtt 和 websocket 流量的主要内容,如果未能解决你的问题,请参考以下文章

aws-cpp-sdk:如何通过 Web Socket 使用 MQTT 发布物联网(c++ 中)

通过案例理解 MQTT 主题与通配符

[mqqt vs mqtt over web native in react native

本地Web与MQTT结合远程控制LED(SIOT+掌控版+web)

本地Web与MQTT结合远程控制LED(SIOT+掌控版+web)

如何配置apache2子域以路由到不同的服务器