Hace aproximadamente dos años Microsoft® anunció .NET Core , un marco que permite desarrollar y ejecutar aplicaciones .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 aplicación .NET Core es similar a la arquitectura de implementación de aplicaciones 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 aplicaciones .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.
{ "version": "1.0.0-*",
"buildOptions": {
"debugType": "portable",
"emitEntryPoint": true
},
"dependencies": {},
"frameworks": {
"netcoreapp1.0": {
"dependencies": {
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.0.1"
},
"Microsoft.AspNetCore.Server.Kestrel": "1.0.0"
},
"imports": "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.
using System;using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
namespace ConsoleApplication
{
public class Program
{
public static void Main(string[] args)
{
var host = new WebHostBuilder()
.UseKestrel()
.Configure(app =>
{
app.Run(async (context) => await context.Response.WriteAsync("Current date: " + DateTime.Now + "n"));
})
.Build();
host.Run();
}
}
}
Ejecute el comando dotnet
run
para iniciar el servidor .NET Core:
$ dotnet runProject app (.NETCoreApp,Version=v1.0) will be compiled because inputs were modified
Compiling app for .NETCoreApp,Version=v1.0
Compilation succeeded.
0 Warning(s)
0 Error(s)
Time elapsed 00:00:01.9047678
Hello World!
Hosting environment: Production
Content root path: /app/bin/Debug/netcoreapp1.0
Now listening on: http://localhost:5000
Application started. Press Ctrl+C to shut down.
Ejecute el comando curl
para probar la conectividad y HTTP:
$ curl -v localhost:5000* Rebuilt URL to: localhost:5000/
* Trying ::1...
* Connected to localhost (::1) port 5000 (#0)
> GET / HTTP/1.1
> Host: localhost:5000
> User-Agent: curl/7.47.0
> Accept: */*
>
< HTTP/1.1 200 OK
< Date: Tue, 14 Feb 2017 19:50:59 GMT
< Transfer-Encoding: chunked
< Server: Kestrel
<
Current date: 02/14/17 12:50:59 PM
* Connection #0 to host localhost left intact
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.pemGenerating a 4096 bit RSA private key
.........++
............................++
writing new private key to '/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:
include /etc/nginx/conf.d/*.conf;include /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.
server { listen 80 default_server;
listen [::]:80 default_server;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
ssl_certificate /etc/nginx/cert.pem;
ssl_certificate_key /etc/nginx/cert.key;
location / {
proxy_pass http://dotnet;
proxy_set_header Host $host;
}
}
upstream dotnet {
zone dotnet 64k;
server 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* Rebuilt URL to: https://localhost/
* Trying ::1...
* Connected to localhost (::1) port 443 (#0)
...[SKIPPED]...
< HTTP/1.1 200 OK
< Server: nginx/1.10.0 (Ubuntu)
< Date: Tue, 14 Feb 2017 20:22:07 GMT
< Transfer-Encoding: chunked
< Connection: keep-alive
<
Current date: 02/14/17 1:22:07 PM
Nota: Si lo ves 502
Malo
Puerta
errores, significa que NGINX o NGINX Plus no pueden conectarse a su aplicación.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] Connected
The negotiated protocol: h2
[ 0.009] send SETTINGS frame
(niv=2)
[SETTINGS_MAX_CONCURRENT_STREAMS(0x03):100]
[SETTINGS_INITIAL_WINDOW_SIZE(0x04):65535]
[ 0.009] send PRIORITY frame
(dep_stream_id=0, weight=201, exclusive=0)
200
DE ACUERDO
Instale e inicialice una aplicación “Hello World” en el directorio principal de su elección:
$ cd parent-dir-for-apps
$ 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 aplicación.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 aplicación en la misma máquina donde se ejecuta la aplicación .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 .
server { listen 8080;
allow 127.0.0.1; # Allow localhost to access the statistics
allow 10.3.3.0/24; # Allow local network to access the statistics
deny all; # Prevent access from anywhere else
root /usr/share/nginx/html;
location / {
return 302 /dashboard.html;
}
location /api {
api write=on;
}
location = /dashboard.html {
root /usr/share/nginx/html;
}
# Redirect requests made to the old dashboard
location = /status.html {
return 301 /dashboard.html;
}
}
Los controles de salud activos garantizan que NGINX Plus envíe tráfico solo a las aplicaciones 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 aplicación.NET ):
location @healthcheck { proxy_pass http://dotnet;
proxy_set_header Host localhost;
health_check match=currentdate;
proxy_connect_timeout 1s;
proxy_read_timeout 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
:
match currentdate { status 200;
header Server = Kestrel;
body ~ "Current date";
}
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 aplicaciones.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.