Felaktig IP-adress i WordPress-kommentarer

När du kör Varnish framför din WordPress-sajt kan du få felaktiga IP-adresser på kommentarer. Vanligast är att du får 127.0.0.1 som IP-adress på en kommentar, om du kör Varnish på samma server som webbservern. Eller så får du IP-adressen till Varnish-servern om du kör den som en egen server.

Min gamle kollega Johannes HenryssonAller media har skrivit en plugin som löser det här, den finns att ladda ner från github.com. Tyvärr fungerar den inte alltid, i mitt fall var jag tvungen att konfigurera PHP.

Den setup jag har består av en Varnish-server som frontar två webbservrar för lastbalansering. Vi kan kalla dem Varnish (10.0.0.1), Web1 (10.0.0.2) och Web2 (10.0.0.3). När någon skrev en kommentar på inlägg i WordPress så fick kommentaren IP-adressen 10.0.0.1 (dvs, Varnish IP). Det här är ju inte alls optimalt, då vi ibland vill veta varifrån spam kommer så vi kan blockera IP-adressen.

Varnish skickar med HTTP-headern X-Forwarded-For i requesten till backend (webbservern). Tyvärr verkar WordPress inte riktigt vilja förstå detta. Så vi behöver sätta HTTP-headern Remote-Addr till den IP som X-Forwarded-For har. Det är detta Johannes plugin gör, men tydligen alldeles för sent i körandet av PHP-koden för WordPress. Vi behöver få in detta innan vi kör PHP-koden i WordPress.

Det visade sig att i filen php.ini finns ett option som heter auto_prepend_file. Jag läste på lite om den och kom fram till att vi kan köra in PHP-skript innan vi ens börjar köra koden i WordPress. Så genom att skapa en fil, jag kallade den /etc/php5/realip.php med följande innehåll:

<?php
  if ( isset( $_SERVER[ "HTTP_X_FORWARDED_FOR" ] ) ) {
    $_SERVER[ 'REMOTE_ADDR' ] = $_SERVER[ "HTTP_X_FORWARDED_FOR" ];
  }
?>

Sedan redigerade jag filen /etc/php5/fpm/php.ini där jag ändrade auto_prepend_file = till auto_prepend_file = /etc/php5/realip.php

Startade om php5-fpm och nu får kommentarerna rätt IP-adress.