LAB: Hosteando aplicaciones .Net Core en Linux con Nginx y Kestrel
En esta guía vamos a instalar NGINX
como proxy reverso y como server de core net el servicio kestrel
; antes repasemos las piezas que vamos a usar:
Nginx es un servidor web/proxy inverso ligero de alto rendimiento y un proxy para protocolos de correo electrónico. Es software libre y de código abierto, licenciado bajo la Licencia BSD simplificada. Nginx es ampliamente utilizado, por ser muy configurable, ligero en consumo de recursos y rápido.
Kestrel es el servidor web multi-plataforma que creo Microsoft y que sirve para albergar las aplicaciones web creadas con ASP.NET Core y dotarlas de manera sencilla de la infraestructura para poder ejecutarse.
Porque usamos Nginx? Kestrel es ideal para servir contenido dinámico desde ASP.NET Core. Sin embargo, las capacidades de servicio web no son tan ricas en características como servidores como IIS, Apache o Nginx (MS, ya posee IIS y no tiene interez en crear uno nuevo y libre). Un servidor proxy inverso puede servir contenido estático, solicitudes de almacenamiento en caché, solicitudes de compresión y conexión HTTPS desde el servidor HTTP.
Aquí una imagen que gráfica lo que antes intento explicar:
Nginx me permite atender las solicitudes http de los clientes y este redirigirlas a los contenedores que van a servir la solución. Es deducible y cabe destacar que nginx puede manejar distintos contenedores de aplicaciones sean kestrel o no.
Ahora que conocemos cada pieza, lo que intentaremos es unirlas para crear un servidor de aplicaciones net core.
Pre requisitos
- Servidor Debian/Ubuntu con una cuenta de usuario estándar con privilegio sudo.
- Instalar el runtime de .NET Core en el servidor.
- Descargar el framework .NET Core.
- Seleccione la última versión de .NET Core LTS!!.
- Una aplicación ASP.NET Core cualquiera.
1- Instalar Runtime net core:
2- Realizar un publish de una aplicación cualquiera
Crear una aplicación tipo webapp:
Luego de que termine de crear la webapp vaciá, creamos una release:
Esto nos va a crear un directorio, generalmente en bin/Release/<target_framework>/publish
; esta es la aplicación que luego vamos a publicar en el server kestrel.
Creamos la carpeta que va a contener nuestra aplicaciones; generalmente en: /var/www
. Este es el lugar donde generalmente se alojan los sitios.
Copiamos el contenido del publish sobre una carpeta dentro de www:
Ahora probamos si nuestra release esta funcionando:
Esto lanza en la consola algo como lo siguiente:
Ahora deberías ingresar por un navegador a la url que indica y comprobar de que funciona todo bien, en mi caso https://localhost:5001
3- Configurar el proxy reverso
Instalar nginx:
Iniciar el servicio:
Verifica que nginx esta corriendo: en un navegador http://127.0.0.1
y deberías ver la pagina de “Welcome to nginx” (también deberías verlo desde otra pc apuntando a la ip del server)
Modificaremos el archivo /etc/nginx/sites-available/default
y agregamos o reemplazamos lo siguiente:
Asegurate de agregar a Startup.cs de tu proyecto lo siguiente
En el método Configuration:
Si quieres agregar otros proxies de confianza:
En el método Configure:
Creando el servicio de app
Ahora bien, ya tenemos un servidor nginx que redirige peticiones al server kestrel en el puerto 5000; ahorra queremos que este servicio funcione sin tener que darle al comando dotnet app.dll
:
Para ello debemos crear un demonio que se ejecute automáticamente… vamos a usar a nuestro amigo system.d:
En el debemos ingresar lo siguiente:
Environment=ASPNETCORE_ENVIRONMENT=Development buscara el archivo appsettings.Development.json de la carpeta de release! User=www-data -> este es el usuario que ejecutara la aplicacion; debe existir y tener permisos de ejecucion sobre el directorio de release!
Paso siguiente, guardar el archivo y habilitar el servicio:
Iniciar el servicio y verificar que este funcionando:
Probando todo
Desde un navegador ya deberias tener funcionando tu sitio completamente configurado con nginx y kestrel; sirviendo la solucion en la direccion 127.0.0.1 y tambien en maquinas remotas dentro de tu LAN.
Puedes usar: curl -v 192.168.1.xxx
Configurar un CRT para que funcione por SSL (HTTPS)
Es muy pobable que tu sitio este funcionando cuando lo probas por localhost, pero si intentas acceder desde otro equipo no funciona (conection refuse). Esto es debido a que “localhost” siempre es tomado como seguro para nginx, en cambio para otra pc esto no es asi. Lo que debemos hacer es configurar un certificado para que las conexiones sean seguras y nuestro server nginx pueda responder por https.
El proyecto core net creado por defecto usa
Properties/launchSettings.json
y es probable queapplicationUrl
este escuchando enhttps://localhost:5001;http://localhost:5000)
… puedes editar esta configuracion para que todo funcione de una… pero lo que pretendemos aca es que funcione por https.
Mas data: Host ASP.NET Core on Linux with Nginx