在nginx和emqx上都开启了proxy_protocol。
没有证书认证(以下2883)可以正常获取真实ip,单双向证书认证(以下9883)都不能获取真实ip。
stream {
upstream mqtt_servers {
# down:表示当前的 server 暂时不参与负载
# max_fails:允许请求失败的次数;默认为 1
# fail_timeout:失败超时时间,默认 10s, max_fails 达到次数后暂停的请求时间
# backup:其它所有的非backup机器down或者忙的时候,请求backup机器
server three:1883 max_fails=2 fail_timeout=10s;
}
server {
listen 2883;
proxy_pass mqtt_servers;
# 启用此项时,对应后端监听器也需要启用 proxy_protocol
proxy_protocol on;
proxy_connect_timeout 10s;
# 默认心跳时间为 10 分钟
proxy_timeout 1800s;
proxy_buffer_size 3M;
tcp_nodelay on;
}
server {
listen 9883 ssl;
proxy_pass mqtt_servers;
ssl_session_cache shared:SSL2:10m;
ssl_session_timeout 10m;
ssl_certificate /root/ssl/server.crt;
ssl_certificate_key /root/ssl/server.key;
ssl_verify_depth 2;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
# 添加 CA 证书及开启验证客户端证书参数即可启用双向认证
# ssl_client_certificate /root/ssl/ca.crt;
# ssl_verify_client on;
# 启用此项时,对应后端监听器也需要启用 proxy_protocol
proxy_protocol on;
proxy_connect_timeout 10s;
# 默认心跳时间为 10 分钟
proxy_timeout 1800s;
proxy_buffer_size 3M;
tcp_nodelay on;
}
}