Recuperar IP externo em PHP por trás do Haproxy

1

Estou usando o Haproxy para ativar a execução de um servidor de websocket e do servidor da Web do Lighttpd na mesma máquina. Eu quero recuperar o endereço IP externo da máquina do aplicativo da Web em execução no servidor Lighttpd.

Sem haproxy isso funciona:

PHP

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

Mas por trás do proxy $ _ SERVER ['SERVER_ADDR']; retorna 127.0.0.1 que não funciona com o framework PHP que estou usando.

haproxy.conf

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
    
por Oskar Cronwall 15.05.2014 / 11:54

5 respostas

-2

Foi assim que resolvi (só funciona no linux):

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

Você precisará adicionar a opção "option forwardfor" em seu arquivo de configuração do HAproxy, para que o HAproxy adicione um novo cabeçalho com o endereço IP real do visitante.

Depois disso, no seu código PHP, verifique o cabeçalho HTTP_X_FORWARDED_FOR, em vez de REMOTE_ADDR

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

Uma resposta detalhada completa pode ser encontrada aqui: haproxy e cliente de encaminhamento Endereço IP para servidores

    
por 15.05.2014 / 14:58
1

Em teoria, isso é exatamente o que você pode resolver usando

    option originalto

no seu frontend, de acordo com os documentos .

Seu aplicativo terá que confiar no cabeçalho X-Original-To.

    
por 16.05.2014 / 17:30
1

obrigado pessoal, funciona ....

1) edite o arquivo nano /etc/haproxy/haproxy.cfg e adicione lá

    defaults
      mode http
      option forwardfor 

2) e em 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) você pode ver o endereço IP

    
por 07.05.2018 / 22:57
0

Para o Apache, você precisa de algo como mod rpaf. Eu não sei disso para o Lighttpd, mas talvez os links aqui possam ajudá-lo; link

    
por 15.05.2014 / 12:05