emqx与nginx搭配,如何实现获取用户的IP地址?
这个问题困扰了我好几天。首先最简单粗暴的解决办法,就是花钱买企业版。
但是作为项目开始阶段,暂时不需要emqx企业版,一般都会先用开源版。所以花钱的办法暂时先不考虑,那么就寻求其他办法才行。
还有个简单粗暴的方案,就是如果连接数量没有那么大(我这里8100,超过8100就不行了),可以直接连接emqx,不需要nginx来做负载均衡操作。那么就可以通过emqx开放的API获取client的信息,从而拿到客户端的ip地址。
如果加上nginx呢?
这个问题我在网上查了很多资料,然而都不行。基本所有资料都在说nginx连接tcp的时候,需要proxy_protocol on;
其实确实需要,但没有说全,当你开启proxy_protocol的时候你就会发现,你用tcp的方式连不上emqx了,更何谈根据API获取clientId的信息。就这简单的问题居然难了我好几天。解决方案(之前都是废话,哈哈哈哈哈,我就是想吐槽一下网上的复制粘贴!!!):
1.nginx配置proxy_protocol on;
2.修改emqx下的etc目录下的emqx.conf,开启tcp的proxy_protocol;
总结:使用proxy_protocol 必须双方都要开启,缺一不可。就是说,如果你emqx.conf打开了这行注释,你nginx没有加,你同样无法建立tcp连接。
要使用Proxy protocol需要两个角色sender和receiver,sender在与receiver之间建立连接后,会先发送一个带有客户信息的tcp header,因为更改了tcp协议,需receiver也支持Proxy protocol,否则不能识别tcp包头,导致无法成功建立连接。
参考地址:代理协议Proxy protocol