Configurar WordPress con nginx como proxy inverso

Usar un proxy inverso con nginx por delante de WordPress es útil en varios escenarios complejos, por ejemplo para distribuir la carga entre varios servidores, servir contenido desde caché para estáticos y dinámicos o para facilitar aceleración SSL (proxy TLS, HTTP2,…).

Para que un Nginx que proporciona SSL funcione por delante de un WordPress (sin SSL) hay que ajustar la configuración para evitar un bucle de redirecciones infinitas, redirect loop - too many redirects.

Paso 1. Configurar Nginx como proxy inverso

Partiendo de una configuración convencional de proxy inverso como la que tenemos a continuación:

server {
  listen 443 ssl;
  server_name example.org;   

  ssl_certificate example.pem;
  ssl_certificate_key example.pem;

  location / {

    proxy_pass         http://example.org:8080;

    proxy_set_header   Host $host;
    proxy_set_header   X-Real-IP  $remote_addr;
    proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header   X-Forwarded-Proto https;
    proxy_set_header   X-Forwarded-Host $host;
  }
}

Observa que hay dos líneas clave:

  • proxy_pass - sirve para crear el proxy inverso que envía todas las peticiones al servidor de backend (En todo el ejemplo me baso en Apache).
  • La cabecera X-Forwarded-Proto - sirve para indicar a Apache que la solicitud original se hizo bajo protocolo seguro.

Paso 2. Forzar el uso de SSL en WordPress

Desde el proxy puedes forzar el uso de SSL en el sitio aunque, para evitar algunas redirecciones conviene configurar WordPress para que use SSL.

Puedes hacer la configuración en el escritorio de WordPress, o editando el fichero wp-config.php de WordPress. Añade tras la apertura de la etiqueta <?php estas líneas:

define('FORCE_SSL_ADMIN', true); 

define('WP_HOME','https://example.org');
define('WP_SITEURL','https://example.org');

Que van a forzar el uso de https en el sitio.

Paso 3. Solucionar redirect loop

Piensa que la comunicación entre el servidor proxy y el que aloja WordPress se hace mediante http (no segura). Por eso la función is_ssl() de WordPress no será capaz de detectar que la página se esta sirviendo realmente mediante https y responderá con una redirección 302.

Esto provoca un bucle de redirecciones infinito.

Para evitar el problema hay que modificar el fichero wp-config.php así:

<?php
define('FORCE_SSL_ADMIN', true); 

define('WP_HOME','https://example.org');
define('WP_SITEURL','https://example.org');

if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], 'https') !== false)
       $_SERVER['HTTPS']='on';

La nueva configuración revisa la cabecera X-Forwarded-Proto que envia Nginx y, en el caso de existir activa la bandera HTTPS simulando el uso de https.

NOTA Si usas Apache, para utilizar la variable HTTPS tienes que instalar el módulo mod_ssl y openssl. Es obligatorio aunque realmente no gestiones ningún certificado desde Apache.

César Maeso


Creative Commons License

Esta obra está bajo una licencia de Creative
Commons Reconocimiento-NoComercial-CompartirIgual
4.0 Internacional
.