Hace aproximadamente dos años Microsoft® anunció .NET Core , un marco que permite desarrollar y ejecutar aplicações .NET de forma nativa en sistemas Linux y Mac. ASP.NET Core incluye Kestrel , una biblioteca de servidor web interna.
Como se indica en la documentación de Kestrel en el sitio web de Microsoft y el repositorio de GitHub , Kestrel normalmente se ejecuta tras un servidor web de producción, como IIS o NGINX. En este tutorial, describiremos cómo implementar Kestrel tras NGINX y NGINX Plus.
En este tutorial aprenderás a:
Una vez finalizada la instalación y configuración:
.NET Core y Kestrel:
NGINX o NGINX Plus, actuando como proxy inverso:
NGINX Plus:
La arquitectura de implementación de aplicação .NET Core es similar a la arquitectura de implementación de aplicações Node.js o Go. NGINX proporciona a las aplicaciones .NET funciones de gestión de tráfico que simplifican la implementación de producción y la escalabilidad de las aplicaciones. Puede ejecutar varias aplicações .NET en la misma máquina o en máquinas diferentes, y NGINX o NGINX Plus realizan el equilibrio de carga y el enrutamiento inteligente del tráfico entre ellas.
Las siguientes instrucciones explican cómo crear rápidamente una aplicación “Hello World” usando .NET Core, ejecutarla en Linux e implementarla detrás de un proxy inverso NGINX o NGINX Plus con funcionalidad avanzada de administración de tráfico.
Instale .NET Core siguiendo las instrucciones del sitio web de Microsoft.
En nuestro ejemplo usamos Ubuntu 16.04. Los siguientes comandos eran correctos al momento de escribir este artículo, pero están sujetos a cambios porque Kestrel aún está en desarrollo. Consulte la documentación de .NET Core según sea necesario.
$ sudo apt-get install apt-transport-https $ sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list' $ sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893 $ sudo apt-get update $ sudo apt-get install dotnet-dev-1.0.0-preview2-003131
Instalar NGINX:
$ sudo apt-get install nginx
Instale NGINX Plus si desea monitoreo de actividad en vivo, controles de salud activos o ambos. Consulte las instrucciones en la Guía de administración de NGINX Plus .
Edite el archivo ./project.json para agregar Kestrel como una dependencia del proyecto.
{ "versión": "1.0.0-*", "buildOptions": { "debugType": "portable", "emitEntryPoint": verdadero }, "dependencias": {}, "frameworks": { "netcoreapp1.0": { "dependencias": { "Microsoft.NETCore.App": { "tipo": "plataforma", "versión": "1.0.1" } , "Microsoft.AspNetCore.Server.Kestrel": "1.0.0" }, "importaciones": "dnxcore50" } } }
Copie este código para una aplicación simple en un nuevo archivo llamado Program.cs . Devuelve la fecha y hora actuales, ejecutando Kestrel en el puerto 5000 en localhost.
Usando Sistema; usando Microsoft.AspNetCore.Builder;
usando Microsoft.AspNetCore.Hosting;
usando Microsoft.AspNetCore.Http;
espacio de nombres ConsoleApplication
{
clase pública Programa
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.Configure(app =>
{
app.Run(async (context) => await context.Response.WriteAsync("Fecha actual: " + DateTime.Now + "n"));
})
.Build();
host.Run();
}
}
}
Ejecute el comando dotnet
run
para iniciar el servidor .NET Core:
$ dotnet run La aplicación del proyecto (.NETCoreApp,Version=v1.0) se compilará porque se modificaron las entradas. Compilando la aplicación para .NETCoreApp,Version=v1.0 La compilación se realizó correctamente.
0 Advertencia(s) 0 Error(es) Tiempo transcurrido 00:00:01.9047678 ¡Hola mundo!
Entorno de alojamiento: Ruta raíz del contenido de producción: /app/bin/Debug/netcoreapp1.0 Ahora escuchando en: http://localhost:5000 Aplicação iniciada. Presione Ctrl+C para apagar.
Ejecute el comando curl
para probar la conectividad y HTTP:
$ curl -v localhost:5000 * URL reconstruida a: localhost:5000/ * Intentando ::1... * Conectado a localhost (::1) puerto 5000 (#0) > GET / HTTP/1.1 > Host: localhost:5000 > User-Agent: curl/7.47.0 > Aceptar: */* > < HTTP/1.1 200 OK < Fecha: Mar, 14 Feb 2017 19:50:59 GMT < Transferencia-Codificación: fragmentada < Servidor: Kestrel < Fecha actual: 14/02/17 12:50:59 PM * La conexión #0 al host localhost se dejó intacta
Instalar un certificado SSL. Hay varias formas de obtenerlo:
Con el fin de crear rápidamente una aplicación de muestra .NET Core con SSL, generamos un certificado autofirmado y una clave asociada con este comando openssl
. Estamos instalando el certificado y la clave en la ubicación estándar para NGINX, /etc/nginx , pero puedes elegir una ubicación diferente.
$ openssl req -x509 -subj /CN=localhost -days 365 -set_serial 2 -newkey rsa:4096 -keyout /etc/nginx/cert.key -nodes -out /etc/nginx/cert.pem Generando una clave privada RSA de 4096 bits .........++ ............................++ escribiendo una nueva clave privada en '/etc/nginx/cert.key' -----
Configure el proxy inverso en el archivo de configuración predeterminado NGINX y NGINX Plus para servidores virtuales HTTP.
El archivo de configuración principal de NGINX y NGINX Plus es /etc/nginx/nginx.conf . Sin embargo, varias distribuciones de NGINX (así como NGINX Plus) siguen la convención de no colocar mucha configuración real en el archivo principal, sino que se crean archivos más pequeños y específicos de la función en un subdirectorio de /etc/nginx :
Luego, el contenido de los archivos específicos de la función en estos directorios se lee en el archivo principal ( nginx.conf ) con una directiva de inclusión
, por ejemplo:
incluir /etc/nginx/conf.d/*.conf;incluir /etc/nginx/sites-enabled/*;
Si no está seguro de cuál es el archivo de configuración predeterminado para los servidores virtuales HTTP en su sistema, busque la directiva de inclusión
relevante en /etc/nginx/nginx.conf .
Para configurar NGINX o NGINX Plus como proxy inverso, agregue los siguientes tres bloques de configuración al archivo de configuración predeterminado para servidores virtuales HTTP:
El primer bloque de servidor
acepta solicitudes HTTP en el puerto 80 y las redirecciona al servidor virtual para solicitudes HTTPS.
El segundo bloque de servidor
acepta solicitudes HTTPS en el puerto 443 y las envía a un grupo de uno o más servidores ascendentes (backend), aquí llamados dotnet . (Si en el Paso 1 instaló su certificado SSL autofirmado en un directorio distinto de /etc/nginx , sustituya la ruta correcta en las directivas ssl_certificate
y ssl_certificate_key
).
El bloque ascendente
define el grupo dotnet de servidores backend.
En Ejecutar el servidor HTTP Kestrel , configuramos Kestrel en localhost:5000
, lo que significa que escucha el tráfico IPv4 y IPv6 en ese puerto. (Configurar Kestrel para un solo protocolo puede causar inestabilidad y potencialmente502
errores.) De manera similar, NGINX y NGINX Plus resuelven localhost
tanto en su dirección IPv4 como en su dirección IPv6 (127.0.0.1 y ::1). Para simplificar, aquí identificamos el servidor ascendente como127.0.0.1
en lugar de localhost
, por lo que solo escucha tráfico IPv4. Puede utilizar localhost
si se siente cómodo con una configuración más avanzada que incluya IPv6.
servidor { escucha 80 servidor_predeterminado;
escucha [::]:80 servidor_predeterminado;
devuelve 301 https://$host$uri_solicitud;
}
servidor {
escucha 443 ssl http2 servidor_predeterminado;
escucha [::]:443 ssl http2 servidor_predeterminado;
certificado_ssl /etc/nginx/cert.pem;
clave_certificado_ssl /etc/nginx/cert.key;
ubicación / {
contraseña_proxy http://dotnet;
encabezado_conjunto_proxy Host $host;
}
}
upstream dotnet {
zona dotnet 64k;
servidor 127.0.0.1:5000;
}
Ejecute este comando curl
para probar la conectividad a la aplicación .NET Core a través de HTTPS. (También puedes apuntar tu navegador a tu servidor Linux).
$ curl -kv https://localhost * URL reconstruida a: https://localhost/ * Intentando ::1... * Conectado a localhost (::1) puerto 443 (#0) ...[ OMITIDO ]... < HTTP/1.1 200 OK < Servidor: nginx/1.10.0 (Ubuntu) < Fecha: Mar, 14 Feb 2017 20:22:07 GMT < Codificación de transferencia: fragmentada < Conexión: mantener activa < Fecha actual: 14/02/17 13:22:07
Nota: Si lo ves 502
Malo
Puerta
errores, significa que NGINX o NGINX Plus no pueden conectarse a su aplicação.NET. Asegúrese de que se esté ejecutando y brindando respuestas en el puerto 5000.
Si ha instalado el paquete nghttp2
, también puede ejecutar el siguiente comando nghttp
para probar la conectividad a través de HTTP/2. Busque la línea resaltada en naranja en el siguiente ejemplo, cerca del comienzo de la salida bastante extensa.
$ nghttp -v https://localhost [ 0.000] Conectado El protocolo negociado: h2 [ 0.009] enviar trama SETTINGS (niv=2) [SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100] [SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535] [ 0.009] enviar trama PRIORITY (dep_stream_id=0, peso=201, exclusivo=0)
200
DE ACUERDO
Instale e inicialice una aplicación “Hello World” en el directorio principal de su elección:
$ cd directorio-principal-para-aplicaciones $ mkdir app $ cd app $ dotnet restore
Para comprobar que la aplicación funciona, ejecute el comando dotnet
run
.
En este momento, .NET Core se ejecuta en Linux y sirve datos dinámicos utilizando Kestrel como servidor HTTP.
Con NGINX o NGINX Plus como proxy inverso para la aplicação.NET, puede configurar fácilmente la seguridad con SSL/TLS, compatibilidad con HTTP/2 y muchas otras características para una entrega rápida de aplicação en la misma máquina donde se ejecuta la aplicação .NET Core. Las siguientes instrucciones suponen que NGINX y NGINX Plus ya están instalados en su sistema; si no es así, consulte Instalar .NET Core, NGINX y NGINX Plus .
En este punto hemos terminado la configuración básica de NGINX o NGINX Plus con .NET Core. NGINX o NGINX Plus proporciona manejo de HTTP, controles de estado pasivos, seguridad con SSL/TLS y conectividad HTTP/2 para nuestra aplicación .NET Core.
Si ha instalado NGINX Plus, puede configurar dos capacidades adicionales: monitoreo de actividad en vivo y controles de estado activo.
[Editor: esta sección se ha actualizado para hacer referencia a la API NGINX Plus , que reemplaza y deja obsoleto el módulo de Estado extendido independiente que se analizó originalmente aquí].
Agregue el siguiente bloque de servidor
al archivo de configuración NGINX predeterminado para servidores virtuales HTTP. Le recomendamos encarecidamente que restrinja el acceso a las estadísticas y métricas. Aquí permitimos el acceso sólo a usuarios en localhost y una red local.
Para obtener más información sobre el monitoreo de actividad en vivo, consulte Monitoreo de actividad en vivo de NGINX Plus en 3 simples pasos en nuestro blog y la Guía de administración de NGINX Plus .
servidor { escuchar 8080;
permitir 127.0.0.1; # Permitir que el host local acceda a las estadísticas
permitir 10.3.3.0/24; # Permitir que la red local acceda a las estadísticas
denegar todo; # Impedir el acceso desde cualquier otro lugar
root /usr/share/nginx/html;
ubicación / {
devolver 302 /dashboard.html;
}
ubicación /api {
api write=on;
}
ubicación = /dashboard.html {
root /usr/share/nginx/html;
}
# Redirigir las solicitudes realizadas al panel anterior
ubicación = /status.html {
devolver 301 /dashboard.html;
}
}
Los controles de salud activos garantizan que NGINX Plus envíe tráfico solo a las aplicações que funcionan correctamente. Usted define las solicitudes HTTP que NGINX Plus envía periódicamente a la aplicación y el tipo de respuesta que la aplicación debe devolver para considerarse en buen estado.
Aquí requerimos que la respuesta de la aplicación cumpla las siguientes condiciones:
En el archivo de configuración predeterminado para servidores virtuales HTTP, agregue el siguiente bloque de ubicación
al bloque del servidor
principal (el bloque para el tráfico HTTPS definido en el Paso 2 de Configurar NGINX o NGINX Plus para utilizar el proxy inverso de la aplicação.NET ):
ubicación @healthcheck { contraseña_proxy http://dotnet;
encabezado_conjunto_proxy Host localhost;
healthcheck coincidencia=fecha_actual;
tiempo_espera_conexión_proxy 1s;
tiempo_espera_lectura_proxy 1s;
}
Agregue también el siguiente bloque de coincidencia
en el mismo nivel en la jerarquía que los bloques de servidor
y de flujo ascendente
:
Coincidencia de fecha actual { estado 200;
encabezado Servidor = Kestrel;
cuerpo ~ "Fecha actual";
}
Puede verificar que su aplicación backend esté en buen estado en la pestaña Upstreams del panel de monitoreo de actividad en vivo integrado (apunte su navegador a //http:// nginx-plus-server-address :8080/ ):
Para obtener más opciones de configuración de NGINX, consulte la documentación de Microsoft .
Para las implementaciones listas para producción de las aplicaciones que desarrolla con ASP.NET, NGINX y NGINX Plus proporcionan las funciones de administración de tráfico que necesita en un proxy inverso. NGINX y NGINX Plus brindan seguridad, escalabilidad, autenticación, limitación de tráfico y enrutamiento inteligente de sus solicitudes HTTP a aplicações.NET Core.
Para probar NGINX Plus usted mismo, comience hoy su prueba gratuita de 30 días o contáctenos para analizar sus casos de uso .
"Esta publicación de blog puede hacer referencia a productos que ya no están disponibles o que ya no reciben soporte. Para obtener la información más actualizada sobre los productos y soluciones F5 NGINX disponibles, explore nuestra familia de productos NGINX . NGINX ahora es parte de F5. Todos los enlaces anteriores de NGINX.com redirigirán a contenido similar de NGINX en F5.com.