Nginx – Mono 2.11 on nginx using fastcgi-mono-server4 will not work

centosfastcgimononginx

I have mono 2.11 set up with my nginx 1.0.15 webserver running on centos 6.2. I built it from source and xps2, xps4 and fastcgi-mono-server2 work as expected. The problem is when I try and run fastcgi-mono-server4. When I run:

fastcgi-mono-server4 /applications=site:/:/srv/www/html/ /socket=tcp:127.0.0.1:9000 /loglevels=Debug /printlog=true

Here is what I get from fastcgi-mono-server2:

[2012-06-06 23:51:07Z] Debug   Record received. (Type: BeginRequest, ID: 1, Length: 8)
[2012-06-06 23:51:07Z] Debug   Record received. (Type: Params, ID: 1, Length: 801)
[2012-06-06 23:51:07Z] Debug   Record received. (Type: Params, ID: 1, Length: 0)
[2012-06-06 23:51:07Z] Debug   Read parameter. (QUERY_STRING = )
[2012-06-06 23:51:07Z] Debug   Read parameter. (REQUEST_METHOD = GET)
[2012-06-06 23:51:07Z] Debug   Read parameter. (CONTENT_TYPE = )
[2012-06-06 23:51:07Z] Debug   Read parameter. (CONTENT_LENGTH = )
[2012-06-06 23:51:07Z] Debug   Read parameter. (SCRIPT_NAME = /)
[2012-06-06 23:51:07Z] Debug   Read parameter. (REQUEST_URI = /)
[2012-06-06 23:51:07Z] Debug   Read parameter. (DOCUMENT_URI = /)
[2012-06-06 23:51:07Z] Debug   Read parameter. (DOCUMENT_ROOT = /srv/www/html)
[2012-06-06 23:51:07Z] Debug   Read parameter. (SERVER_PROTOCOL = HTTP/1.1)
[2012-06-06 23:51:07Z] Debug   Read parameter. (GATEWAY_INTERFACE = CGI/1.1)
[2012-06-06 23:51:07Z] Debug   Read parameter. (SERVER_SOFTWARE = nginx/1.0.15)
[2012-06-06 23:51:07Z] Debug   Read parameter. (REMOTE_ADDR = 192.168.128.121)
[2012-06-06 23:51:07Z] Debug   Read parameter. (REMOTE_PORT = 62326)
[2012-06-06 23:51:07Z] Debug   Read parameter. (SERVER_ADDR = 192.168.128.125)
[2012-06-06 23:51:07Z] Debug   Read parameter. (SERVER_PORT = 80)
[2012-06-06 23:51:07Z] Debug   Read parameter. (SERVER_NAME = site)
[2012-06-06 23:51:07Z] Debug   Read parameter. (REDIRECT_STATUS = 200)
[2012-06-06 23:51:07Z] Debug   Read parameter. (PATH_INFO = )
[2012-06-06 23:51:07Z] Debug   Read parameter. (SCRIPT_FILENAME = /srv/www/html/)
[2012-06-06 23:51:07Z] Debug   Read parameter. (HTTP_HOST = site)
[2012-06-06 23:51:07Z] Debug   Read parameter. (HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0)
[2012-06-06 23:51:07Z] Debug   Read parameter. (HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8)
[2012-06-06 23:51:07Z] Debug   Read parameter. (HTTP_ACCEPT_LANGUAGE = en-us,en;q=0.5)
[2012-06-06 23:51:07Z] Debug   Read parameter. (HTTP_ACCEPT_ENCODING = gzip, deflate)
[2012-06-06 23:51:07Z] Debug   Read parameter. (HTTP_CONNECTION = keep-alive)
[2012-06-06 23:51:07Z] Debug   Read parameter. (HTTP_COOKIE = ASP.NET_SessionId=0176BE8FC161E702439D3C91)
[2012-06-06 23:51:07Z] Debug   Record received. (Type: StandardInput, ID: 1, Length: 0)
[2012-06-06 23:51:08Z] Debug   Record sent. (Type: StandardOutput, ID: 1, Length: 196)
[2012-06-06 23:51:08Z] Debug   Record sent. (Type: StandardOutput, ID: 1, Length: 128)
[2012-06-06 23:51:08Z] Debug   Record sent. (Type: StandardOutput, ID: 1, Length: 0)
[2012-06-06 23:51:08Z] Debug   Record sent. (Type: EndRequest, ID: 1, Length: 8)

And this is what I get from fastcgi-mono-server4:

[2012-06-06 23:50:52Z] Debug   Record received. (Type: BeginRequest, ID: 1, Length: 8)
[2012-06-06 23:50:52Z] Debug   Record received. (Type: Params, ID: 1, Length: 801)
[2012-06-06 23:50:52Z] Debug   Record received. (Type: Params, ID: 1, Length: 0)
[2012-06-06 23:50:52Z] Debug   Read parameter. (QUERY_STRING = )
[2012-06-06 23:50:52Z] Debug   Read parameter. (REQUEST_METHOD = GET)
[2012-06-06 23:50:52Z] Debug   Read parameter. (CONTENT_TYPE = )
[2012-06-06 23:50:52Z] Debug   Read parameter. (CONTENT_LENGTH = )
[2012-06-06 23:50:52Z] Debug   Read parameter. (SCRIPT_NAME = /)
[2012-06-06 23:50:52Z] Debug   Read parameter. (REQUEST_URI = /)
[2012-06-06 23:50:52Z] Debug   Read parameter. (DOCUMENT_URI = /)
[2012-06-06 23:50:52Z] Debug   Read parameter. (DOCUMENT_ROOT = /srv/www/html)
[2012-06-06 23:50:52Z] Debug   Read parameter. (SERVER_PROTOCOL = HTTP/1.1)
[2012-06-06 23:50:52Z] Debug   Read parameter. (GATEWAY_INTERFACE = CGI/1.1)
[2012-06-06 23:50:52Z] Debug   Read parameter. (SERVER_SOFTWARE = nginx/1.0.15)
[2012-06-06 23:50:52Z] Debug   Read parameter. (REMOTE_ADDR = 192.168.128.121)
[2012-06-06 23:50:52Z] Debug   Read parameter. (REMOTE_PORT = 62326)
[2012-06-06 23:50:52Z] Debug   Read parameter. (SERVER_ADDR = 192.168.128.125)
[2012-06-06 23:50:52Z] Debug   Read parameter. (SERVER_PORT = 80)
[2012-06-06 23:50:52Z] Debug   Read parameter. (SERVER_NAME = site)
[2012-06-06 23:50:52Z] Debug   Read parameter. (REDIRECT_STATUS = 200)
[2012-06-06 23:50:52Z] Debug   Read parameter. (PATH_INFO = )
[2012-06-06 23:50:52Z] Debug   Read parameter. (SCRIPT_FILENAME = /srv/www/html/)
[2012-06-06 23:50:52Z] Debug   Read parameter. (HTTP_HOST = site)
[2012-06-06 23:50:52Z] Debug   Read parameter. (HTTP_USER_AGENT = Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Gecko/20100101 Firefox/13.0)
[2012-06-06 23:50:52Z] Debug   Read parameter. (HTTP_ACCEPT = text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8)
[2012-06-06 23:50:52Z] Debug   Read parameter. (HTTP_ACCEPT_LANGUAGE = en-us,en;q=0.5)
[2012-06-06 23:50:52Z] Debug   Read parameter. (HTTP_ACCEPT_ENCODING = gzip, deflate)
[2012-06-06 23:50:52Z] Debug   Read parameter. (HTTP_CONNECTION = keep-alive)
[2012-06-06 23:50:52Z] Debug   Read parameter. (HTTP_COOKIE = ASP.NET_SessionId=0176BE8FC161E702439D3C91)
[2012-06-06 23:50:53Z] Debug   Record received. (Type: StandardInput, ID: 1, Length: 0)
[2012-06-06 23:50:53Z] Debug   Record sent. (Type: EndRequest, ID: 1, Length: 8)

I do not see what I am doing wrong. Any help would be great.

EDIT: Reworked things and now I am getting a 502 Error for Bad Gateway. The logs still look the same.

Looked in my error log for Nginx and found many entries like this:

2012/06/18 13:56:01 [error] 3108#0: *4 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.128.121, server: site, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "site"

I get the same response whether the fastcgi-mono-server4 is on or not. It always shows a 502 error now.

Best Answer

My sample MVC3 application is working fine on Mono 2.10.8.1 from badgerports.org (I use ubuntu).

After installing Mono 2.11.2 from source the same application would always return a 502 Bad Gateway just like in your case.

My nginx logs looked like this:

[error] 3384#0: *101 upstream sent unexpected FastCGI record: 3 while reading response header from upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "fastcgi://127.0.0.1:9000", host: "localhost:8000"

After invoking fastcgi-mono-server4 with the printlog option set to true

sudo /opt/mono-2.11.2/bin/fastcgi-mono-server4 /printlog=True /applications=/:/var/www/mono/Mvc3Template /socket=tcp:127.0.0.1:9000

