node.js - 如何获取连接到 websocket 服务器的所有客户端的“真实”IP 地址
问题描述
所以我有一个nodejs Web 套接字服务器坐在 nginx 反向代理后面。我的 nginx 配置如下所示:
server {
listen 80;
location / {
proxy_pass http://localhost:9898;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-For $remote_addr;
}
}
我的 Web 套接字服务器应用程序代码包含将客户端的 IP 地址存储在表中以供以后检索的逻辑。当他们连接时检索客户端的 IP 地址没有问题,因为我可以简单地做这样的事情,req.headers["x-forwarded-for"]
因为我可以访问req
每个新连接上的对象。我的问题是每当我想仅向某些客户端的子集发送服务器广播时检索“转发的 IP 地址”。因为每当我这样做时ws._socket.remoteAddress
(ws
网络套接字对象在哪里),我都期望得到 IP 地址:127.0.0.1
.
我想这是关于我用来托管 Web 套接字服务器的特定 npm 包的问题:https ://www.npmjs.com/package/ws 。
解决方案
您的问题已在您链接的 NPM 页面中得到解答:
当服务器在像 NGINX 这样的代理之后运行时,事实上的标准是使用
X-Forwarded-For
标头。
wss.on('connection', function connection(ws, req) { const ip = req.headers['x-forwarded-for'].split(/\s*,\s*/)[0]; });
那时你可以将它存储ip
在ws
对象上(事实上,你也可以ws._socket.remoteAddress
用它覆盖ip
)。
推荐阅读
- json - 如何基于 JSON formio.js 创建自定义组件?
- lucene - 如何在 Lucene.Net 的 RAMDirectory 中序列化/反序列化内容
- sql - sql条件连接语句
- reactjs - 如何在反应中使用物化下拉菜单
- amazon-redshift - Redshift 使用数据更改数字列
- javascript - 如何以角度禁用猫头鹰日期计时器中的过去时间
- javascript - 发送第二条消息时,第一条消息首先到达用户,而不是 Node js Sockets.io 中的实际消息
- python-3.x - sphinx, rinohtype: 内联代码背景颜色
- swift - 为什么 ObservedObject 更新时 ChildView 中的绑定没有更新?
- pandas - pandas:计算所有类别的平均相似度