Отримати зовнішній IP в PHP за Haproxy

Я використовую Haproxy для того, щоб запустити веб-сервер і веб-сервер Lighttpd на тій же машині. Я хочу отримати зовнішні IP-адреси машин з веб-додатку, запущеного на сервері Lighttpd.

Без haproxy це працює:

PHP

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

Але за проксі $ _SERVER ['SERVER_ADDR']; повертається 127.0.0.1, який не працює з фреймворком PHP, який я використовую.

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

5 Відповіді

Ось як я її вирішив (працює тільки на linux):

$myip = shell_exec("ifconfig eth0 | awk '/inet/{print$2}' | cut -d: -f2");
$myurl = 'http://'.$myip.'/page/';
define('URL', $myurl);
2
додано
Це правильно, мої програми працюють на одній машині, а IP прив'язаний до eth0. Ця відповідь, однак, є робочим методом для отримання IP-адреси хосту, тоді як будь-яка інша відповідь - це методи для отримання клієнта або віддаленого IP-адреси, що є абсолютно іншим. Тому я опублікував цей метод.
додано Автор Andy Shulman, джерело
Це може працювати, лише якщо ваш стек настільки простий, що PHP працює на тій же машині, що і haproxy. Вона йде далі і припускає, що відповідний IP-код прив'язаний до eth0 , та , що він є його основним адресою. Загалом, це далеко не загальне рішення.
додано Автор Felix Frank, джерело

Вам потрібно буде додати опцію "параметр forwardfor" у вашому конфігураційному файлі HAproxy, щоб HAproxy додав новий заголовок з реальною IP-адресою відвідувача.

Після цього у вашому коді PHP перевірте заголовок HTTP_X_FORWARDED_FOR замість REMOTE_ADDR

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

Повну детальну відповідь можна знайти тут: haproxy та пересилати IP-адресу клієнта серверів

2
додано
Моя серверна машина не має статичного IP, це вбудований пристрій, який отримає новий IP в кожній мережі. Додаток PHP повинен знати, до якого IP-адреси підключається клієнт - HOST IP, а не IP-адреси клієнтів.
додано Автор Andy Shulman, джерело
Вбудований пристрій linux (моя машина) працює на сервері Haproxy, Lighttpd і Websocket. PHP-додаток працює на моєму сервері Lighttpd. З додатка PHP я хочу дізнатися IP-адресу вбудованого пристрою linux. Не IP-адреси клієнтів, які підключаються до пристрою.
додано Автор Andy Shulman, джерело
@OskarCronwall Ви хочете, щоб саме IP, який саме пристрій?
додано Автор Michael Hampton, джерело

Теоретично це саме те, що ви можете вирішити за допомогою

    option originalto

у своєму інтерфейсі, відповідно до документів .

Вашій програмі доведеться покладатися на заголовок X-Original-To.

1
додано
Моє питання полягає в тому, як я можу отримати доступ до хоста IP в PHP з урахуванням цих обставин. Чи є спосіб налаштувати Lighttpd на доступ до цього заголовка (X-Original-To) через PHP? Google нічого не дає.
додано Автор Andy Shulman, джерело
Google дав мені це: PHP "> stackoverflow.com/questions/541430/… . Коротше кажучи, ви можете скористатися асоціативним масивом $ _SERVER або функцією apache_request_headers() .
додано Автор Felix Frank, джерело

дякую, хлопці, це працює ....

1) відредагуйте файл nano /etc/haproxy/haproxy.cfg і додайте його

    defaults
      mode http
      option forwardfor 

2) і в php

      <?php 
      echo '
'; print_r(getallheaders()); echo '
';


     //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-адресу

1
додано

For Apache you need something like mod rpaf. I don't know this for Lighttpd, but maybe the links here can help you; http://lowendtalk.com/discussion/2259/real-ip-module-for-lighttpd

0
додано
Це дає мені клієнтам IP-права? Як використовувати його, щоб отримати мій IP?
додано Автор Andy Shulman, джерело
Залежно від конфігурації mod_rpaf, я думаю, без будь-якого конфігурації ви повинні використовувати x-forwarded-for, але ви можете налаштувати досить багато (наприклад, розмітка файлів logfile).
додано Автор kholofelo Maloma, джерело
@Jeroen no, Oskar має рацію - mod_rpaf займається тільки IP-адресою клієнта за допомогою X-Forwarded-For та друзів. Це не скоротить.
додано Автор Felix Frank, джерело
Ukrainian PHP comunity
Ukrainian PHP comunity
885 учасників

dev-ua/php