使用 Haproxy 后面的 PHP 检索外部 IP

使用 Haproxy 后面的 PHP 检索外部 IP

我正在使用 Haproxy 在同一台机器上运行 websocket 服务器和 Lighttpd web 服务器。我想从 Lighttpd 服务器上运行的 web 应用程序中检索机器的外部 IP 地址。

如果没有 haproxy,这个可以工作:

PHP

<?php
    $myip = $_SERVER['SERVER_ADDR'];
    $myurl = 'http://'.$myip.'/pathToProject/';
    define('URL', $myurl);
?>

但在代理背后$_SERVER['服务器地址'];返回 127.0.0.1,这与我正在使用的 PHP 框架不兼容。

haproxy配置文件

global
    maxconn     4096
    nbproc      1

defaults
    mode        http

frontend all 0.0.0.0:80
    timeout client 86400000
    default_backend www_backend
    acl is_websocket hdr(Upgrade) -i WebSocket
    acl is_websocket hdr_beg(Host) -i ws
    use_backend socket_backend if is_websocket

backend www_backend
    balance roundrobin
    option forwardfor
    timeout server 30000
    timeout connect 4000
    server apiserver 127.0.0.1:8080 weight 1 maxconn 1024 check

backend socket_backend
    balance roundrobin
    option forwardfor
    timeout queue 5000
    timeout server 86400000
    timeout connect 86400000
    server apiserver 127.0.0.1:8082 weight 1 maxconn 1024 check

答案1

您需要"option forwardfor"在 HAproxy 配置文件中添加该选项,以便 HAproxy 添加一个包含访问者真实 IP 地址的新标头。

之后,在您的 PHP 代码中,检查 HTTP_X_FORWARDED_FOR 标头,而不是 REMOTE_ADDR

foreach (getallheaders() as $name => $value) {
    echo "$name: $value<br>\n";
}

完整详细的答案可以在这里找到:haproxy 并将客户端 IP 地址转发到服务器

答案2

从理论上讲,这正是你可以使用

    option originalto

在你的前端,按照文档

您的应用程序必须依赖 X-Original-To 标头。

答案3

谢谢大家,它有效......

1)编辑文件 纳米/etc/haproxy/haproxy.cfg并添加

    defaults
      mode http
      option forwardfor 

2)在 php 中

      <?php 
      echo '<pre>'; print_r(getallheaders()); echo '</pre>';


      // PROBLEM IS each browser has different "x-forwarder-for" some "X-Forwarder-for" and some browser gave you 2x ip "x.x.x.x, x.x.x.x"
      foreach ( getallheaders() as $k => $v) {
        if ( strtolower($k) == 'x-forwarded-for' ) {
          $tmp = explode(', ', $v);
          if ( $tmp[count($tmp)-1] != '' )
             $_SERVER['REMOTE_ADDR'] = $tmp[count($tmp)-1];     
        }
      }


      echo $_SERVER['REMOTE_ADDR'];
      ?>

3)你可以看到IP地址

答案4

这是我解决问题的方法(仅适用于 Linux):

$myip = shell_exec("ifconfig eth0 | awk '/inet / {print$2}' | cut -d: -f2");
$myurl = 'http://'.$myip.'/page/';
define('URL', $myurl);

相关内容