Tutorial: crea una web ASP.NET Core MVC en Linux con Apache

Bienvenidos a la tercera última entrega de nuestros tutoriales de iniciación a .NET Core. En esta entrega os enseñaremos, paso a paso, cómo crear una web ASP.NET Core con la arquitectura MVC (Model-View-Controller) detrás de un proxy inverso (apache) que conectará las conexiones entrantes con nuestra aplicación web. Antes, sin embargo, os recordamos que podéis acceder fácilmente a las entregas anteriores de esta serie de tutoriales:

1. Cómo instalar .NET Core fácilmente en Linux
2. Cómo compilar un proyecto .NET Core a binarios nativos en Linux
3. Crea una web ASP.NET Core MVC en Linux con Apache

Tened también en cuenta los prerequisitos:

  • Tener acceso a una distribución de Linux (nosotros utilizaremos Ubuntu 18.04 en este tutorial y los pasos de este tutorial podrían variar según vuestra distribución).
  • Tener ya instalado .NET Core en vuestra distribución.

Así pues, sin más preámbulos, empecemos con el tutorial.

¿Qué es la arquitectura MVC?

Las siglas MVC representan las palabras “Modelo – Vista – Controlador” o (model – view – controller en inglés). De forma simple, se trata de una estructura que define ciertos componentes de una aplicación y la forma en la que estos se comunicarán entre ellos.

En el caso de las aplicaciones ASP.NET MVC significa que estas contarán con estos tres componentes, cada uno de ellos con una responsabilidad distinta:

  • Modelo: contiene los datos de la aplicación y toda la lógica de negocio.
  • Vista: contiene información sobre cómo debe mostrarse la información del modelo. Por ejemplo un archivo HTML o un archivo CSHTML (páginas de HTML dinámicas con código c#).
  • Controlador: es el componente encargado de gestionar la presentación del modelo (datos) y las vistas (interfaz). Es decir, el controlador decide qué modelo y que vistas se presentarán al usuario.

Hoy en día las aplicaciones ASP.NET Core con arquitectura MVC son la forma más popular de construir aplicaciones web sobre .NET Core. En este tutorial no entraremos más en detalle, pero podéis obtener más información en este artículo de la wikipedia.

Para seguir este artículo tutorial sólo es necesario saber que instalaremos esta opción de ASP.NET Core porque es actualmente la más popular.

¿Qué es el servidor web “Kestrel”?

Si habéis estado leyendo documentación acerca de ASP.NET Core es posible que os hayáis topado con este nombre que describe el servidor web responsable de entregar vuestra aplicación. Es decir, ASP.NET incluye por defecto un servidor web ligero pero muy completo en cuanto a funciones. Este servidor, llamado Kestrel, es capaz de recibir una conexión entrante y realizar todo el trabajo necesario para entregar las páginas solicitadas sin necesidad de ningún servidor adicional como podría ser el caso de Apache, Nginx o IIS.

Así pues, es posible alojar una página ASP.NET Core sin necesidad de ningún servidor Web adicional. Todo aquello necesario, inclusive el servidor web, es ya proporcionado por .NET Core.

Entonces, cabe preguntarse ¿por qué razón deberíamos utilizar Apache o Nginx? ¿No es suficiente con Kestrel?

Aunque Kestrel sea funcional, lo cierto es que no incluye todas las opciones de personalización, gestión y seguridad que sí proporcionan los servidores web tradicionales. Es por esta razón que en este tutorial os enseñaremos a utilizar Apache como Proxy Inverso, logrando que las peticiones entrantes a vuestro servidor sean recibidas por este y posteriormente dirigidas al servidor Kestrel de vuestra aplicación ASP.NET.

Crear el proyecto ASP.NET Core MVC, paso a paso

1. Inicia sesión a tu servidor con linux mediante SSH. Recuerda que en este tutorial usaremos una cuenta de administrador ‘root’ por lo que nos ahorramos el uso de ‘sudo’ en algunas de estas instrucciones.

2. Crea un nuevo directorio con el nombre de tu proyecto y accede él.

mkdir miproyectoasp
cd miproyectoasp

3. Crea un nuevo proyecto ASP.NET Core MVC escribiendo:

dotnet new mvc

A continuación, escribiendo ‘ls’ podremos ver la estructura de directorios del proyecto. La explicación sobre el funcionamiento de cada uno de estos componentes (controlador, modelo, vista) así como el resto de archivos, está fuera del alcance de este tutorial pero cabe decir que a partir de este momento puedes crear un repositorio de GIT y trabajar de forma remota mediante IDEs como Visual Studio.

4. Puesto que el proyecto incial incluye una web de ejemplo (placeholder), podemos comprobar su funcionamiento de inmediato sin necesidad de editar ningún código de ningún tipo.

dotnet run --urls "http://0.0.0.0:5000"

En este caso el argumento “urls” especifica a Kestrel en bajo qué direcciones IP y puertos debe escuchar. Por defecto Kestrel solo escuchará a la dirección localhost por lo que debemos especificar de forma explícita que deseamos que escuche a cualquier dirección IP para realizar esta prueba.

Abre cualquier navegador y dirígite a la siguiente dirección para verificar que tu web está funcionando: “http://la-ip-de-tu-servidor:5000”.

5. Finalmente, compliamos y publicamos la aplicación web a otro directorio. De esta forma podemos mantener una división clara entre nuestro código fuente y la aplicación web en producción.

mkdir ../webpublicada
dotnet publish -c release -o ../webpublicada

Recuerda que una aplicación ASP.NET Core también puede ser compilada a código nativo siguiendo las instrucciones que encontrarás en la segunda entrega de nuestro tutorial. Esto significa que podrás distribuir tu web a entornos windows, linux, mac sin necesidad de disponer de .NET Core en la máquina destino.

Una vez publicada la aplicación podremos probar que funcione correctamente ejecutando el archivo .dll que lleva el nombre de nuestro proyecto.

cd ../webpublicada
dotnet miproyectoasp.dll

Fíjate que en el momento de ejecutar la aplicación web esta escucha por defecto a la dirección ‘localhost:5000’, esta es la dirección a la que, a continuación, apuntaremos el proxy inverso con Apache.

Configura Apache como proxy inverso, paso a paso

A continuación veremos los pasos necesarios para configurar el servidor web Apache como servidor inverso.

 

¿Qué es un proxy inverso y por qué lo necesito?

En este caso un proxy inverso no es nada más que un servidor que recibe las peticiones entrantes, las entrega al servicio interno correspondiente y reenvía al cliente la respuesta recibida por el servicio interno. Esencialmente es una capa que separa y oculta del cliente toda la infraestructura interna, inclusive otros servidores web como sucede en el caso de nuestra aplicación ASP.NET Core. Se denomina “proxy inverso” porque del mismo modo que un proxy actua como intermediario del cliente, este proxy actua en modo opuesto, como intermediario de uno o varios servidores.

Si bien Kestrel es capaz de responder directamente a las conexiones entrantes, recomendamos el uso de un proxy inverso tanto por motivos de seguridad como también por escalabilidad:

  • Puedes utilizar el proxy inverso como balanceador, permitiendo escalar tu aplicación.
  • Facilitas la implementación de certificados SSL.
  • El servidor que recibe las peticiones entrantes (Apache) es altamante testado, conocido y seguro.
  • Permite aplicar una capa de lógica, filtrado y redireccionamiento adicional antes de que las conexiones entrantes lleguen a la aplicación web.

Dadas las ventajas de utilizar un proxy inverso y el hecho que su implementación básica no es difícil, creemos que deberías considerarlo especialmente para entornos de producción.

Te explicamos a continuación como configurar apache2 para que actue como proxy inverso.

Instalación y configuración de apache como proxy inverso

1. En primer lugar deberemos instalar apache. En ubuntu podemos realizarlo de la siguiente manera:

apt-get install apache2

2. Una vez instalado, deberemos activar los módulos necesarios para que apache pueda funcionar como proxy inverso.

a2enmod

Y posteriormente introducimos la siguiente lista de módulos a activar.

proxy proxy_ajp proxy_http rewrite deflate headers proxy_balancer proxy_connect proxy_html

3. Reiniciamos apache para terminar de activar los módulos.

service apache2 restart

4. Creamos el Virtual Host que alojará el proxy inverso.

Para ello nos dirigimos al siguiente director y creamos un nuevo archivo. Algunos de los datos especificados a continuación son ejemplos:

nano /etc/apache2/sites-enabled/miweb.conf

5. A continuación os mostramos un ejemplo de Virtual Host para que Apache funcione como proxy inverso, apuntando directamente a nuestro servidor Kestrel que está ejecutándose en local.

<VirtualHost *:80> 

ProxyPreserveHost On 

ProxyPass / http://127.0.0.1:5000/ 

ProxyPassReverse / http://127.0.0.1:5000/ 

ServerName www.miweb.com

ErrorLog ${APACHE_LOG_DIR}miweb-error.log 

CustomLog ${APACHE_LOG_DIR}miweb-access.log common 

</VirtualHost>

El aspecto más importante a tener en cuenta es el “ServerName”. Desde un punto de vista de seguridad, Microsoft recomienda que Kestrel no esté expuesto a peticiones wildcard. Es decir, peticiones que no vayan dirigidas expresamente al servidor que estaban destinadas. En segundo lugar, ese nombre deberá coincidir con vuestro nombre de dominio.

6. Volvemos a reiniciar Apache para confirmar los cambios.

apachectl configtest

Y si nos da OK,

service apache2 restart

Últimos pasos: dominio y SSL

Internamente nuestro servidor proxy inverso y nuestro servidor web (Kestrel) deberían estar ya funcionando. Sin embargo, no seremos capaces de visualizar la página correctamente hasta que no apuntemos un nombre de dominio a nuestro servidor.

Otro aspecto a tener en cuenta es que, por defecto, no seremos capaces de visualizar la página si no disponemos de un certificado SSL. Los proyectos ASP.NET creados por defecto tratan de forzar una redirección a una conexión por SSL/TLS que ahora mismo aún no ha sido configurada.

Llegado a este punto tienes dos opciones:

  1. Instalas un certificado SSL/TLS.
  2. Desactivas el redireccionamiento.

Para desactivar el redireccionamiento deberás cambiar el código fuente de tu aplicación web. En concreto, será necesario que comentes (o elimines) la linea “app.UseHttpsRedirection();” del archivo Startup.cs.

Una vez realizados estos cambios deberías tener un web alojada en ASP.NET Core plenafemente funcional.

¡Esperamos que os haya gustado este tutorial! Ahora solo hace falta que lo apliques a tu proyecto.

También te puede interesar

Video Testimonial TVS Iberia – SWPro IT

Patrick Agut Klose - Header

SW Cybersecurity – ¿Cómo proteger tu infraestructura TI?

Vídeo Testimonial Ramió Assessors – SWPro IT

Vídeo Testimonial Natura & Dr. Windows – SWPro IT

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *