![nginx 上使用 fastcgi-mono-server4 的 Mono 2.11 无法工作](https://linux22.com/image/586463/nginx%20%E4%B8%8A%E4%BD%BF%E7%94%A8%20fastcgi-mono-server4%20%E7%9A%84%20Mono%202.11%20%E6%97%A0%E6%B3%95%E5%B7%A5%E4%BD%9C.png)
我在 centos 6.2 上运行的 nginx 1.0.15 webserver 上安装了 mono 2.11。我从源代码构建了它,xps2、xps4 和 fastcgi-mono-server2 工作正常。问题出在我尝试运行 fastcgi-mono-server4 时。当我运行:
fastcgi-mono-server4 /applications=site:/:/srv/www/html/ /socket=tcp:127.0.0.1:9000 /loglevels=Debug /printlog=true
以下是我从 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)
以下是我从 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)
我不知道我做错了什么。任何帮助都很好。
编辑:重新处理后,我收到了 502 错误,表示网关错误。日志看起来仍然一样。
查看了 Nginx 的错误日志,发现许多类似这样的条目:
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"
无论 fastcgi-mono-server4 是否开启,我都会得到相同的响应。现在它总是显示 502 错误。
答案1
我的示例 MVC3 应用程序在 badgerports.org 的 Mono 2.10.8.1 上运行良好(我使用 ubuntu)。
从源代码安装 Mono 2.11.2 后,同一个应用程序总是会返回 502 Bad Gateway,就像您的情况一样。
我的 nginx 日志如下所示:
[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"
调用 fastcgi-mono-server4 并将 printlog 选项设置为 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
访问 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
以下是我的一些配置:
#/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
-
我在这里找到了解决问题的方法:bugzilla.xamarin.com/show_bug.cgi?id=2876(让我感到烦恼的是,该问题据称已于 2012 年 2 月修复 - 据我所知,我编译的 mono 于 6 月发布,但它却无法开箱即用)
我根据那里找到的建议制作了一个脚本来修复 mono 安装,只需将 PREFIX 变量指向你的 mono 目录并运行它:
#!/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
此后,应用程序“运行”,但还不够好。它不再出现 502 错误,而且我得到了一个很好的堆栈跟踪...
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:
所以我自己还有一些事情需要弄清楚,但我希望这些能对你有所帮助。