阿不

在腾讯微博和新浪微博 @hjf1223 ,最新的技术观点在那

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  211 随笔 :: 0 文章 :: 3000 评论 :: 75 引用

上篇介绍Mono在Window下的部署,对于我而言,相比于Windows平台下的部署,Linux平台下的部署挑战性会更大一点。从来没有Linux使用经验的我,要在Linux下部署Mono,遇到的不仅仅是Mono部署的问题,还有各种Linux操作的问题。我是使用的从Mono官方下载的安全配置好的虚拟机,安装方面的问题就可以暂时先跳过去,不过这里还是要先总结一下,先熟悉一下的几个常用的openSUSE操作。

1)配置网卡,进行文件管理都需要超级用户(su)密码,官方下载的虚拟机,su密码是:mono。刚开始不知道,还是小小的折腾了一会儿。其实,访问http://localhost 的默认首页就有这个用户密码的说明了。

2)apache的配置路径是在:/etc/apache2/。站点的默认目录是在:/srv/www/htdocs/,你会频繁在这两个目录做切换。

3)要修改配置你需要用超级用户的权限打开文件管理器,这个也是让我花了一些时间去查找。解决方案是创建一个命令行的快捷方式就可以了,看这个贴子

4)重启apache的命令行:/etc/init.d/apache2 restart

5)如果需要,最好去扫盲一下什么是,YaST,什么是安装源。Linux下,动不动就要下源码编译安装,吓都吓死人了。使用的VPC是之前下载的,装的是Mono 2.8,昨天就是利用YaST自动升级到Mono 2.10。

事后总结,在Linux下部署Mono ASP.NET,主要是没有像IIS那样可视化的操作,都是命令行,看起来就是恐怖,但其实并没有的想像中的那么复杂。我们要先把官方的几个文档(Mod_monoAutoHostingApache mod_mono configuration tool)先熟悉一下,了解一下工作原理,再动手实施可能会少走一些弯路。另外一条教训就是,先部署低版本的,简单的,再尝试新版本刚支持的特性,比如先部署简单的ASP.NET WebForm页面(简单的一个页面),再部署MVC站点;先部署MVC1.0,再部署最新的MVC3.0,这样即使出错也更利于我们排错。刚开始直接折腾MVC3,那个杯具啊。

官方文档中介绍,在openSUSE+Apache有两种部署方式:自动Hosting和手工创建配置文件部署:

1.自动Hosting,只需做一次Apache配置,以后的部署Mono站点就只需要Xcopy到站点目录下就可以了,不需要再做额外部署。参考AutoHosting,主要步骤:

1)在/etc/apache2/httpd.conf添加:Include /etc/apache2/mod_mono.conf (这个文件在openSUSE 11.3的实际路径是Include /etc/apache2/conf.d/mod_mono.conf),引入mod_mono的配置。

2)在mod_mono.conf文件中添加这一行:MonoAutoApplication enabled。在官方文档中,还需要加入:MonoServerPath "/usr/bin/mod-mono-server2",但实际上好像不需要。而且我改成:MonoServerPath "/usr/bin/mod-mono-server4",它也不工作,不知道是什么问题。

3)如果是部署MVC站点,还需要在mod_mono.conf文件中加入这行:ForceType application/x-asp-net。但是对MVC站点,不推荐使用自动Hosting。

当我做了以上配置之后,我们在部署ASP.NET站点时,就只需要把目录拷贝到/srv/www/htdocs/就可以完成部署了。文件目录对应的就是站点的虚拟目录。

2.手工创建部署文件,看完善友兄的这篇文章在Mono 2.8上部署ASP.NET MVC 2,我有点晕。那个配置文件就足以让我头痛,之前这篇文档Apache mod_mono configuration tool一直都被我无视着。当我完整的看完几个官方文档之后,我才意识到这个工具的重要性。这个工具会根据我们希望部署的站点的情况,提供几个输入框让我们输入,之后我们就可以下载它生成的配置文件,直接将这些配置文件下载放到:/etc/apache2/conf.d/  而不需要再做其它配置站点就可以正常工作。

3.最土的部署办法,就是看看内置的那几个站点是如何部署的,直接把它的几个配置文件拷贝一下,修修改改也一样可以。在刚开始,我没有按正常流程来的时候,实在搞不清楚了,我用这种办法也一样把站点部署成功了。而且还是直接部署MVC3站点。

总结到这里,我发现在Linux下部署Mono ASP.NET也不是很难的事情嘛。只是一开始走的弯路有点多,心情有点急躁。不过,上篇中提到的MVC3的几个问题,在Linux下面也是同样存在的,应该可以判断是Mono2.10存在的bug吧,不过这bug也太过低级吧,难道他们没有测试提交的情况?如果是这样,希望能尽快解决这些bug。

阿不 http://hjf1223.cnblogs.com
posted on 2011-02-20 16:43 阿不 阅读(3041) 评论(29) 编辑 收藏

评论

#1楼 2011-02-20 18:40 XueM      
LZ的帖子太及时了,我刚才在自己的机器上测试一直没有成功,浏览aspx文件总是提示下载保存,郁闷...
 回复 引用 查看   

#2楼[楼主] 2011-02-20 18:55 阿不      
@XueM
我也有遇到这个问题,那是因为没有用mono来处理.aspx请求。关键是你解决问题了没?
 回复 引用 查看   

#3楼 2011-02-20 19:07 XueM      
@阿不
还没有,
我在/etc/apache2/目录下没有发现mod_mono.conf文件,
libapache2-mod-mono和mono-apache-server2都已经安装了,不知道楼主是怎么解决的。
 回复 引用 查看   

#4楼[楼主] 2011-02-20 19:11 阿不      
@XueM
"(这个文件在openSUSE 11.3的实际路径是Include /etc/apache2/con.d/mod_mono.conf)"
 回复 引用 查看   

#5楼 2011-02-20 19:16 XueM      
@阿不
我用的是Debian,暂时还没有发现。
 回复 引用 查看   

#6楼[楼主] 2011-02-20 19:20 阿不      
@XueM
那我就没经验了。可能需要你自己创建一个mod_mono.conf,这个是没有问题的。其它mod_mono.conf的内容很简单,关键是httpd.conf需要include进来就好了。如果你找不到,我晚上给你找找,发给你
 回复 引用 查看   

#7楼 2011-02-20 19:26 XueM      
@阿不
恩,如果mod_mono.conf内容差不多的话,刚才我在文档里拷了一个,另外我发现我的httpd.conf里面的内容也是空的,呵呵
 回复 引用 查看   

#8楼 2011-02-21 09:29 NewSea.      
使用 Mono 的人越来越多了, 好事.
 回复 引用 查看   

#9楼 2011-03-04 14:57 whiz      
我现在是用CentOS 5.5 + nginx 0.8.54 + mono 2.10,运行ASP.NET Mvc3的站点(razor脚本,只是用Mvc3项目模板,什么也没有改)。报错“Directory does not exists Parameter name: value”,Http 400错误,百思不得其解。似乎老外对这种配置的讨论也不是很多。
 回复 引用 查看   

#10楼[楼主] 2011-03-04 16:34 阿不      
@whiz
我印象中我遇到这个问题,后来找了一下,看到我这个帖子的回复,你可以参考一下:http://www.cnblogs.com/zealic/archive/2010/04/01/1701897.html#2029499

引用如果遇到提示:
System.ArgumentException: Directory does not exists
Parameter name: value
in <0x0015e> System.IO.FileSystemWatcher:set_Path (System.String value)

把Mono执行fastcgi-mono-server 的命令行关掉重新开一个,可能会解决问题。另外,记录一下我的命令行是:
fastcgi-mono-server4 /applications=/:. /socket=tc
p:127.0.0.1:9000 /port=8080 /root="E:\Mono\nginx-0.9.4\Mono_MVC3"

遇到No Application Found,问题是出在/applications参数上,默认我们只要/applications=/:. 测试应该就没问题了。

 回复 引用 查看   

#11楼 2011-03-04 21:08 whiz      
谢谢,之前已看到过,但试过没有效果,会不会是因为Windows环境和Linux有区别呢?

想在网上找能够成功运行的例子,但似乎没有。

@阿不
引用阿不:
@whiz
我印象中我遇到这个问题,后来找了一下,看到我这个帖子的回复,你可以参考一下:http://www.cnblogs.com/zealic/archive/2010/04/01/1701897.html#2029499

引用如果遇到提示:
System.ArgumentException: Directory does not exists
Parameter name: value
in <0x0015e> System.IO.FileSystemWatcher:set_Path (System.String value)

把Mono执行fastcgi-mono...

 回复 引用 查看   

#12楼[楼主] 2011-03-05 13:42 阿不      
@whiz
刚想起来,你可以试一下是不是程序目录设置有问题,fastcgi-mono-server4的root参数。
 回复 引用 查看   

#13楼 2011-03-05 15:34 whiz      
我再试了一次,这次除了在nginx.conf中指定root外,在fastcgi-mono-server4里面再指定一次root参数,这次好了,异常不同了。

“Could not load file or assembly 'System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35' or one of its dependencies. ”

引用阿不:
@whiz
刚想起来,你可以试一下是不是程序目录设置有问题,fastcgi-mono-server4的root参数。

 回复 引用 查看   

#14楼 2011-03-05 16:28 whiz      
查了mono的GAC,没有mvc3对应的库……

只好手动试试把windows里面的dll copy到bin。不过就变成了这个异常。

No access to the given key

Description: HTTP 500. Error processing request.
 回复 引用 查看   

#15楼[楼主] 2011-03-05 16:44 阿不      
@whiz
从现在的情况来看,你已经成功进入mono处理程序了。你要注意,在拷贝MVC3的DLL时,Microsoft.Web.Infrastructure.dll 不要拷贝进去。
 回复 引用 查看   

#16楼[楼主] 2011-03-05 16:46 阿不      
@whiz
从现在的情况来看,你已经进入了mono的处理程序了。我建议你先不要试mvc3的站点,你先用普通的asp.net站点来试,然后成功了再试mvc3。另外,拷贝mvc3 dll的时候,这个文件不要拷进去:Microsoft.Web.Infrastructure.dll
 回复 引用 查看   

#17楼 2011-03-05 17:09 whiz      
@阿不
我主要想测试以后是否可以使用mono做生产机。WebForms能运行与否,在于我是不太关心的。如果mono不能正常运行mvc3,我的项目就只能另外加windows的服务器了。

网上能找到的mono配置mvc3的资料很少,这点比较令人失望,与传说中的热火朝天颇有差距。相比其他新东西,老外其实还是比较勇于尝试的,但mono+mvc3只有寥寥几篇,而且连回复都没有。

Mono Tools for VS在4.0的项目有问题,但没有support。MonoDevelop最新的beta竟然在windows平台下是要下载源码来编译的部署!

老实说,经过几天的折腾,我实在有点不太看好mono。
 回复 引用 查看   

#18楼 2011-03-05 17:13 whiz      
@阿不

删除Microsoft.Web.Infrastructure.dll,异常又变成了,似乎Microsoft.Web.Infrastructure.dll还是必须的:

Could not find type: System.Web.Security.WindowsTokenRoleProvider
Description: HTTP 500. Error processing request.
 回复 引用 查看   

#19楼[楼主] 2011-03-05 18:19 阿不      
@whiz
如果你一定要用MVC3的话,那我告诉,先暂时别折腾吧。我可以肯定的说,目前还没有办法完全支持MVC3。有一些简单问题他们团队都还没有测试到。
 回复 引用 查看   

#20楼 2011-03-05 21:48 whiz      
@阿不
看Release Notes说是Mvc3某些API没有在开源的协议下面,所以暂时没有办法弄。但我只是奇怪为什么好像没什么人去尝试,mono论坛人气也不是很够,因此正在怀疑这个平台是否能用作生产。
 回复 引用 查看   

#21楼[楼主] 2011-03-06 10:26 阿不      
@whiz
那是Microsoft.Web.Infrastructure.dll不开源,不过他们自己做了一个来替代这个程序集的功能,这个运行是没有问题的。

至于MVC3,如果你设置正确的话,是可以正确访问的。普通的页面都是可以访问的。只是有些需要ModelBinder的时候有点小问题。这些问题已经反馈给他们团队。

我也不清楚是否能用于生产环境,毕竟我还没有试过。但是好像国内和国外都已经有一些站点运行于MONO了。我还是希望mono能发展的更好,我当然希望.NET这个平台不再只限于Windows。
 回复 引用 查看   

