ServiceStack Webサイト にリストされているのは、ServiceStackが次のいずれかでMono上で実行できることを示しています。
これらのさまざまな構成は何ですか?また、MonoのWebサービスにはどの構成が適していますか?
v4.5.2リリース ServiceStackは.NET Coreをサポートするようになりました。これは、共有クロスプラットフォームコードベースから派生し、Microsoftのリソースが豊富でアクティブで応答性の高いMonoによってサポートされるMonoよりもパフォーマンスと安定性が大幅に向上しますチーム。現在MonoでServiceStackを実行している場合は、.NET Coreにアップグレードして、その優れたパフォーマンス、安定性、およびサポートされるトップからボトムまでのテクノロジースタックを活用することを強くお勧めします。
ホスティングに推奨されるセットアップASP LinuxおよびMonoの.NETサイトでは、nginx/HyperFastCgiを使用します。UbuntuVM mono-server-config のdeploy/install/conf/initスクリプトでゼロから完了しました。
いくつかの安定性とパフォーマンスの問題に気付いた後、MonoFastCGIを推奨しなくなりました。このブログ投稿では、 Monoの異なるASP.NETホスティングオプション のパフォーマンス、メモリ使用量、および安定性に関する優れた分析を提供しています。
[〜#〜] xsp [〜#〜] はVS.NET WebDevサーバー-C#で記述されたシンプルなスタンドアロンASP.NET WebServerに似ています。これは、開発または小さな作業負荷に適しています。 ServiceStack ASP.NETホストのルートディレクトリから実行するだけで、http://localhost:8080
で利用できるようになります。
外部インターネットサービスの場合、通常、フル機能のWebサーバーの一部としてServiceStack Webサービスをホストします。 Linux用の2つの最も人気のあるフル機能のWebサーバーは次のとおりです。
Mono FastCGI を使用して、ServiceStack ASP.NETホストを Nginx でホストします。
mod_mono を使用して、ServiceStack ASP.NETホストを Apache HTTP Server でホストします。
ServiceStackは、スタンドアロンのコンソールアプリケーションで(つまり、Webサーバーなしで)ServiceStack Webサービスを単独で実行できるセルフホスティングもサポートしています。これは、フル機能のWebサーバーのサービスが必要ない場合(たとえば、イントラネットでWebサービスを内部でホストする必要がある場合)に良いアイデアです。
デフォルトでは、同じServiceStackコンソールアプリバイナリがそのままWindows/.NETとMono/Linuxの両方で実行されます。必要に応じて、アプリケーションを簡単にデーモン化して ここで説明するLinuxデーモンとして実行 にできます。 wikiページには、NginxまたはApacheリバースプロキシの背後で実行するようにセルフホストWebサービスを構成するための手順も含まれています。
Herokuの同時実行モデルに適しているため、 12ファクターアプリで詳しく説明しているように セルフホスティングは、近い将来にサポートを増やすことを期待している分野です。
Servicestack.net Webサイト自体(すべてのライブデモを含む)は、Nginx + Mono FastCGIを使用して buntu hetzner vServer で実行されます。
このコマンドは、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 &
XSPのWebAppファイル形式 を使用して指定された/etc/rc.d/init.d/mono-fastcgi
フォルダー内の* .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.confに追加することで、Nginxに接続できます。
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モノサーバープロセスに転送して処理します。この方法でホストされたいくつかのサンプルアプリ:
Servicestack.netの完全なNginx + FastCGI構成ファイルは、 ダウンロード可能 です。
本番環境では、nginxとunixファイルソケットを使用します
Nginx、サービススタック、およびモノとのソケット通信を使用すると、バグ/メモリリークが見つかりました。これは500の同時リクエストで発生しましたが、CPUとメモリのスパイクが予想される一方で、再びダウンすることはありませんでした。問題がどこにあるかを発見するためのさらなるテストは行いませんでしたが、 xamarin bugzilla でログに記録されたバグがあります。基本的に次のことを試しましたが、それで十分でした。
次のコマンドパラメーターでUNIXソケットの使用に切り替えました
fastcgi-mono-server4 /filename=/tmp/something.socket/socket = unix/applications =/var/www /
このメソッドでの問題は、fastcgi-mono-server4を実行するたびにソケットファイルのアクセス許可が変更されるため、fastcgi-mono-server4を起動した後に修正する必要があることです。もう1つの欠点は、ボックスでは約120の同時要求しか処理できないことです。ただし、これは現時点では問題ではないため、いつでもより多くのプロセスを生成できます。
お役に立てれば
免責事項:私はHyperFastCgiサーバーの著者であり、ブログ投稿の著者はcecoの回答で言及されました
HyperFastCgi を指定したnginxは、この仕事をします。 HyperFastCgiは、クロスドメインコールの遅いモノJIT実装の代わりに低レベルのモノAPIを使用してアプリケーションドメイン間でデータを渡すため、モノfastcgiサーバーとしてメモリをリークせず、はるかに高速に動作します。また、ソケット通信にネイティブlibeventライブラリを使用するオプションがあります。これは、現在のモノラルSystem.Net.Sockets実装よりも約1.5-2高速です。
HyperFastCgiの主な機能:
Managed Listener with Managed Transport
(マネージコード、非同期System.Net.Socketsのみを使用します。JITクロスドメイン呼び出しが遅いため、モノラルで遅い)Managed Listener with Combined Transport
(リスナーとして非同期System.Net.Socketsを使用し、クロスドメイン呼び出しに低レベルのモノラルAPIを使用します。はるかに高速です)Native Listener
(ネイティブlibeventをソケットライブラリおよび低レベルのモノAPIとして使用して、クロスドメイン呼び出しを行います。最高のパフォーマンス)Native Listener
と組み合わされて、WebサーバーをNodeJS
のように動作させます。すべての要求は非同期方式で単一スレッドで処理されます。ServiceStackを使用したMonoのパフォーマンスに関する有用で比較的最近のブログ投稿があります。サービスをホストする方法を決定しようとしている人に役立つと思いました:MonoでのServicestack performance.
それが言うように-FastCGI Monoサーバーには、確認できるメモリリークがtonsあります。 ab -n 100000 -c 10 http://myurl
Mono 3.2.8とNginx 1.4.6を使用するUbuntu Desktop 14.04、FastCGI Mono Server 3.0.11、およびServiceStack 3.9.71を使用して記述されたサービス。 FastCGI Mono Serverは漏れやすいビットなので、使用しているServiceStackのバージョンは重要ではないと思います。使用可能なすべてのメモリを使用しました(合計2GBのうち約1Gb)。
また、少なくとも他のソリューションと比較した場合、Nginx + FastCGI Mono Serverのパフォーマンスはbadです。私のサンプルRESTサービスには1秒あたり約275のリクエストがありました。このブログの著者はFastCGI Mono Serverのコードをレビューし、独自の実装を作成することにしました。少なくとも私のマシンでは。
ですから、ポイントは、FastCGI Mono Serverを使用しないべきではないということです。頻繁にボックスを再起動する場合を除きます。
この投稿はほとんど否定的であるため、サービスのホスティングに関する私の意図は何かを言う必要があります。おそらく、Nginxの背後にあるAppHostHttpListenerLongRunningBase
を継承するAppHostを使用したセルフホスティングに行きます。上記の同じサンプルRESTサービスを使用すると、1秒あたり約1100リクエストを取得します。プロセスに明らかなリークがなく、約1,000,000リクエストでテストし、プロセスが消費したこと<100MB RAM。
追伸私はブログ投稿の著者ではありません:)
evhttp-sharp-NancyFxのホストを持つhttpサーバー
https://github.com/kekekeks/evhttp-sharp
非常に高速で、nancy-libevent2よりもほぼ4倍高速です。
http://www.techempower.com/benchmarks/#section=data-r8&hw=i7&test=json&s=2&l=2
さまざまな構成のテスト結果があります。
1秒あたりのJSON応答: