Haproxy 뒤의 PHP에서 외부 IP 검색

Haproxy 뒤의 PHP에서 외부 IP 검색

동일한 시스템에서 websocket 서버와 Lighttpd 웹 서버를 실행할 수 있도록 Haproxy를 사용하고 있습니다. Lighttpd 서버에서 실행되는 웹 애플리케이션에서 컴퓨터의 외부 IP 주소를 검색하고 싶습니다.

haproxy가 없으면 다음과 같이 작동합니다.

PHP

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

하지만 프록시 뒤에는$_SERVER['SERVER_ADDR'];내가 사용하고 있는 PHP 프레임워크에서 작동하지 않는 127.0.0.1을 반환합니다.

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

답변1

HAproxy 구성 파일에 옵션을 추가해야 "option forwardfor"HAproxy가 방문자의 실제 IP 주소가 포함된 새 헤더를 추가할 수 있습니다.

그런 다음 PHP 코드에서 REMOTE_ADDR 대신 HTTP_X_FORWARDED_FOR 헤더를 확인하세요.

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);

관련 정보