使用nginx代理emqx的TCP、WS、WSS连接请求

项目代理关系:

注:主机上已存在名为:nginx-proxy 的一级 nginx 的代理,将监听了主机的 80、443端口

docker-compose.yml

复制代码
version: "3.7"
services:
  emqx:
    image: emqx/emqx:4.4.18
    restart: unless-stopped
    container_name: emqx
    environment:
      EMQX_ADMIN_PASSWORD: 80201@qq.com     #设置EMQX的Web管理程序登录的admin账户,密码为admin
      TZ: Asia/Shanghai
      VIRTUAL_HOST: manager.xxx.com.cn          #设置nginx-proxy对 80 端口上的 manager.xx.com.cn 的请求,转发到本容器 18083 端口上(下面的 18083)
      VIRTUAL_PORT: 18083               
    networks:
      - emqx-network
    volumes:                       #将 EMQX 配置信息映射到宿主机 /home/emqx ,其中包含 EMQX TCP 用户连接认证信息
      - /home/emqx/etc:/opt/emqx/etc
      - /home/emqx/data:/opt/emqx/data
      - /home/emqx/lib:/opt/emqx/lib
      - /home/emqx/log:/opt/emqx/log


  #使用 Nginx 容器 mqtt 代理 EMQX TCP连接服务,因此将宿主机的 1882 与 本容器的 80 端口进行映射。
  #这个容器不需要关联域名,因为只要将 TCP 服务相关的域名解析到宿主机 IP 上,就可发起对1882端口的请求。
  #该 Nginx 容器同为一级代理
  nginx:
    image: nginx:1.25.3
    restart: always
    container_name: mqtt
    volumes:
      - /home/emqx/nginx/mqtt/nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - emqx
    ports:
      - 1882:80
    networks:
      - emqx-network
复制代码
  #使用 Nginx 容器 ws/wss 代理 EMQX ws 连接请求
  #因此使用 VIRTUAL_HOST: ws.xxx.com.cn 指明将 nginx-proxy 上对 ws.xxx.com.cn 的请求,转发到本容器上。
  #该 Nginx 容器为 nginx-proxy 下的 二级代理
复制代码
  nginx:
    image: nginx:1.25.3
    restart: always
    container_name: ws
    volumes:
      - /home/emqx/nginx/ws/conf.d:/etc/nginx/conf.d
    depends_on:
      - emqx
    environment:
    VIRTUAL_HOST: ws.xxx.com.cn          #设置nginx-proxy 一级代理,将对域名 ws.xx.com.cn 请求,转发到本容器的80端口上。
复制代码
    networks:
      - emqx-network
复制代码
networks: 
  emqx-network: 
    external: true

Nginx容器 mqtt 的 nginx.conf 配置信息

复制代码
user  nginx;
worker_processes  auto;

error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}
#stream 为TCP代理设置,这个 Nginx 仅代理 TCP,不代理 HTTP。因此没有 HTTP 配置节点
stream { 
    server {
        listen 80; #将来自容器的 80 端口的TCP请求,转发到 emqx 容器的 1883 端口上

        proxy_connect_timeout 60s;
        proxy_timeout 60s;
        tcp_nodelay on;        
        #ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        #ssl_ciphers AES128-SHA:AES256-SHA:RC4-SHA:DES-CBC3-SHA:RC4-MD5;
        #ssl_certificate /home/zyzx/STAR_haut_edu_cn.crt;#这里需要填写证书的地址,可以是pem或者crt
        #ssl_certificate_key /home/zyzx/STAR_haut_edu_cn.key;#这里需要填写证书key的地址
        proxy_pass emqx:1883;
    }
}

Nginx容器 ws 的 default.conf 配置信息

复制代码
server {
    listen      80;
    ssl        off;

    client_max_body_size 10M;
       
    location /mqtt {
     #将容器80端口收到的请求,转发到emqx的8083端口
        proxy_pass http://emqx:8083/mqtt;  #这里是否带/mqtt路径处决于你mqtt服务端部署

        proxy_redirect off;
        proxy_set_header Host $host;

        # 反向代理保留客户端地址
        proxy_set_header X-Real_IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr:$remote_port;
        # WebSocket 额外请求头
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
       
    }
}

**注:关于WSS SSL证书。因为本案例使用了Nginx-Proxy一级代理,所有的SSL证书均部署在其下面。当使用wss://ws.xxx.com.cn请求时,一级代理将处理证书相关的工作。然后将实际请求转发到Nginx ws 80端口上,Nginx ws再将请求转发到emqx的8083端口,**因此上述配置支持 ws/wss 请求 ws.xxx.com.cn

相关推荐
Lansonli1 小时前
云原生(四十八) | Nginx软件安装部署
nginx·云原生·ecs服务器
加油,旭杏7 小时前
【中间件学习】fastCG介绍和使用
学习·nginx·fastcgi
苹果醋310 小时前
大模型实战--FastChat一行代码实现部署和各个组件详解
java·运维·spring boot·mysql·nginx
tanxiaomi18 小时前
vue 不是spa 单页面应用吗? 配置路由工作模式为history 后 ,为什么配置Nginx的 try_files 可以根据url 找到对应的文件?
前端·vue.js·nginx
twins352019 小时前
配置Nginx以支持通过HTTPS回源到CDN
网络·nginx·https
astuv19 小时前
在树莓派上部署开源监控系统 ZoneMinder
linux·nginx·树莓派·监控·摄像头·zoneminder·apache2
加油,旭杏1 天前
【中间件学习】Nginx快速入门(为了配置一个项目)
学习·nginx·中间件
-XWB-2 天前
【安全漏洞-中间件】nginx版本号屏蔽
运维·nginx·中间件
刘重洋2 天前
解决nginx+tomcat宕机完美解决方案
nginx·tomcat·firefox
苦逼IT运维2 天前
正向代理与反向代理:原理、区别以及应用(Nginx 和 Tomcat)
运维·服务器·nginx·云原生·tomcat·devops