Mono 2.11 no nginx usando fastcgi-mono-server4 não funcionará

5

Eu tenho o mono 2.11 configurado com o meu servidor nginx 1.0.15 rodando no centos 6.2. Eu construí a partir da fonte e xps2, xps4 e fastcgi-mono-server2 funcionam como esperado. O problema é quando tento executar o fastcgi-mono-server4. Quando eu corro:

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

Aqui está o que eu recebo do 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)

E é isso que eu recebo do 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)

Eu não vejo o que estou fazendo errado. Qualquer ajuda seria ótima.

EDITAR: refiz as coisas e agora estou recebendo um erro 502 para o gateway inválido. Os registros ainda parecem iguais.

Olhei no meu log de erros do Nginx e encontrei muitas entradas como esta:

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"

Eu recebo a mesma resposta se o fastcgi-mono-server4 está ligado ou não. Ele sempre mostra um erro 502 agora.

    
por fuzzycow101 07.06.2012 / 06:02

1 resposta

7

Minha aplicação MVC3 de amostra está funcionando bem no Mono 2.10.8.1 de badgerports.org (eu uso o Ubuntu).

Após instalar o Mono 2.11.2 a partir da fonte, o mesmo aplicativo sempre retornará um 502 Bad Gateway como no seu caso.

Meus registros nginx ficaram assim:

[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"

Após invocar fastcgi-mono-server4 com a opção printlog configurada como 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

Geraria este stacktrace depois de visitar o 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

Aqui estão algumas das minhas configurações:

#/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

-

Encontrei uma solução para o meu problema aqui: bugzilla.xamarin.com/show_bug.cgi?id=2876 (O que me incomoda é que ele foi consertado em fevereiro de 2012 - o mono que eu compilei foi lançado em junho afaik, mas não funcionou logo de cara)

Eu fiz um script baseado nas sugestões encontradas lá que corrige a instalação mono, basta apontar a variável PREFIX para o seu diretório mono e executá-lo:

#!/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

Depois disso, o aplicativo "funciona", mas ainda não chegou lá. Não faz mais o 502, e eu consigo um bom 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:

Então, ainda tenho coisas para descobrir, mas espero que algo disso seja útil para você.

    
por 27.07.2012 / 16:50