Configurar NGINX como proxy inverso de Tomcat

Vamos a ver los pasos para configurar el servidor web NGINX delante de un Tomcat con el fin de hacer la función de Reverse Proxy.

En el momento que NGINX recibe una petición de un cliente (HTTP REQUEST) la enviará a Tomcat, el servidor de aplicaciones la procesará, responderá a NGINX y este enviará la respuesta de la petición final al cliente (HTTP RESPONSE).

La mayor parte de información de esta entrada es extrapolable a otros servidores de aplicaciones (Glassfish, JBOSS, etc) a excepción lógicamente de la configuración a modificar en el servidor de aplicaciones.

nginx tomcat reverse proxy

Configuración en NGINX

La configuración de NGINX es sencilla, únicamente hay que especificar un «location» (dentro de un bloque «server«) que indicará las URL que tendrán que ser procesadas por Tomcat, ejemplo:

server {
    server_name foo.com;
    listen 443;
    ssl on;
    ssl_session_timeout 5m;
    ssl_protocols SSLv2 SSLv3 TLSv1;
    ssl_certificate /var/certs/server.crt;
    ssl_certificate_key /var/certs/server.key;
    ssl_session_cache shared:SSL:10m;
    location / {
        proxy_set_header X-Forwarded-Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;

        proxy_redirect off;

        proxy_connect_timeout 360;
        proxy_send_timeout 360;
        proxy_read_timeout 360;

        proxy_pass http://servidor_tomcat:8080/app;
        }
}

La directiva «proxy_set_header» permite redefinir y añadir campos a las cabeceras que se envían al servidor Proxy. En las peticiones vía proxy, NGINX redefine por defecto las cabeceras «Host» y «Connection» y elimina las que estén vacías:

proxy_set_header Host $proxy_host;
proxy_set_header Connection close;

En nuestro ejemplo anterior podéis ver como hemos añadido las cabeceras:

proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

$host
in this order of precedence: host name from the request line, or host name from the “Host” request header field, or the server name matching a request

Si necesitamos que la aplicación reciba en la cabecera la IP remota del cliente en lugar de la del Proxy podríamos añadir la cabecera X-Real-IP:

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

Para entender bien las directivas y variables disponibles os recomiendo echar un vistazo a la documentación de NGINX.

La directiva «proxy_pass» especifica la URL de Tomcat contra la que hacer el proxy inverso

proxy_pass http://servidor_tomcat:8080/app;

Las directivas proxy_*_timeout especifican la política de timeouts contra el servidor de aplicaciones.

Para hacer los cambios efectivos, hacemos una comprobación de sintaxis de los ficheros de configuración y reiniciamos NGINX:

# service nginx configtest
# service nginx restart

Configuración en TOMCAT

La configuración a establecer en Tomcat es sencilla. Únicamente hay que añadir dos directivas en el conector que recibirá las peticiones de NGINX. Tomcat necesita que se especifique que va a recibir peticiones a través de un proxy (nombre + puerto del Reverse proxy):

proxyName="foo.com"
proxyPort="443"

Si fuera el conector 8080:

<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
proxyName="foo.com"
proxyPort="443" />

Y reiniciar Tomcat para aplicar los cambios.

3 comentarios en “Configurar NGINX como proxy inverso de Tomcat

  1. Me agrada ver que nginx es cada vez más usado por los administradores de sistemas. Desde mí punto de vista, es mucho más versátil, rápido y eficaz que Apache.

    ¡Un saludo!

  2. Nginx está genial, yo lo vengo usando como proxy desde hace mucho tiempo para servir todo tipo de aplicaciones jeje

Comments are closed.