Php

在 Haproxy 後面的 PHP 中檢索外部 IP

  • May 7, 2018

我正在使用 Haproxy 來啟用在同一台機器上執行 websocket 伺服器和 Lighttpd web 伺服器。我想從 Lighttpd 伺服器上執行的 Web 應用程序中檢索機器的外部 IP 地址。

沒有 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

您需要"option forwardfor"在 HAproxy 配置文件中添加該選項,以便 HAproxy 將添加一個帶有訪問者真實 IP 地址的新標頭。

之後,在您的 PHP 程式碼中,檢查 HTTP_X_FORWARDED_FOR 標頭,而不是 REMOTE_ADDR

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

可以在此處找到完整的詳細答案:haproxy and forwarding client IP address to servers

從理論上講,這正是您可以解決的問題

   option originalto

根據文件,在您的前端。

您的應用程序將不得不依賴 X-Original-To 標頭。

引用自:https://serverfault.com/questions/595270