На веб-сайте ServiceStack он показывает, что ServiceStack может работать в Mono с помощью:
- XSP
- mod_mono
- Fastcgi
- Console
Каковы эти различные конфигурации и которые предпочтительнее для веб-сервисов на моно?
На веб-сайте ServiceStack он показывает, что ServiceStack может работать в Mono с помощью:
Каковы эти различные конфигурации и которые предпочтительнее для веб-сервисов на моно?
От релиз 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:
Использовать Mono FastCGI для размещения хостов HostStStStStack в Nginx.
Используйте mod_mono для размещения хостов HostStStStStack в HTTP-сервер Apache.
ServiceStack также поддерживает самостоятельный хостинг, который позволяет запускать веб-службы ServiceStack самостоятельно в автономном консольном приложении (т.е. без веб-сервера). Это хорошая идея, когда вам не нужны услуги полнофункционального веб-сервера (например, вам просто нужно размещать веб-службы внутри Intranet).
По умолчанию тот же самый двоичный файл приложения ServiceStack Console работает как в Windows/.NET, так и в Mono/Linux как есть. Хотя, если вы хотите, вы можете легко демонировать ваше приложение в запуститься как демон Linux, как описано здесь. Страница wiki также содержит инструкции по настройке вашего собственного веб-сервиса для работы за обратным прокси-сервером Nginx или Apache.
Так как он отлично подходит для модели Heroku Concurrency как описано в их примере с 12 факторами, самообслуживание будет областью, в которой мы в ближайшем будущем мы будем стремиться к увеличению поддержки.
Сам веб-сайт 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, доступен для скачивания.
В процессе производства мы используем 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 одновременных запросов. Однако на данный момент это не проблема для нас, и вы всегда можете создавать новые процессы.
Надеюсь, что это поможет
Отказ от ответственности: я являюсь автором сервера HyperFastCgi, а автор сообщения в блоге упоминается в ответе ceco
nginx с HyperFastCgi выполнить эту работу. HyperFastCgi не утечка памяти в качестве монострочного сервера fastcgi и работает намного быстрее, потому что использует низкоуровневый моно-API для передачи данных между доменами приложений вместо медленной моно-JIT-реализации междоменных вызовов. Также у него есть возможность использовать встроенную библиотеку libevent для сокетов, которая примерно на 1,5-2 быстрее, чем текущая моносистемная реализация System.Net.Sockets.
Основные возможности HyperFastCgi:
Managed Listener with Managed Transport
(использует только управляемый код, асинхронный System.Net.Sockets. Медленно в моно, из-за медленных междоменных вызовов JIT)Managed Listener with Combined Transport
(использует async System.Net.Sockets как прослушиватель и низкоуровневый моно API для междоменных вызовов. Гораздо быстрее)Native Listener
(использует встроенный libevent в качестве библиотеки сокетов и низкоуровневый моно-API для совершения междоменных вызовов. Наилучшая производительность)Native Listener
делает веб-сервер работает как NodeJS
: все запросы обрабатываются в одном потоке асинхронным способом.Существует полезное и относительно недавнее сообщение в блоге о производительности 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. Я не являюсь автором сообщения в блоге:)
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 в секунду: