¿Cuál es la mejor manera de ejecutar ServiceStack en Linux / Mono?


Aparece en el sitio web de ServiceStack muestra que ServiceStack puede ejecutarse en Mono con:

  • XSP
  • mod_mono
  • FastCGI
  • Consola

¿Cuáles son estas diferentes configuraciones y cuál es la preferida para los Servicios Web en Mono?

Author: mythz, 2012-08-30

5 answers

Actualización para Linux

Desde la versión v4.5.2 ServiceStack ahora es compatible con.NET Core, que ofrece mejoras significativas de rendimiento y estabilidad sobre Mono que se deriva de una base de código multiplataforma compartida y es compatible con el equipo activo y receptivo de Microsoft. Si actualmente está ejecutando ServiceStack en Mono, le recomendamos encarecidamente que actualice a. NET Core para aprovechar su rendimiento superior, estabilidad y su compatibilidad de arriba a abajo Pila de Tecnología.

Actualización para Mono

Nuestra configuración recomendada para alojar sitios ASP.NET en Linux y Mono es usar nginx/HyperFastCgi. Hemos publicado una guía paso a paso para crear una VM de Ubuntu desde cero completa con scripts deploy / install / conf / init en mono-server-config.

Ya no recomendamos MonoFastCGI después de notar varios problemas de estabilidad y rendimiento. Esta entrada de blog proporciona un buen análisis del rendimiento, uso de memoria y estabilidad de los diferentes ASP.NET Opciones de alojamiento en Mono .


Desarrollo

XSP es similar a VS.NET WebDev server - un sencillo standalone ASP.NET Servidor web escrito en C#. Esto es adecuado para el desarrollo o pequeñas cargas de trabajo. Solo tienes que ejecutarlo desde el directorio raíz de tu ServiceStack ASP.NET host que lo pondrá a disposición en http://localhost:8080.

Producción

Para servicios de Internet externos que generalmente desea alojar ServiceStack servicios web como parte de un servidor Web con todas las funciones. Los 2 servidores web con todas las funciones más populares para Linux son:

Nginx

Use Mono FastCGI para alojar ServiceStack ASP.NET hosts in Nginx .

Apache

Use mod_mono para alojar ServiceStack ASP.NET hosts in an Apache HTTP Server.

Alojamiento propio

ServiceStack también es compatible con el auto-alojamiento que le permite ejecutar su ServiceStack servicios web por sí solos en una aplicación de consola independiente (es decir, sin servidor web). Esta es una buena idea cuando no necesita los servicios de un servidor web con todas las funciones (por ejemplo, solo necesita alojar servicios web internamente en una Intranet).

De forma predeterminada, el mismo binario de la aplicación de consola ServiceStack se ejecuta en Windows/. NET y Mono/Linux tal cual. Aunque si lo desea, puede demonizar fácilmente su aplicación para que se ejecute como un demonio de Linux como se describe aquí. La página wiki también incluye instrucciones para configurar su servicio web auto-alojado para que se ejecute detrás de un proxy inverso Nginx o Apache.

Dado que proporciona un buen ajuste para el modelo de Concurrencia de Heroku como se detalla en su aplicación de 12 factores el auto-alojamiento será un área que buscaremos proporcionar un mayor soporte en un futuro cercano.

ServiceStack.net Configuración de Nginx / Mono FastCGI

El servicestack.net sitio web en sí (inc. todas las demostraciones en vivo) se ejecuta en un Ubuntu hetzner vServer usando Nginx + Mono FastCGI.

Este comando se usa para iniciar el proceso FastCGI en segundo plano:

fastcgi-mono-server4 --appconfigdir /etc/rc.d/init.d/mono-fastcgi 
  /socket=tcp:127.0.0.1:9000 /logfile=/var/log/mono/fastcgi.log &

Que aloja todas las aplicaciones definidas en *.archivos de webapp en la carpeta /etc/rc.d/init.d/mono-fastcgi especificada usando el formato de archivo de WebApp de XSP , por ejemplo:

ServiceStack.webapp:

<apps>
<web-application>
        <name>ServiceStack.Northwind</name>
        <vhost>*</vhost>
        <vport>80</vport>
        <vpath>/ServiceStack.Northwind</vpath>
        <path>/home/mythz/src/ServiceStack.Northwind</path>
</web-application>
</apps>

Esto ejecuta el proceso FastCGI Mono en segundo plano al que puede obtener Nginx para conectarse agregando esta regla a nginx.conf:

location ~ /(ServiceStack|RedisAdminUI|RedisStackOverflow|RestFiles)\.* {  
   root /usr/share/nginx/mono/servicestack.net/;  
   index index.html index.htm index.aspx default.htm Default.htm;  
   fastcgi_index /default.htm;
   fastcgi_pass 127.0.0.1:9000;  
   fastcgi_param SCRIPT_FILENAME /usr/share/servicestack.net$fastcgi_script_name;
   include /etc/nginx/fastcgi_params;  
}

Que enviará cualquier ruta que comienza con /ServiceStack o /RedisAdminUI, etc al proceso FastCGI mono server para su procesamiento. Algunas aplicaciones de ejemplo alojadas de esta manera:

Para aquellos interesados el Nginx + FastCGI completo archivos de configuración para servicestack.net están disponibles para su descarga.

 84
Author: mythz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-08 15:00:52

En producción usamos nginx con sockets de archivos unix

