Подтвердить что ты не робот

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

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

  • XSP
  • mod_mono
  • Fastcgi
  • Console

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

4b9b3361

Ответ 1

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

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

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

Наша рекомендуемая установка для размещения сайтов 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, написанный на С#. Это подходит для разработки или небольших рабочих нагрузок. Вы просто запустите его из корневого каталога вашего узла ASP.NET ServiceStack, который сделает его доступным в http://localhost:8080.

Продукция

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

Nginx

Использовать Mono FastCGI для размещения хостов HostStStStStack в Nginx.

Apache

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

Self Hosting

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

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

Так как он отлично подходит для модели Heroku Concurrency как описано в их примере с 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|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;  
}

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

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

Ответ 2

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

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

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

fastcgi-mono-server4/filename=/tmp/something.socket/socket = unix /Приложения =/вар/WWW/

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

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

Ответ 3

Отказ от ответственности: я являюсь автором сервера 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 (использует встроенный libevent в качестве библиотеки сокетов и низкоуровневый моно-API для совершения междоменных вызовов. Наилучшая производительность)
  • Позволяет несколько способов параллельных веб-запросов: использование ThreadPool,.NET 4.5 Task или Single-threading. Последние параметры объединяются с Native Listener делает веб-сервер работает как NodeJS: все запросы обрабатываются в одном потоке асинхронным способом.
  • Позволяет писать простые обработчики запросов, не используя System.Web вообще. Это увеличивает производительность обработки запросов в 2-2,5 раза.

Ответ 4

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

Как говорится: на сервере 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 МБ оперативной памяти.

P.S. Я не являюсь автором сообщения в блоге:)

Ответ 5

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
  • nancy 896
  • aspnet-jsonnet-mono 863