#22楼 2011-03-06 13:34 whiz      
@阿不
我现在就是删除了Microsoft.Web.Infrastructure.dll,会出现上面的异常。请教一下,如何替换这个dll呢?

运行于Mono的Mvc3应该没有,实际上估计在Windows平台用上razor的生产系统也不多吧。这个是很正常的,只是我奇怪讨论的人也这么少。
 回复 引用 查看   

#23楼[楼主] 2011-03-06 14:15 阿不      
@whiz
Microsoft.Web.Infrastructure.dll这个删掉就可以运行了。。。这个我确定,我就可以运行。
 回复 引用 查看   

#24楼 2011-03-06 18:01 whiz      
我会报这个异常:

删除Microsoft.Web.Infrastructure.dll,异常又变成了:

Could not find type: System.Web.Security.WindowsTokenRoleProvider
Description: HTTP 500. Error processing request.

引用阿不:
@whiz
Microsoft.Web.Infrastructure.dll这个删掉就可以运行了。。。这个我确定,我就可以运行。
 回复 引用 查看   

#25楼[楼主] 2011-03-06 20:05 阿不      
@whiz
其实问还是出在WindowsTokenRoleProvider这个上面,可能是因为Microsoft.Web.Infrastructure.dll这个程序集在前面加载,所以先报这个错误。如果它通过了,那么后面如果还有错误,才会被抛出来。异常不是说的很清楚吗,找不到这个类型。那就要看mono有没有实现这个类。我估计你是自己的实际项目直接拿到mono来运行的,这样肯定是没有办法直接工作的,肯定还会有很多地方需要修改的。我的建议是,你很弄一个简单的MVC3程序,先熟悉一下,他是怎么配置的。只有通过了,你才可以做更多的事情。
 回复 引用 查看   

#26楼 2011-03-07 01:38 whiz      
@阿不
还没有那正式的系统来试,是用Mvc3的缺省项目目标,选择razor生成的项目来试的,什么也没有改动,生成后就copy过去了。(在Windwos的MonoDevelop中这个项目是可以运行的)
 回复 引用 查看   

#27楼[楼主] 2011-03-07 09:16 阿不      
@whiz
我不知道你的项目有什么问题,要不你可以下载我上面提供的示例站点。那个站点也是普通的MVC3站点,可以在Mono运行的。
 回复 引用 查看   

#28楼 2011-07-19 17:55 ryanding      
挺多人在搞mono嘛~
 回复 引用 查看   

#29楼 2011-12-13 11:22 童同      
昨天在centos6下用最新的稳定版本搭建了个,官方的例子运行也正常没有什么问题。然后把之前用asp.net mvc3,spring.net ,nhibernate做的一个网站放进去就出错误。错误如下:
Server Error in '/demo' Application
Object reference not set to an instance of an object

Description: HTTP 500. Error processing request.

Stack Trace:

System.NullReferenceException: Object reference not set to an instance of an object
  at Spring.Context.Support.WebApplicationContext..cctor () [0x00000] in <filename unknown>:0 

Version information: Mono Runtime Version: 2.10.6 (tarball Tue Dec 13 01:29:00 CST 2011); ASP.NET Version: 4.0.30319.1

我怀疑是我配置文件这里的问题,如下
<spring>
<parsers>
<parser type="Spring.Data.Config.DatabaseNamespaceParser, Spring.Data"/>
<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/>
</parsers>
<context>
<resource uri="assembly://Ifrit.DataAccess/Ifrit.DataAccess.Config/RepositoryBase.xml" />
<resource uri="assembly://Ifrit.DataAccess/Ifrit.DataAccess.Config/Repository.xml" />
<resource uri="assembly://Ifrit.Business/Ifrit.Business.Config/BusinessBase.xml" />
<resource uri="assembly://Ifrit.Business/Ifrit.Business.Config/Business.xml" />
<resource uri="assembly://Ifrit.Controllers/Ifrit.Controllers.Config/Controllers.xml" />
<resource uri="config://spring/objects"/>
</context>
<objects xmlns="http://www.springframework.net"/>
</spring>
里面的context节点下配置文件的问题。不知道是不是想请教下。
 回复 引用 查看