Проблема _SERVER["SERVER_ADDR"] 127.0.0.1

Discussion in 'Linux, Freebsd, *nix' started by SuNDowN, 3 Feb 2019.

  1. SuNDowN

    SuNDowN Member

    Joined:
    31 Mar 2008
    Messages:
    89
    Likes Received:
    72
    Reputations:
    -8
    Всем присутствующим привет! На одном домене, некоторый известный скрипт (возможно некоторые с ним сталкивались и знают о чём я) для правильной работоспособности требуют переменную _SERVER["SERVER_ADDR"] соответствующую реальному IP адреса сервера (внешнему IP).

    Итак ситуация следующая: сайт работает в режиме модуль Apache (5.4.16) - этого требует скрипт для корректной работы.

    Конфигурация веб-сервера такая: Apache MPM-Prefork 2.4.6-88.el7.centos, PHP module 5.4.16-46.el7, PHP-FPM 5.4.16-46.el7, nginx 1.14.1-1.el7_4.ngx

    Настройки системы практически по умолчанию. Всё это дело работает под управлением панелью: ISPmanager Lite 5.184.0

    При таких условиях _SERVER["SERVER_ADDR"] равен 127.0.0.1. Раньше помогало прописать реальный IP адрес сервера в файл: /etc/hosts - но после последнего переезда это не помогает.

    Вопрос: как присвоить реальный (внешний IP) адрес сервера переменной _SERVER["SERVER_ADDR"]?

    P.S.: гуглить умею, бьюсь уже сутки голова пухнет, уже нет идей как это реализовать. Буду признателен за помощь $$
     
  2. BillyBons

    BillyBons Active Member

    Joined:
    1 Dec 2016
    Messages:
    222
    Likes Received:
    115
    Reputations:
    13
    Можно добавлять дополнительные заголовки в запросы на кэширующем nginx
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    а на backend-е LAMP анализировать информацию из добавленных заголовков X-Real-IP и XForwarded-
    For

    ЛИБО

    можно использовать модуль ngx_real_ip (nginx должен быть собран с его поддержкой)
    Конфигурация (пример) -
    set_real_ip_from 192.168.1.0/24;
    set_real_ip_from 192.168.2.1;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;
    и анализировать/перезаписывать соответствующие заголовки на стороне LAMP.
     
  3. SuNDowN

    SuNDowN Member

    Joined:
    31 Mar 2008
    Messages:
    89
    Likes Received:
    72
    Reputations:
    -8
    Это ты говоришь про REMOTE_ADDR (удалённый адрес пользователя), а мне нужно именно: SERVER_ADDR.
     
  4. spiner

    spiner Member

    Joined:
    8 Jul 2015
    Messages:
    74
    Likes Received:
    54
    Reputations:
    4
    у тебя есть этот скрипт и нужно его принудительно заставить работать но твоём сервере, IP которого отличается от того, который прописан в нём, я правильно понимаю?
     
  5. SuNDowN

    SuNDowN Member

    Joined:
    31 Mar 2008
    Messages:
    89
    Likes Received:
    72
    Reputations:
    -8
    Не совсем так. Да скрипт у меня и он установлен. Скрипту не важен IP, он отказывается работать из-за неверно указанного SERVER_ADDR. Тут больше вопрос, как заставить сервер отдавать вместо SERVER_ADDR 127.0.0.1, реальный внешний IP адрес сервера.
     
  6. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,011
    Likes Received:
    847
    Reputations:
    198
    Прописать в конфиги веб-сервера имя сервера/IP для начала

    Code:
    <VirtualHost 127.0.0.1:81>
    ServerAdmin info@NAME.net
    DocumentRoot /home/hosting/sites/conf24.net/public_html
    ServerName NAME.net
    ServerAlias www.NAME.net
     
    _________________________
  7. SuNDowN

    SuNDowN Member

    Joined:
    31 Mar 2008
    Messages:
    89
    Likes Received:
    72
    Reputations:
    -8
    Это всё настроено и всё работает. Скрипт уже установлен и привязан к домену.
    Проблема в том что Apache не правильно отдаёт SERVER_ADDR, мне нужно чтобы он отдавал внешний IP адрес сервера, а не виртуальный хост.
    [​IMG]
     
  8. BillyBons

    BillyBons Active Member

    Joined:
    1 Dec 2016
    Messages:
    222
    Likes Received:
    115
    Reputations:
    13
    SetEnvIf REMOTE_ADDR НужныйIP не пробовали ?
    https://www.askapache.com/htaccess/setenvif/
     
  9. SuNDowN

    SuNDowN Member

    Joined:
    31 Mar 2008
    Messages:
    89
    Likes Received:
    72
    Reputations:
    -8
    Я уже писал, меня интересует SERVER_ADDR. С параметром REMOTE_ADDR проблем нет.
     
  10. BillyBons

    BillyBons Active Member

    Joined:
    1 Dec 2016
    Messages:
    222
    Likes Received:
    115
    Reputations:
    13
    Я неправильно указал название параметра, но Вы бы ссылку, всё же посмотрели .....

    Unique mod_setenvif Variables
    These can be used for attribute.

    Remote_Host
    the hostname (if available) of the client making the request - crawl-66-249-70-24.googlebot.com
    Remote_Addr
    IP address of the client making the request - 66.249.70.24
    Server_Addr
    IP address of the server on which the request was received - 208.113.183.103
    Request_Method
    name of the method being used - GET
    Request_Protocol
    name and version of the protocol with which the request was made - HTTP/1.1
    Request_URI
    the resource requested on the HTTP request line -- generally the portion of the URL following the scheme and host portion without the query string - /robots.txt
     
  11. SuNDowN

    SuNDowN Member

    Joined:
    31 Mar 2008
    Messages:
    89
    Likes Received:
    72
    Reputations:
    -8
    Ну я так и подумал что неправильно указал, ссылку я открыл уже перепробовал по разному, но ничего не выходит =(

    Указываю к примеру:
    SetEnvIfNoCase Server_Addr "(.*)" SERVER_ADDR=000.000.000.000
    SetEnvIfNoCase Server_Addr "(.*)" SERVER_ADDR1=000.000.000.000

    Результат из phpinfo():
    SERVER_ADDR 127.0.0.1
    SERVER_ADDR1 000.000.000.000

    Спасибо за дельный совет, но увы не решает задачу =(
     
    #11 SuNDowN, 5 Feb 2019
    Last edited: 5 Feb 2019
  12. BillyBons

    BillyBons Active Member

    Joined:
    1 Dec 2016
    Messages:
    222
    Likes Received:
    115
    Reputations:
    13
    А если сэмулировать окружение, а не настроить параметры сервера ? (я не знаю Вашей конфигурации, может оказаться неисполнимым).

    Привяжите alias-ом к имеющемуся сетевому интерфейсу дополнительно нужный IP-адрес (например, без шлюза по умолчанию), и включите его в список ListenAddress Apache - что-нибудь вроде

    ip address add dev ethN 100.100.100.100/32

    Затем по нужным условиям/в нужный момент перенаправляйте запрос не на local IP (127.0.0.1, http://127.0.0.1/phpinfo.php), а на вот этот alias (http://100.100.100.100/phpinfo.php).
     
    SuNDowN likes this.
  13. SuNDowN

    SuNDowN Member

    Joined:
    31 Mar 2008
    Messages:
    89
    Likes Received:
    72
    Reputations:
    -8
    Спасибо дружище что подкидывал идеи, но я нашёл другое решение.

    Итак, Решено! Если вдруг кому-то понадобится оставлю здесь пошаговую инструкцию.
    Сначала заходим и редактируем конфиг WWW-домена. Заменяем в конфиге Apache и Nginx 127.0.0.1 на реальный внешний IP адрес сервера который мы хотим видеть в phpinfo(); в SERVER_ADDR к примеру наш адрес будет: 185.130.10.10

    В конфиге Apache так:
    Code:
    <VirtualHost 185.130.10.10:8080>
    В конфиге Nginx так:
    Code:
    proxy_pass http://185.130.10.10:8080;
    proxy_redirect http://185.130.10.10:8080 /;
    Дописываем в конце файла: /etc/httpd/conf/httpd.conf
    Следующее:
    Code:
    Listen 185.130.10.10:8080
    Правим следующий файл: /etc/httpd/conf.modules.d/11-remoteip.conf
    Следующим образом:
    Code:
    RemoteIPHeader X-Forwarded-For
    RemoteIPInternalProxy 127.0.0.1 185.130.10.10
    Перезапускаем службы и радуемся. Всем спасибо за внимание!
     
    BillyBons likes this.
  14. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,011
    Likes Received:
    847
    Reputations:
    198
    а ну да, там же nginx тогда все логично, ваше решение даже есть в гугле
     
    _________________________
    SuNDowN likes this.
  15. SuNDowN

    SuNDowN Member

    Joined:
    31 Mar 2008
    Messages:
    89
    Likes Received:
    72
    Reputations:
    -8
    Да, но я сразу почему то не сообразил как сделать правильно.
     
Loading...