使用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。
使用nginx代理emqx的TCP、WS、WSS连接请求的更多相关文章
- TCP连接建立系列 — 连接请求块
连接请求块(request_sock)之于TCP三次握手,就如同网络数据包(sk_buff)之于网络协议栈,都是核心的数据结构. 内核版本:3.6 Author:zhangskd @ csdn blo ...
- Nginx - 代理、缓存
Nginx 标签 : nginx 代理 代理服务可简单的分为正向代理和反向代理: 正向代理: 用于代理内部网络对Internet的连接请求(如VPN/NAT),客户端指定代理服务器,并将本来要直接发送 ...
- 使用Nginx代理和转发Websocket连接
1.Websocket 简介 WebSocket协议是基于TCP的一种新的网络协议.它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端. 2.Nginx 简介 ...
- 实现Nginx代理WSS协议
因为线上H5游戏需要加上SSL,不想在原来的Web 服务器和游戏服务器支持SSL,只希望 在Nginx代理集群支持SSL.整体架构如下: 从上图可以看出需要总共涉及到https/http 和wss/w ...
- http/https与websocket的ws/wss的关系以及通过Nginx的配置
http/https与websocket的ws/wss的关系 - 哒哒哒 - CSDN博客 https://blog.csdn.net/Garrettzxd/article/details/81674 ...
- 关于小程序websocket全套解决方案,Nginx代理wss
需求对话 提问 我在本地web能够使用ws协议去链接websocket,但是小程序不能使用. 回答 由于小程序使用的是SSL加密协议,所以需要使用wss.这里wss与ws的关系就相当于https于ht ...
- Nginx代理tcp端口实现负载均衡
Nginx代理tcp端口实现负载均衡 1.修改配置文件 vi /etc/nginx/nginx.conf 添加如下配置: stream { ###XXX upstream notify { has ...
- Nginx代理TCP服务
利用nginx代理tpc 部署nginx 安装编译所需环境 # yum install -y apr-devel apr-util-devel pcre-devel openssl-devel 添加w ...
- Nginx代理websocket为什么要这样做?
Nginx反向代理websocket 示例: http { map $http_upgrade $connection_upgrade { default upgrade; '' close; } s ...
- nginx 代理 websocket
nginx 代理 websocket nginx 首先确认版本必须是1.3以上 map指令的作用: 该作用主要是根据客户端请求中$http_upgrade 的值,来构造改变$connection_up ...
随机推荐
- .NET周刊【11月第2期 2023-11-12】
国内文章 一个基于百度飞桨封装的.NET版本OCR工具类库 - PaddleOCRSharp https://www.cnblogs.com/Can-daydayup/p/17818557.html ...
- 基于 Echarts实现可视化数据大屏展示?
当涉及到使用Echarts实现可视化数据大屏展示时,以下是一份非常详细的介绍说明. 第一部分:介绍Echarts Echarts是一个由百度开源的基于JavaScript的可视化图表库.它支持多种图表 ...
- Socket编程和实现聊天室
一.HTTP协议的socket通信 1.server.py # 服务端 import sys import socket ip_point = ('127.0.0.1',9999) sk = sock ...
- Mybatis|MybatisPlus批量插入
创建一个SpringBoot工程 <?xml version="1.0" encoding="UTF-8"?> <project xmlns= ...
- 实用指南:打造卓越企业BI实施解决方案
前言 随着大数据时代的到来,商业智能(BI)工具变得非常重要.一个全面的商业智能方案可以支持数据驱动的决策并提高决策效率,同时还可以准确反映企业运行状态,为企业持续增长提供新的动力.本文小编将为大家介 ...
- Python subprocess 使用(一)
Python subprocess 使用(一) 本文主要讲下 subprocess 的简单使用. 1: 通过subprocess 获取设备信息 import subprocess def get_an ...
- 初识BigDecimal
BigDecimal所创建的是对象,我们不能使用传统的+.-.*./等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法. 方法中的参数也必须是BigDecimal的对象. BigDecim ...
- java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现? 答案2023-06-21: java的: 这个问题,我问了一些人,部分人是回答得有问题的. ...
- MongoDB系列:C#、Java驱动连接MongoDB以及封装(C#的MongoDBHelper,Java的MongoDBUtil)
一.C#驱动连接MongoDB 1.创建项目 执行命令:dotnet new console -n MongoDbDriverDemo 2.添加依赖包 执行命令:dotnet add package ...
- three.js中的矩阵计算
目录 1. 概述 2. 详论 2.1. 行主序与列主序列 2.2. 矩阵乘法 3. 参考 1. 概述 three.js中自带了矩阵运算库,不过在使用的过程中总是容易混淆.不知道是行主序还是列主序,前乘 ...