Search code examples
c#linuxmonoservicestackmod-fastcgi

What is the best way to run ServiceStack on Linux / Mono?


Listed on the ServiceStack website it shows that ServiceStack can run on Mono with either:

  • XSP
  • mod_mono
  • FastCgi
  • Console

What are these different configurations and which is preferred for Web Services on Mono?


Solution

  • Update for Linux

    From the v4.5.2 Release ServiceStack now supports .NET Core which offers significant performance and stability improvements over Mono that’s derived from a shared cross-platform code-base and supported by Microsoft's well-resourced, active and responsive team. If you’re currently running ServiceStack on Mono, we strongly recommend upgrading to .NET Core to take advantage of its superior performance, stability and its top-to-bottom supported Technology Stack.

    Update for Mono

    Our recommended Setup for hosting ASP .NET sites on Linux and Mono is to use nginx/HyperFastCgi. We've published a step-by-step guide going through creating an Ubuntu VM from scratch complete with deploy / install / conf / init scripts at mono-server-config.

    We're no longer recommending MonoFastCGI after noticing several stability and performance issues. This blog post provides a good analysis of the performance, memory usage and stability of the different ASP.NET Hosting options in Mono.


    Development

    XSP is similar to VS.NET WebDev server - a simple standalone ASP.NET WebServer written in C#. This is suitable for development or small work loads. You just run it from the root directory of your ServiceStack ASP.NET host which will make it available at http://localhost:8080.

    Production

    For external internet services you generally want to host ServiceStack web services as part of a full-featured Web Server. The 2 most popular full-featured web servers for Linux are:

    Nginx

    Use Mono FastCGI to host ServiceStack ASP.NET hosts in Nginx.

    Apache

    Use mod_mono to host ServiceStack ASP.NET hosts in an Apache HTTP Server.

    Self Hosting

    ServiceStack also supports self-hosting which lets you run your ServiceStack webservices on its own in a standalone Console application (i.e. without a web server). This is a good idea when you don't need the services of a full-featured web server (e.g: you just need to host web services internally on an Intranet).

    By default the same ServiceStack Console app binary runs on both Windows/.NET and Mono/Linux as-is. Although if you wish, you can easily daemonize your application to run as a Linux daemon as outlined here. The wiki page also includes instructions for configuring your self-hosted web service to run behind an Nginx or Apache reverse proxy.

    Since it provides a good fit for Heroku's Concurrency model as detailed in their 12 factor app self-hosting will be an area we'll be looking to provide increased support around in the near future.

    ServiceStack.net Nginx / Mono FastCGI configuration

    The servicestack.net website itself (inc. all live demos) runs on an Ubuntu hetzner vServer using Nginx + Mono FastCGI.

    This command is used to start the FastCGI background process:

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

    Which hosts all applications defined in *.webapp files in the /etc/rc.d/init.d/mono-fastcgi folder specified using XSP's WebApp File Format, e.g:

    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>
    

    This runs the FastCGI Mono process in the background which you can get Nginx to connect to by adding this rule to 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;  
    }
    

    Which will forward any route starting with /ServiceStack or /RedisAdminUI, etc to the FastCGI mono server process for processing. Some example apps hosted this way:

    For those interested the full Nginx + FastCGI configuration files for servicestack.net are available for download.