ip real con frontal proxy nginx, backend apache y wordpress

Por fin he encontrado la solución! otra de estas tareas pendientes que hacía que una instalación no funcionase como era esperado! en este caso me encuentro con dos frontales de nginx que actúan como proxy http y detrás de ellos está un wordpress sobre apache. Hace un tiempo, hice un post similar a éste, pero detrás estaba otro nginx.

Así que aquí dejo la solución.

Frontal nginx
En este caso tengo 2 ficheros, el de la configuración del dominio y otro con la configuración específica para los wordpress almacenado en el directorio snippets

# vi /etc/nginx/sites-available/lamardebits.org
server {
    listen 80;
    listen [::]:80;

    server_name lamardebits.org
                www.lamardebits.org;
    return 301 https://lamardebits.org$request_uri;

    #root /var/www/html/;
    include snippets/certbot.conf;
}


server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name lamardebits.org;

    include snippets/certbot.conf;

    # Aquí s'inclou el servidor intern i la protecció específica de WP
    include snippets/wordpress10.conf;

    ssl_certificate /etc/letsencrypt/live/lamardebits.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/lamardebits.org/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_trusted_certificate /etc/letsencrypt/live/lamardebits.org/chain.pem;
}

Y la configuración específica para los wordpress

# vi /etc/nginx/snippets/wordpress10.conf
include conf.d/external-log.conf;
location / {
    proxy_pass http://172.31.0.145:6081;
    include proxy_params;

    location ~ \.php$ {
        proxy_pass http://172.31.0.145:6081;
        include proxy_params;

        location ~* wp\-login\.php {
            client_max_body_size 40M;
            proxy_pass http://172.31.0.145:6081;
            include proxy_params;
            include snippets/lmdb-protected.conf;
        }
    }

    proxy_headers_hash_max_size 512;
    proxy_headers_hash_bucket_size 128;

    fastcgi_read_timeout 300;
    proxy_read_timeout 300;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Real-IP       $remote_addr;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  X-Forwarded-Host $remote_addr;

    add_header X-Frame-Options SAMEORIGIN;

}

La configuración de proxy de nginx la tengo así

# vi /etc/nginx/conf.d/proxy.conf
proxy_buffer_size         128k;
proxy_buffers           4 256k;
proxy_busy_buffers_size   256k;
client_max_body_size      32M;

proxy_read_timeout 1800;
proxy_connect_timeout 1800;
proxy_send_timeout 1800;
send_timeout 1800;             

Backend apache + wordpress

A continuación en el contenedor con el apache y el wordpress, lo primero será habilitar el módulo remoteip

# a2enmod remoteip
# service apache2 restart

El fichero de configuración lo dejaremos así

# vi /etc/apache2/conf-available/remoteip.conf
## Log format config
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" proxy
SetEnvIf X-Forwarded-For "^.*\..*\..*\..*" forwarded

# Header config
RemoteIPHeader X-Real-IP
#RemoteIPHeader X-Client-IP
RemoteIPInternalProxy 127.0.0.1
RemoteIPTrustedProxy 172.31.0.0/16

En esta parte, he estado meses atascada por culpa de la línea RemoteIPHeader, que debe estar comentada.

RemoteIPInternalProxy es la ip de localhost 127.0.0.1

RemoteIPTrustedProxy el rango de IPs o IPs separadas por espacio de las IPs de los frontales de nginx

A continuación en el fichero de configuración de apache (puerto 80 ya que el https está en los frontales)

# vi /etc/apache2/sites-available/wordpress.conf
###############################################
# La Mar de Bits
###############################################
<VirtualHost *:80>
        ServerAdmin loquesea@dominio.org

        DocumentRoot /var/www/wp/

        # This helps applications behind a proxy know that the pages
        # were originally requested over https
        # Prevents browser blocking content because of MIXED CONTENT
        SetEnvIf X-Forwarded-Proto https HTTPS=on

        <LocationMatch "/server-status|/phpfpm-status">
                AllowOverride None
        </LocationMatch>
        <Directory "/var/www/wp">
                Options -Indexes
                AllowOverride All
        </Directory>

        ErrorLog ${APACHE_LOG_DIR}/wp.lmdb.error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
       
        CustomLog ${APACHE_LOG_DIR}/wp.lmdb.access.log combined env=!forwarded
        CustomLog ${APACHE_LOG_DIR}/wp.lmdb.access.log proxy env=forwarded

        RewriteEngine On
        RewriteOptions inherit
</VirtualHost>

Reiniciamos apache y cuando hagamos por ejemplo un comentario si todo es correcto ya debería salir la IP pública y no la IP del frontal de nginx.

Deixa un comentari

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.