Estoy usando Haproxy para permitir la ejecución de un servidor websocket y un servidor web Lighttpd en la misma máquina. Quiero recuperar la dirección IP externa de la máquina desde la aplicación web que se ejecuta en el servidor Lighttpd.
Sin haproxy esto funciona:
PHP
<?php
$myip = $_SERVER['SERVER_ADDR'];
$myurl = 'http://'.$myip.'/pathToProject/';
define('URL', $myurl);
?>
Pero detrás del proxy$_SERVER['SERVER_ADDR'];devuelve 127.0.0.1 que no funciona con el marco PHP que estoy 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
Respuesta1
Deberá agregar la opción "option forwardfor"
en su archivo de configuración de HAproxy, para que HAproxy agregue un nuevo encabezado con la dirección IP real del visitante.
Después de eso, en su código PHP, verifique el encabezado HTTP_X_FORWARDED_FOR, en lugar de REMOTE_ADDR.
foreach (getallheaders() as $name => $value) {
echo "$name: $value<br>\n";
}
Puede encontrar una respuesta completa y detallada aquí:haproxy y reenvío de la dirección IP del cliente a los servidores
Respuesta2
En teoría, esto es exactamente lo que puedes resolver usando
option originalto
en su interfaz, según eldocumentos.
Su aplicación tendrá que depender del encabezado X-Original-To.
Respuesta3
gracias chicos funciona....
1) editar archivo nano /etc/haproxy/haproxy.cfgy agregar ahí
defaults
mode http
option forwardfor
2) y en 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) puedes ver la dirección IP
Respuesta4
Así lo resolví (sólo funciona en Linux):
$myip = shell_exec("ifconfig eth0 | awk '/inet / {print$2}' | cut -d: -f2");
$myurl = 'http://'.$myip.'/page/';
define('URL', $myurl);