web-dev-qa-db-ja.com

Linux / MonoでServiceStackを実行する最良の方法は何ですか?

ServiceStack Webサイト にリストされているのは、ServiceStackが次のいずれかでMono上で実行できることを示しています。

  • XSP
  • mod_mono
  • FastCgi
  • コンソール

これらのさまざまな構成は何ですか?また、MonoのWebサービスにはどの構成が適していますか?

48
mythz

Linux用の更新

v4.5.2リリース ServiceStackは.NET Coreをサポートするようになりました。これは、共有クロスプラットフォームコードベースから派生し、Microsoftのリソースが豊富でアクティブで応答性の高いMonoによってサポートされるMonoよりもパフォーマンスと安定性が大幅に向上しますチーム。現在MonoでServiceStackを実行している場合は、.NET Coreにアップグレードして、その優れたパフォーマンス、安定性、およびサポートされるトップからボトムまでのテクノロジースタックを活用することを強くお勧めします。

Monoの更新

ホスティングに推奨されるセットアップ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サーバーは次のとおりです。

Nginx

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 Nginx/Mono FastCGI構成

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構成ファイルは、 ダウンロード可能 です。

83
mythz

本番環境では、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の同時要求しか処理できないことです。ただし、これは現時点では問題ではないため、いつでもより多くのプロセスを生成できます。

お役に立てれば

19
Antony Denyer

免責事項:私はHyperFastCgiサーバーの著者であり、ブログ投稿の著者はcecoの回答で言及されました

HyperFastCgi を指定したnginxは、この仕事をします。 HyperFastCgiは、クロスドメインコールの遅いモノJIT実装の代わりに低レベルのモノAPIを使用してアプリケーションドメイン間でデータを渡すため、モノfastcgiサーバーとしてメモリをリークせず、はるかに高速に動作します。また、ソケット通信にネイティブlibeventライブラリを使用するオプションがあります。これは、現在のモノラルSystem.Net.Sockets実装よりも約1.5-2高速です。

HyperFastCgiの主な機能:

  • ソケットとクロスドメイン通信を処理するために3つの異なる方法を使用できます。
    • Managed Listener with Managed Transport(マネージコード、非同期System.Net.Socketsのみを使用します。JITクロスドメイン呼び出しが遅いため、モノラルで遅い)
    • Managed Listener with Combined Transport(リスナーとして非同期System.Net.Socketsを使用し、クロスドメイン呼び出しに低レベルのモノラルAPIを使用します。はるかに高速です)
    • Native Listener(ネイティブlibeventをソケットライブラリおよび低レベルのモノAPIとして使用して、クロスドメイン呼び出しを行います。最高のパフォーマンス)
  • Webリクエストを並列化するためのいくつかの方法を許可します:ThreadPool、.NET 4.5 Taskまたはシングルスレッドの使用。最後のオプションはNative Listenerと組み合わされて、WebサーバーをNodeJSのように動作させます。すべての要求は非同期方式で単一スレッドで処理されます。
  • System.Webをまったく使用せずに、単純な要求ハンドラーを作成できます。これにより、リクエストの処理パフォーマンスが2〜2.5倍向上します。
6
Sergey Zhukov

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。

追伸私はブログ投稿の著者ではありません:)

3
ceco

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応答:

  • evhttp-sharp 91,557
  • nancy-libevent2 17,338
  • servicestack-nginx-d 953
  • ナンシー896
  • aspnet-jsonnet-mono 863
2
mikowiec