Каков наилучший способ запустить ServiceStack в Linux / Mono?

Перечисленный на веб-сайте ServiceStack, он показывает, что ServiceStack может работать на Mono с помощью:

  • XSP
  • mod_mono
  • Fastcgi
  • Приставка

Что это за разные конфигурации и какие предпочтительны для веб-сервисов в Mono?

5 ответов

Решение

Обновление для Linux

Начиная с версии v4.5.2 ServiceStack теперь поддерживает.NET Core, которая предлагает значительные улучшения производительности и стабильности по сравнению с Mono, которая основана на общей кросс-платформенной кодовой базе и поддерживается хорошо обеспеченной, активной и отзывчивой командой Microsoft. Если вы в настоящее время используете ServiceStack в Mono, мы настоятельно рекомендуем обновить его до.NET Core, чтобы воспользоваться его превосходной производительностью, стабильностью и поддерживаемым технологическим стеком сверху вниз.

Обновление для Mono

Рекомендуемая установка для размещения сайтов ASP .NET в Linux и Mono - использовать nginx/HyperFastCgi. Мы опубликовали пошаговое руководство по созданию виртуальной машины Ubuntu с нуля вместе со сценариями deploy / install / conf / init в mono-server-config.

Мы больше не рекомендуем MonoFastCGI, заметив несколько проблем со стабильностью и производительностью. Этот пост содержит хороший анализ производительности, использования памяти и стабильности различных вариантов хостинга ASP .NET в Mono.


развитие

XSP похож на сервер VS.NET WebDev - простой автономный ASP.NET WebServer, написанный на C#. Это подходит для развития или небольших рабочих нагрузок. Вы просто запускаете его из корневого каталога своего хоста ServiceStack ASP.NET, который делает его доступным по адресу http://localhost:8080,

производство

Для внешних интернет-сервисов вы обычно хотите разместить веб-сервисы ServiceStack как часть полнофункционального веб-сервера. 2 самых популярных полнофункциональных веб-сервера для Linux:

Nginx

Используйте Mono FastCGI для размещения узлов ServiceStack ASP.NET в Nginx.

апаш

Используйте mod_mono для размещения узлов ServiceStack ASP .NET на HTTP-сервере Apache.

Самостоятельный хостинг

ServiceStack также поддерживает автономный хостинг, который позволяет самостоятельно запускать веб-сервисы ServiceStack в отдельном консольном приложении (т.е. без веб-сервера). Это хорошая идея, когда вам не нужны сервисы полнофункционального веб-сервера (например, вам просто нужно разместить веб-сервисы внутри сети во внутренней сети).

По умолчанию один и тот же двоичный файл приложения ServiceStack Console работает как в Windows/.NET, так и в Mono/Linux как есть. Хотя, если вы хотите, вы можете легко демонизировать ваше приложение для запуска в качестве демона Linux, как описано здесь. На вики-странице также содержатся инструкции по настройке собственного веб-сервиса для работы за обратным прокси-сервером Nginx или Apache.

Так как она хорошо подходит для модели параллелизма Heroku, как подробно описано в их 12-факторных приложениях, самостоятельная хостинг будет областью, в которой мы будем стремиться оказывать повышенную поддержку в ближайшем будущем.

ServiceStack.net Конфигурация Nginx / Mono FastCGI

Сам сайт servicestack.net (включая все живые демоверсии) работает на Ubuntu hetzner vServer с использованием Nginx + Mono FastCGI.

Эта команда используется для запуска фонового процесса FastCGI:

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

На котором размещены все приложения, определенные в файлах *.webapp в /etc/rc.d/init.d/mono-fastcgi папка, указанная с использованием формата файла XSP WebApp, например:

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>

Это запускает процесс FastCGI Mono в фоновом режиме, к которому вы можете подключить Nginx, добавив это правило в nginx.conf:

location ~ /(ServiceStack|RedisAdminUI|RedisStackru|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;  
}

Который будет пересылать любой маршрут, начиная с /ServiceStack или же /RedisAdminUI и т. д. для моносерверного процесса FastCGI для обработки. Некоторые примеры приложений размещены таким образом:

Для тех, кто заинтересован, доступны для загрузки полные файлы конфигурации Nginx + FastCGI для servicestack.net.

В производстве мы используем nginx с файловыми сокетами Unix

Мы обнаружили ошибку / утечку памяти при использовании сокетной связи с nginx, стеком сервисов и моно. Это было с 500 одновременных запросов, в то время как вы ожидаете всплеск процессора и памяти, он никогда не возвращался снова. Мы не проводили дальнейшее тестирование, чтобы выяснить, где была проблема, но есть ошибка, зарегистрированная в xamarin bugzilla, которая кажется похожей на проблемы, которые у нас были. По сути, мы попробовали следующее, и это было достаточно хорошо для нас.

