通过 $connection->getRemoteIp() 所获取的 IP 都是 127.0.0.1
trace 了一下代码发现 workerman 貌似最初是由以下方式获取的
$new_socket = @stream_socket_accept($socket, 0, $remote_address);
网上找了下关于 stream_socket_accept 的信息但无果...
以下是 Nginx Conf:
server {
listen 80;
server_name example.com;
location / {
proxy_pass http://(..被误判为站外连结..)127.0.0.1:2346;
proxy_read_timeout 365d;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
你的代理上有这段,那么workerman可以通过读取
$_SERVER来获得客户端ip。
假设某个瞬间有很多用户向 Websocket 发起连线,在 worker 的 onConnect 回调中记下的 $_SERVER['HTTP-X-REAL-IP'] 有可能会是错误(被其他用户的值给覆盖)的吗?
不会
@1:thank you!