It would generate this stacktrace after visiting localhost:8000/

[2012-07-27 14:55:57Z] Notice  Beginning to receive records on connection.
[2012-07-27 14:55:58Z] Error   ERROR PROCESSING REQUEST: System.TypeInitializationException: An exception was thrown by the type initializer for Mono.WebServer.FastCgi.WorkerRequest

Server stack trace: 
  at Mono.WebServer.FastCgi.ApplicationHost.ProcessRequest (Mono.WebServer.FastCgi.Responder responder) [0x00001] in /home/r522/Desktop/mono-2.11.2/build/xsp-2.10.2/src/Mono.WebServer.FastCgi/ApplicationHost.cs:47 
  at (wrapper remoting-invoke-with-check) Mono.WebServer.FastCgi.ApplicationHost:ProcessRequest (Mono.WebServer.FastCgi.Responder)
  at (wrapper xdomain-dispatch) Mono.WebServer.FastCgi.ApplicationHost:ProcessRequest (object,byte[]&,byte[]&)

Exception rethrown at [0]: 
 ---> System.InvalidCastException: Cannot cast from source type to destination type.
  at System.Configuration.ConfigurationManager.get_AppSettings () [0x00000] in <filename unknown>:0 
  at Mono.WebServer.FastCgi.WorkerRequest..cctor () [0x0002c] in /home/r522/Desktop/mono-2.11.2/build/xsp-2.10.2/src/Mono.WebServer.FastCgi/WorkerRequest.cs:50 
  --- End of inner exception stack trace ---
  at (wrapper xdomain-invoke) Mono.WebServer.FastCgi.ApplicationHost:ProcessRequest (Mono.WebServer.FastCgi.Responder)
  at (wrapper remoting-invoke-with-check) Mono.WebServer.FastCgi.ApplicationHost:ProcessRequest (Mono.WebServer.FastCgi.Responder)
  at Mono.WebServer.FastCgi.Responder.Process () [0x00060] in /home/r522/Desktop/mono-2.11.2/build/xsp-2.10.2/src/Mono.WebServer.FastCgi/Responder.cs:90 
[2012-07-27 14:55:58Z] Notice  Finished receiving records on connection

Here is some of my configuration:

#/etc/nginx/sites-enabled/mono

 server {
         listen   8000;
         server_name  localhost;
         access_log   /var/log/nginx/mono.access.log;
         error_log    /var/log/nginx/mono.error.log;
         location / {
                 root /var/www/mono/Mvc3Template;
                 index index.html index.htm default.aspx Default.aspx;
                 fastcgi_index /Home/Index; # Points to HomeController Index Action
                 fastcgi_pass 127.0.0.1:9000;
                 include /etc/nginx/fastcgi_params;
         }
 }

-

# Directory structure
/var/www/mono
├── Mvc3Template
│   ├── bin
│   ├── Content
│   ├── Controllers
|   ... omitted rest
├── Mvc3Template.sln
├── Mvc3Template.suo
├── Mvc3Template.userprefs
├── packages

-

I found a solution to my problem here: bugzilla.xamarin.com/show_bug.cgi?id=2876 (What bugs me is that it's supposively been fixed on February 2012 - the mono I compiled was released in June afaik yet it didn't work out of the box )

I made a script based on the suggestions found there that fixes the mono installation, just point the PREFIX variable to your mono directory and run it:

#!/bin/bash

# Your mono directory
PREFIX=/opt/mono-2.11.2


FILES=('mod-mono-server4'
       'fastcgi-mono-server4'
       'xsp4')

cd $PREFIX/lib/mono/4.0

for file in "${FILES[@]}"
do
   cp "$file.exe" ../4.5
done


cd $PREFIX/bin

for file in "${FILES[@]}"
do
  sed -ie 's|mono/4.0|mono/4.5|g' $file
done

After this the application "works", but it's not quite there yet. It doesn't 502 any longer, and I get a nice stacktrace...

System.Web.Compilation.CompilationException
: at IKVM.Reflection.Reader.ModuleReader.ResolveType (Int32 metadataToken, IGenericContext context) [0x00000] in <filename unknown>:0

Description: Error compiling a resource required to service this request. Review your source file and modify it to fix this error.

Details: : at IKVM.Reflection.Reader.ModuleReader.ResolveType (Int32 metadataToken, IGenericContext context) [0x00000] in <filename unknown>:0

Error origin: Compiler

Error source file: ~/Global.asax
Exception stack trace:

So I still have things to figure out myself, but I hope something from this will be helpful to you.