Encontramos un error/fuga de memoria al usar la comunicación de socket con nginx, service stack y mono. Esto fue con 500 solicitudes concurrentes, mientras que usted esperaría un pico en la cpu y la memoria que nunca volvió a bajar de nuevo. No hicimos más pruebas para descubrir dónde estaba el problema, pero hay un error registrado con xamarin bugzilla que parece similar a los problemas que tuvimos. Esencialmente intentamos lo siguiente y fue lo suficientemente bueno para nosotros.

Cambiamos a usar sockets unix con los siguientes parámetros de comandos

Fastcgi-mono-server4 /filename=/tmp/something.socket/socket = unix / applications = /var/www /

El problema que tuvimos con este método es que los permisos del archivo de socket cambiaban cada vez que ejecutabas fastcgi-mono-server4, ¡así que tienes que corregirlos después de iniciar fastcgi-mono-server4! El otro inconveniente es que en nuestras cajas solo podía manejar 120 solicitudes simultáneas. Sin embargo, esto no es realmente un problema para nosotros en este momento y siempre se puede generar más procesos.

Espero que esto ayude

 19
Author: Antony Denyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-07 09:07:59

Descargo de responsabilidad: Soy el autor del servidor HyperFastCgi y el autor de la publicación del blog fue mencionado en la respuesta del ceco

Nginx con HyperFastCgi haga este trabajo. HyperFastCgi no pierde memoria como servidor fastcgi mono y funciona mucho más rápido, porque utiliza API MONO de bajo nivel para pasar datos entre dominios de aplicaciones en lugar de una lenta implementación JIT mono de llamadas entre dominios. También tiene la opción de usar la biblioteca nativa libevent para las comunicaciones de sockets que es aproximadamente 1.5 - 2 más rápido que la implementación actual de System.Net.Sockets mono.

Características clave de HyperFastCgi:

  • Permite usar 3 formas diferentes de tratar con sockets y comunicación entre dominios:
    • Managed Listener with Managed Transport (utiliza solo código administrado, System.Net.Sockets. Slow asincrónico en mono, debido a las llamadas cruzadas JIT lentas)
    • Managed Listener with Combined Transport (utiliza Async System.Net.Sockets como oyente y API mono de bajo nivel para llamadas entre dominios. Mucho más rápido)
    • Native Listener (utiliza libevent como biblioteca de sockets y API mono de bajo nivel para realizar llamadas entre dominios. El mejor rendimiento)
  • Permite varias formas de realizar peticiones web en paralelo: usando ThreadPool,. NET 4.5 Task o Single-threading. Last options se combina con Native Listener hace que el servidor web funcione como NodeJS: todas las solicitudes se procesan en un solo subproceso de manera asíncrona.
  • Permite escribir manejadores de solicitudes simples sin usar el Sistema.Web en absoluto. Esto aumenta procesamiento de la ejecución de las solicitudes de 2-2.5 veces.
 6
Author: Sergey Zhukov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-28 16:48:07

Hay una entrada de blog útil y relativamente reciente con respecto al rendimiento de Mono usando ServiceStack. Pensé que podría ser útil para algunos que están a punto de decidir cómo alojar sus servicios: Rendimiento de Servicestack en Mono.

Como dice - el servidor FastCGI Mono tiene toneladas de fugas de memoria que puedo confirmar. Corrí ab -n 100000 -c 10 http://myurl en Ubuntu Desktop 14.04 usando Mono 3.2.8 y Nginx 1.4.6 y FastCGI Mono Server 3.0.11 y un servicio escrito usando ServiceStack 3.9.71. No creo que importe qué versión de ServiceStack estoy usando ya que el servidor FastCGI Mono es la parte filtrante. Se comió toda la memoria disponible, aproximadamente 1 GB de 2 GB en total.

Además, el rendimiento del servidor Mono Nginx + FastCGI es malo, al menos en comparación con otras soluciones. Mi servicio REST de muestra tenía alrededor de 275 solicitudes por segundo. El autor del blog había revisado el código del servidor FastCGI Mono y decidió escribir su propia implementación. Por alguna razón no está funcionando, al menos en mi máquina.

Así que el punto, supongo, es que no debería usar el servidor FastCGI Mono. A menos que desee reiniciar su caja a menudo.

Como este post es en su mayoría negativo, debo decir cuáles son mis intenciones con respecto al alojamiento de mis servicios. Probablemente optaré por el auto-alojamiento con un AppHost heredando AppHostHttpListenerLongRunningBase detrás de Nginx. Usando el mismo servicio REST de muestra anterior, obtengo alrededor de 1100 solicitudes por segundo. La mejor noticia es que el proceso no tenía fugas aparentes, lo probé con aproximadamente 1 000 000 solicitudes y el proceso había consumido

P.d. No soy el autor de la entrada del blog:)

 4
Author: ceco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-30 09:39:28

Evhttp-sharp - servidor http con host para NancyFx

Https://github.com/kekekeks/evhttp-sharp

Muy rápido, casi 4 veces más rápido que nancy-libevent2.

Http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=json&s=2&l=2

Hay resultados de pruebas para diferentes configuraciones:

Respuestas JSON por segundo:

  • evhttp-sharp 91,557
  • nancy-libevent2 17,338
  • servicestack-nginx-d 953
  • [17]} nancy 896{[18]]}
  • aspnet-jsonnet-mono 863
 2
Author: mikowiec,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-11-11 17:17:21