答案:通过Nginx配置传递真实IP并在Swoole中读取X-Real-IP头部可获取客户端真实IP。具体步骤为:1. Nginx配置proxy_set_header X-Real-IP $remote_addr,正确转发WebSocket请求;2. Swoole在on('open')中通过$request->header['x-real-ip']获取IP;3. 为防伪造,应限制Swoole仅监听内网并确保Nginx处于可信环境。

在使用 Swoole 配合 Nginx 做 WebSocket 服务时,直接通过 Swoole 获取客户端 IP 会得到 Nginx 的 IP(比如 127.0.0.1),而不是真实用户 IP。这是因为 Nginx 作为反向代理转发了连接。要获取真实客户端 IP,需要 Nginx 正确传递来源地址,并在 Swoole 中读取对应信息。
Nginx 必须设置 proxy_set_header 将客户端真实 IP 写入请求头,常用的是 X-Real-IP 或 X-Forwarded-For。同时,在代理 WebSocket 时要正确升级协议。
示例 Nginx 配置:
location /ws/ {
proxy_pass http://127.0.0.1:9501; # 转发到 Swoole 服务
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
}
其中 $remote_addr 是 Nginx 拿到的真实客户端 IP,X-Real-IP 是最干净的字段,推荐使用。
Swoole 接收到 WebSocket 握手请求时,可以通过 request()->header 获取 Nginx 传来的头部信息。不能直接用 $server->connection_info() 的 remote_ip,因为那是与 Nginx 的连接 IP。
PHP 示例代码:
$server = new Swoole\WebSocket\Server("0.0.0.0", 9501);
<p>$server->on('open', function ($server, $req) {
$realIp = $req->header['x-real-ip'] ?? $req->server['remote_addr'];
echo "Client connected from real IP: {$realIp}\n";
});</p><p>$server->on('message', function ($server, $frame) {
$server->push($frame->fd, "Hello, {$frame->data}");
});</p><p>$server->start();</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/viitor%E5%AE%9E%E6%97%B6%E7%BF%BB%E8%AF%91">
<img src="https://img.php.cn/upload/ai_manual/000/000/000/175680003823895.png" alt="ViiTor实时翻译">
</a>
<div class="aritcle_card_info">
<a href="/ai/viitor%E5%AE%9E%E6%97%B6%E7%BF%BB%E8%AF%91">ViiTor实时翻译</a>
<p>AI实时多语言翻译专家!强大的语音识别、AR翻译功能。</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="ViiTor实时翻译">
<span>116</span>
</div>
</div>
<a href="/ai/viitor%E5%AE%9E%E6%97%B6%E7%BF%BB%E8%AF%91" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="ViiTor实时翻译">
</a>
</div>
这里优先从 x-real-ip 头部取值,如果不存在再回退到连接 IP(适用于直连调试)。
用户可能伪造 X-Real-IP 请求头,因此只应信任来自 Nginx 的代理。确保:
基本上就这些。只要 Nginx 正确传头,Swoole 按 header 取值,就能拿到真实 IP。
以上就是Swoole怎么在Nginx后获取WebSocket的真实IP的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号