BLOG | NGINX

Tutorial: Proxy de .NET Core y Kestrel con NGINX y NGINX Plus

NGINX - Parte de F5 - horizontal, negro, tipo RGB
Miniatura de Nick Shadrin
Nick Shadrin
Publicado el 14 de febrero de 2017

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:

    • Ejecutar el código de la aplicação dinámica
    • Escuchar en una dirección IP local y responder a las solicitudes HTTP
  • NGINX o NGINX Plus, actuando como proxy inverso:

    • Acepta tráfico HTTP/2 a través de IPv6 e IPv4
    • Proporciona descarga de SSL para la aplicação .NET
    • Proporciona servicio de archivos estáticos
    • Proporciona registros de acceso
    • Añade almacenamiento en caché
  • NGINX Plus:

    • Proporciona monitoreo y métricas de actividad en vivo.
    • Garantiza que la aplicación funcione mediante controles de estado activos.

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.

Instrucciones

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.

  1. Instalar .NET Core, NGINX y NGINX Plus
  2. Ejecute la aplicación "Hola mundo"
  3. Ejecute el servidor HTTP Kestrel
  4. Configurar NGINX o NGINX Plus para realizar un proxy inverso de la aplicação .NET
  5. Configurar la monitorización de actividad en vivo y los controles de salud activos de NGINX Plus

Instalar .NET Core, NGINX y NGINX Plus

  1. 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
    
  2. Instalar NGINX:

    $ sudo apt-get install nginx
  3. 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 .

    1. 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" } } }
      
    2. 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();
      }
      }
      }
      
    3. 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.
      
    4. 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
      
    1. Instalar un certificado SSL. Hay varias formas de obtenerlo:

      • Cómprelo de una autoridad de certificación (CA) reconocida
      • Haga que su grupo de TI corporativo o CA lo genere
      • Exportarlo desde un servidor IIS existente
      • Utilice una CA gratuita como Let's Encrypt
      • Generar un certificado autofirmado directamente

      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' -----
      
    2. 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 :

      • Para las compilaciones de código abierto de NGINX proporcionadas por nginx.org y para NGINX Plus, el directorio es /etc/nginx/conf.d y el archivo predeterminado para servidores virtuales HTTP es default.conf .
      • Para las compilaciones de código abierto de NGINX distribuidas con Ubuntu, el directorio es /etc/nginx/sites-enabled y el archivo predeterminado para los servidores virtuales HTTP es default .

      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;
      }
      
    3. 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)
      
    • El código de respuesta es 200DE ACUERDO
    • El servidor de aplicaciones es Kestrel y no algún otro software
    • El cuerpo de la respuesta incluye las palabras “Fecha actual”
    • La aplicación responde en un período de espera de 1 segundo.
  4. Ejecute la aplicación "Hola mundo"

    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 .

    Ejecute el servidor HTTP Kestrel

    En este momento, .NET Core se ejecuta en Linux y sirve datos dinámicos utilizando Kestrel como servidor HTTP.

    Configurar NGINX o NGINX Plus para realizar un proxy inverso de la aplicação .NET

    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 .

    Configurar la monitorización de actividad en vivo y los controles de salud activos de 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.

    Configurar la monitorización de actividad en vivo

    [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;
    }
    }
    

    Configurar comprobaciones de salud activas

    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/ ):

    El panel de monitoreo de actividad en vivo de NGINX Plus informa el estado de las aplicações .NET de backend que NGINX utiliza como proxy.

    Para obtener más opciones de configuración de NGINX, consulte la documentación de Microsoft .

    CONCLUSIÓN

    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.