Мы перешли на использование сокетов Unix со следующими параметрами команды

fastcgi-mono-server4 /filename=/tmp/something.socket /socket=unix /apps=/var/www/

Проблема этого метода в том, что права доступа к файлу сокета менялись при каждом запуске fastcgi-mono-server4, поэтому их нужно исправлять после запуска fastcgi-mono-server4! Другим недостатком является то, что на наших серверах он может обрабатывать только около 120 одновременных запросов. Однако на данный момент это не проблема для нас, и вы всегда можете запустить больше процессов.

Надеюсь это поможет

Отказ от ответственности: я являюсь автором сервера HyperFastCgi, и автор сообщения в блоге был упомянут в ответе ceco

nginx с HyperFastCgi делают эту работу. HyperFastCgi не пропускает память как моно fastcgi сервер и работает намного быстрее, потому что он использует низкоуровневый моно API для передачи данных между доменами приложений вместо медленной моно JIT реализации междоменных вызовов. Также есть возможность использовать нативную библиотеку libevent для связи через сокеты, что примерно в 1,5-2 раза быстрее, чем в текущей моно реализации System.Net.Sockets.

Ключевые особенности HyperFastCgi:

  • Позволяет использовать 3 разных способа работы с сокетами и междоменной связью:
    • Managed Listener with Managed Transport (используется только управляемый код, асинхронный System.Net.Sockets. Медленно в моно из-за медленных междоменных вызовов JIT)
    • Managed Listener with Combined Transport (использует async System.Net.Sockets в качестве прослушивателя и низкоуровневого моно API для междоменных вызовов. Гораздо быстрее)
    • Native Listener (использует native libevent в качестве библиотеки сокетов и низкоуровневый моно API для выполнения междоменных вызовов. Наилучшая производительность)
  • Позволяет несколько способов параллельного веб-запросов: с помощью ThreadPool, .NET 4.5 Task или Single-threading. Последние варианты в сочетании с Native Listener заставляет веб-сервер работать как NodeJS: все запросы обрабатываются в одном потоке асинхронно.
  • Позволяет писать простые обработчики запросов без использования System.Web. Это увеличивает производительность обработки запросов в 2-2,5 раза.

Есть полезное и относительно недавнее сообщение в блоге о производительности Mono с использованием ServiceStack. Я подумал, что это может быть полезно для тех, кто собирается решить, как разместить свои сервисы: производительность Servicetack в Mono.

Как он говорит - у сервера FastCGI Mono есть тонны утечек памяти, которые я могу подтвердить. Я побежал ab -n 100000 -c 10 http://myurl в Ubuntu Desktop 14.04 с использованием Mono 3.2.8 и Nginx 1.4.6 и FastCGI Mono Server 3.0.11 и службы, написанной с использованием ServiceStack 3.9.71. Я не думаю, что имеет значение, какую версию ServiceStack я использую, так как FastCGI Mono Server - это утечка. Он съел всю доступную память - около 1 ГБ из 2 ГБ в общей сложности.

Кроме того, производительность Nginx + FastCGI Mono Server низкая, по крайней мере, по сравнению с другими решениями. Мой примерный REST-сервис имел около 275 запросов в секунду. Автор блога ознакомился с кодом FastCGI Mono Server и решил написать собственную реализацию. По какой-то причине это не работает, по крайней мере, на моей машине.

Так что, я думаю, дело в том, что вы не должны использовать FastCGI Mono Server. Если вы не хотите часто перезагружать вашу коробку.

Поскольку этот пост в основном отрицательный, я должен сказать, каковы мои намерения относительно размещения моих услуг. Я, вероятно, пойду на хостинг с наследованием AppHost AppHostHttpListenerLongRunningBase за Nginx. Используя тот же самый пример сервиса REST выше, я получаю около 1100 запросов в секунду. Хорошей новостью является то, что у процесса не было явных утечек, я протестировал его с около 1 000 000 запросов, и процесс потребил менее 100 МБ ОЗУ.

PS Я не автор поста в блоге:)

evhttp-sharp - http-сервер с хостом для NancyFx

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

Очень быстро, почти в 4 раза быстрее, чем nancy-libevent2.

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

Есть результаты теста для разных конфигураций:

JSON ответов в секунду:

  • evhttp-sharp 91,557
  • nancy-libevent2 17,338
  • servicestack-nginx-d 953
  • Нэнси 896
  • aspnet-jsonnet-mono 863
Другие вопросы по тегам