前情提要:现在是static自动发现,我使用mqttx命令行工具,通过请求前端nginx代理,请求了两个连接至后端两台Server。
这是节点A(10.88.78.184)的两个请求连接中的状态
这是节点B(10.88.78.84)两个请求的连接状态
问题1: netstat结果中这个是什么意思
10.88.78.84:1883 10.88.78.184:40864
10.88.78.84:1883 10.88.78.184:40848
问题2: netstat结果中的后边显示的端口40864和40848为什么和Web页面中客户端页显示的信息完全不同。
问题3: 我现在不知道怎么确定通过前端nginx请求的连接,实际是两台后端Server哪台请求的。因为两个后端Server都有显示同样的连接(实际是谁接收了请求呢),昨天使用netstat查看后还是没明白。
问题4: 当我停止其中一台EMQX服务,使用mqtt客户端请求一个请求后,再次将停止的服务开起来,要问的问题同问题2
你可以通过 netstat -nat
命令来查看命令输出的表头信息,前面的 10.88.78.84:1883
指的是服务端的地址和端口,后面的 10.88.78.184:40864
指的是客户端的地址和端口。
t1ger
3
@bintong2689 你是把 Nginx 和 EMQX 部署在一个节点上?那么现在应该是 Nginx 监听 1883 端口,EMQX 监听的是其他的端口?这样的话你用 netstat 看到的就是 MQTT 客户端与 Nginx 的连接,EMQX 这边显示的是客户端的原始 IP,你可以看下监听器里面 proxy_protocol 这个选项有没有打开。
proxy_protocol 的解释可以看下以前的这篇帖子:就没有用nginx转发ws/wss配置proxy_protocol获取真实IP的案例吗 - #2,来自 heeejianbo
不,为了避免冲突,Nginx跑在8885,SSL nginx跑在8884. nginx.conf 8884和8885均代理后端两个节点的1883端口。proxy_protocol均是打开状态。我贴出配置文件
节点A
:
cluster {
name = emqxctl
discovery_strategy = static
}
listeners.tcp.default {
bind = “0.0.0.0:1883”
proxy_protocol = true
max_connections = 1024000
}
节点B
cluster {
name = emqxcl
discovery_strategy = static
}
listeners.tcp.default {
bind = “0.0.0.0:1883”
proxy_protocol = true
max_connections = 1024000
}
nginx.conf
stream {
log_format main '$remote_addr [$time_local] ’
'$protocol $status $bytes_sent $bytes_received ’
'$session_time “$upstream_addr” ’
‘“$upstream_bytes_sent” “$upstream_bytes_received” “$upstream_connect_time”’;
access_log /var/log/nginx/tcp-access.log main;
upstream mqtt_servers {
least_conn; #连接数最少最被优先请求
server 10.88.78.184:1883;
server 10.88.78.84:1883;
}
server {
listen 8885;
proxy_pass mqtt_servers;
proxy_protocol on;
proxy_connect_timeout 10s;
proxy_timeout 1800s;
proxy_buffer_size 3M;
tcp_nodelay on;
}
server {
listen 8884 ssl;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate /root/tongbb/mqtt_cert/emqx.pem;
ssl_certificate_key /root/tongbb/mqtt_cert/emqx.key;
ssl_verify_depth 2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
proxy_pass mqtt_servers;
proxy_protocol on; # 启用代理协议,启用此项时,对应后端Server配置文件emqx.conf中相关listenrs监听器选项启用 proxy_protocol = true
proxy_connect_timeout 10s;
proxy_timeout 1800s;
proxy_buffer_size 4K;
tcp_nodelay on;
}
}
t1ger
5
那也对了,其实就是反一下,你 netstat 看到的是 Nginx 和 EMQX 的连接,然后 Dashboard 上显示的是客户端的原始 IP。
集群状态下,怎么才能确定是哪个后端Server处理了这个用户的请求呢
t1ger
7
你可以在客户端列表点击客户端 ID 进入客户端详情页,里面会显示当前客户端连接的是哪一个节点的。