В чём разница gethostbyaddr() и $_SERVER['REMOTE_HOST'] в PHP?
Переменная REMOTE_HOST устанавливается web-сервером на основе сишной функции gethostbyaddr() и php вообще никак не участвует.  Если при использовании nginx в качестве proxy, REMOTE_ADDR имеет реальный адрес, а REMOTE_HOST == 'localhost', то это баг того модуля web-сервера, что подменяет IP-адрес подключения. Должно быть $remote_host == gethostbyaddr($remote_addr) || $remote_host == $remote_addr. Если REMOTE_ADDR всегда равен '127.0.0.1' или '::1', то это недоработка хостера.
gethostbyaddr вообще про другое, оно по IP(!) получает домен к которому "привязан" этот адрес. Reverse DNS называется.
И это ничего общего с REMOTE_ADDR и получанием IP пользователя не имеет.это из-за того, что у них стоит Nginx перед Apache
это исправляется на уровне вебсервера как раз, чтобы php получал правильный адрес, а не адрес машины на которой он стоит.