[ASPNET CORE] Usar NGINX como Reverse Proxy

En un articulo anterior ya vimos como instalar y configurar ASP.NET CORE bajo Ubuntu usando para ello el servidor web Kestrel (útil durante las fases de desarrollo)

En esta ocasión vamos a usar NGINX en modo “reserve proxy”. Los pasos a seguir son:

Instalamos el servidor web nginx.

sudo apt-get install nginx

Nota: si durante la instalación nos salta el error “No se pudo bloquear /var/lib/dpkg/lock”

probamos a ejecutar

sudo apt-get install nginx-light

sudo apt-get install nginx

Iniciamos el servicio nginx

sudo service nginx start

Nota: para comprobar si se esta ejecutando podemos lanzar el comando

ps ax | grep nginx

Comprobamos que el sitio web por defecto de NGINX funciona correctamente

Abrimos nuestro navegador favorito e introducimos la url “http://localhost”

Iniciamos el sitio web ASP.NET CORE, usando el comando dotnet

dotnet [DLL_PROYECTO_WEB]

Para este artículo hemos usado uno de los proyectos ASP.NET Core creados en un articulo anterior. Concretamente hemos usado la ruta /home/sergio/PruebasNetCore/aspcore.

Si observamos el resultado, podemos ver como el sitio web esta escuchando en la url http://localhost:5000. Si navegamos a esta url, podemos comprobar que nuestro sitio funciona correctamente

Configuramos ngix como “reverse proxy”

Debido a que NGINX no puede gestionar los procesos de Kestrel, vamos a configuarlo para que las peticiones al puerto 80 sean redirigidas al puerto 5000.

Abrimos el fichero /etc/nginx/sites-available/default y modificamos su contenido con la siguiente configuración

server {
    listen 80;
    
    root /home/sergio/PruebasNetCore/aspcore;

    location ~ \.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|pdf|txt|tar|wav|bmp|rtf|js|flv|swf|html|htm|woff2|svg)$ {
        expires 1d;
        access_log off;
        add_header X-Static-File true;
    }

    location / {
        proxy_pass http://localhost:5000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection keep-alive;
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

No vamos a entrar en detalles sobre la configuración, ya que el propio fragmento de configuración es autoexplicativo. En el siguiente enlace podréis encontrar muchas más opciones de configuración NGINX para ASP.NET CORE

Por último, vamos a validar y recargar la configuración

sudo nginx -t 
sudo nginx -s reload

Probamos el “reverse proxy” de NGINX

Navegamos a la url http://localhost, y si el “reverse proxy” esta funcionando correctamente, deberemos algo similar a lo mostrado en la siguiente imagen

Si se nos ha olvidado iniciar nuestra app ASP.NET CORE, veremos una ventana de error similar a

En este punto lo tenemos todo (o casi todo) configurado, y funciona correctamente. Pero es necesario que iniciemos manualmente el sitio web ASP.NET CORE usando el comando “dotnet”. A continuación, vamos ver automatizar esta tarea.

Mantener la ejecución del sitio web ASP.NET CORE

Para mantener en ejecución nuestra aplicación ASP.NET CORE, vamos a instalar supervisord

Ahora vamos a configurarlo editando el fichero /etc/supervisor/supervisord.conf, para añadir la un sección [program:x]

[program:aspcore]
command=/usr/bin/dotnet /home/sergio/PruebasNetCore/aspcore/WebApplication1.dll --server.urls:http://*:5123
directory=/home/sergio/PruebasNetCore/aspcore/
autostart=true
autorestart=true
stderr_logfile=/var/log/dotnettest.err.log
stdout_logfile=/var/log/dotnettest.out.log
environment=ASPNETCORE_ENVIRONMENT=Production
user=www-data
stopsignal=INT

donde debemos indicar el comando a ejecutar (dotnet con la ruta de la DLL de nuestro sitio asp.net core)

Nota: En el siguiente enlace podréis encontrar más detalles sobre la configuración

Para aplicar los cambios debemos reiniciar el servicio “supervidord”

sudo service supervisor stop
sudo service supervisor start
sudo tail -f /var/log/supervisor/supervisord.log

En la imagen anterior podemos ver como se esta ejecutado una tarea llamada “aspcore”

Otra alternativa es usar systemd creando un fichero de servicio.