当前位置: 首页 > 知识库问答 >
问题:

将nginx配置为mqtt通信的反向代理

冯嘉荣
2023-03-14

我有一个运行在ip和端口上的MQTT(EMQX)服务器。我使用nodejs MQTT库在我的服务和该端口之间直接通信。

我想使用反向代理(nginx),以便能够使用DNS来修剪通信。

此时,我的nginx配置如下:

events { worker_connections 1024; }

stream {

    upstream websocket {
        server ******:7053;
    }
 
    server {

        listen 8888;
 
        proxy_pass websocket;


    }
}

http {

    server {
        
        listen 884;
        server_name *******;.
        error_log /var/log/errors.log;
        
        location / {
            proxy_pass *******;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $host;

        }

    } 

}

因此,当我尝试通过8888端口连接时,nginx总是超时

2020/12/03 16:23:48 [error] 22#22: *31 upstream timed out (110: Connection timed out) while connecting to upstream, client: 89.155.0.10, server: 0.0.0.0:8888, upstream: "192.16.102.26:7053", bytes from/to client:0/0, bytes from/to upstream:0/0

这两项服务都在docker容器中。并由docker编写。

MQTT服务的组合是:

version: "2.1"


services:

  mqtt-broker:
    build:
      context: .
      dockerfile: Dockerfile
    container_name: evio_mqtt_broker
    environment:
      - EMQX_LISTENER__SSL__EXTERNAL=8883
      - EMQX_DASHBOARD__LISTENER__HTTP=18083

      - EMQX_LOADED_PLUGINS="emqx_auth_username,emqx_recon,emqx_retainer,emqx_management,emqx_dashboard"

      - EMQX_LISTENER__SSL__EXTERNAL__TLS_VERSIONS=tlsv1.2
      #- EMQX_LISTENER__SSL__EXTERNAL__KEYFILE=etc/certs/key.pem
      #- EMQX_LISTENER__SSL__EXTERNAL__CERTFILE=etc/certs/cert.pem
      #- EMQX_LISTENER__SSL__EXTERNAL__CACERTFILE=etc/certs/cacert.pem
      - EMQX_LISTENER__SSL__EXTERNAL__VERIFY=verify_peer
      #- EMQX_LISTENER__SSL__EXTERNAL__FAIL_IF_NO_PEER_CERT=true
      - EMQX_LISTENER__SSL__EXTERNAL__REUSE_SESSIONS=on
      - EMQX_LISTENER__SSL__EXTERNAL__HONOR_CIPHER_ORDER=on

      - EMQX_ALLOW_ANONYMOUS=false
      - EMQX_AUTH__USER__1__USERNAME=****
      - EMQX_AUTH__USER__1__PASSWORD=****
      #- EMQX_AUTH__USER__2__USERNAME=umdc
      #- EMQX_AUTH__USER__2__PASSWORD=umdc_buddy

      - EMQX_DASHBOARD__DEFAULT_USER__PASSWORD=****
    ports:
      - "7053:1883"   # MQTT Port
      - "8883:8883"   # MQTT SSL Port
      #- "8083:8083"   # MQTT WebSocket Port
      #- "8084:8084"   # MQTT WebSocket SSL Port
      #- "8080:8080"   # HTPP Management Port
      - "1884:18083" # Web Dashboard Port
    logging:
      driver: "json-file"
      options:
        max-size: "50m"
        max-file: "3"
    networks:
      - evio_network
    stop_signal: SIGKILL

networks:
    evio_network:

和nginx是:

version: "2.0"

networks:
  evio_network:

services:
  reverse_proxy:
    container_name: reverse_proxy
    image: nginx
    networks:
      - evio_network
    ports:
      - 8888:8888
      - 8843:8843
      - 1883:1883
      - 8883:8883
    volumes:
      - /home/evio/src/evio_nginx_reverse_proxy/config/nginxDEV.conf:/etc/nginx/nginx.conf
    restart: always

我必须在mqtt中更改任何内容吗?或者我的反向代理有问题吗?

共有1个答案

狄高畅
2023-03-14

如评论中所述。

这里的问题是这两个服务是从不同的docker compose文件启动的。虽然它们都绑定到具有相同名称的网络,但这些网络是分开的,因为它们的前缀是不同的编排名称。

此问题有两种解决方案:

  1. 合并2个docker撰写文件,这将意味着它们在同一个命名空间中,并将共享公共命名网络。
  2. 创建一个外部网络,并从两个文件引用它。

对于第二个选项,您可以使用docker network命令创建网络,例如docker network create evio_network,然后在每个撰写文件的末尾包括以下内容:

networks:
  evio_network:
    external:
      name: "evio_network"
 类似资料:
  • 本文向大家介绍如何将Nginx配置为WebSocket的反向代理,包括了如何将Nginx配置为WebSocket的反向代理的使用技巧和注意事项,需要的朋友参考一下 WebSocket是一种协议,提供了一种创建Web应用程序的方式,该应用程序支持客户端和服务器之间的实时双向通信。WebSocket使开发这些类型的应用程序变得更加容易。大多数现代浏览器都支持WebSocket,包括Firefox,In

  • 我有一个部署在野蝇10.1应用程序服务器上的webapp。此webapp被监听:http://localhost:8080/app-profile-jsp/(1) 我成功安装了nginx。服务器已成功安装,我测试提供静态网页和图像。 现在我想配置nginx从“http://www . fri zio . local”(2)URL访问web应用程序。我在/etc/hosts中配置了这个地址。 我在n

  • 本文向大家介绍Nginx反向代理websocket配置实例,包括了Nginx反向代理websocket配置实例的使用技巧和注意事项,需要的朋友参考一下 最近有一个需求,就是需要使用 nginx 反向代理 websocket,经过查找一番资料,目前已经测试通过,本文只做一个记录 1.下载 tengine 最近的源码 2.安装基础的依赖包 3.解压编译安装 nginx.conf 的配置如下: test

  • 本文向大家介绍nginx反向代理webSocket配置详解,包括了nginx反向代理webSocket配置详解的使用技巧和注意事项,需要的朋友参考一下 最近在做项目的时候用到了webSocket协议,而且是在微信小程序中用到了webSocket,微信小程序中使用wss协议的时候不能设置端口,只能使用默认的443端口。我擦,我的https已经监听了443端口,webSocket再去监听443,肯定不

  • 我有一个spring boot应用程序(带有Keyclope适配器),运行在端口8000上,Keyclope运行在8080上 我编辑了我的 /etc/hosts文件,将测试域(foo.bar.com)上的请求路由到127.0.0.1 到目前为止,我对SSL不感兴趣。 我的示例nginx配置: 问题: 此示例nginx conf是否足够?我有一些无限的重定向发生。我的spring应用程序中来自Key

  • 本文向大家介绍nginx反向代理配置去除前缀,包括了nginx反向代理配置去除前缀的使用技巧和注意事项,需要的朋友参考一下 使用nginx做反向代理的时候,可以简单的直接把请求原封不动的转发给下一个服务。设置proxy_pass请求只会替换域名,如果要根据不同的url后缀来访问不同的服务,则需要通过如下方法: 方法一:加"/" ^~/user/表示匹配前缀是user的请求,proxy_pass的结