您的位置:知识库 » 其他分类

一次艰难的mono环境部署

作者: 木子博客  来源: 博客园  发布时间: 2011-02-10 16:35  阅读: 4988 次  推荐: 0   原文链接   [收藏]  

  腾讯社区开放平台提供的体验区的服务器环境是这样的:

  操作系统:Linux version 2.6.16.60 (gcc version 4.1.2 20070115 (SUSE Linux))

  这个Linux内核的版本号应该是SLES(SUSE Linux Enterprise Server 10 SP2)的操作系统。mono原来的版本号是1.2.2,而我们需要2.8.2的mono。所以,第一步的工作就是升级mono。

  通过腾讯的跳板机登录到服务器后,需要跟腾讯的运维人员申请root权限,这个就不用多说了。

  部署mono环境的具体步骤如下:

  1、下载mono并上传到腾讯的服务器上。

  腾讯的服务器是没有配置dns解析功能的,所以不能直接用yast2来通过更新源来升级mono;对于可以用yast2安装的,可以参考我的《在openSUSE中部署基于apache的mono环境》。而用rpm手工安装,太多的程序依赖处理起来很麻烦,只好用通过编译mono源码的方式来安装了。

  在这里可以下载到mono的源码,我们只需要mono-2.8.tar.bz2/xsp-2.8.tar.bz2/mod_mono-2.8.tar.bz2。mono-2.8.tar.bz2当然是mono的核心了,xsp-2.8.tar.bz2是一个轻量级的web服务器,而mod_mono-2.8.tar.bz2是apache的模块,使用这个来解析.net开发的网站。

  上传文件到腾讯的服务器需要分2部走,首先用rz -be把文件上传到腾讯的跳板机,然后再用scp命令把文件传到目标服务器。

  2、安装mono-2.8.tar.bz2。

  切换到mono-2.8.bar.bz2的目录,执行

1
tarxf mono-2.8.tar.bz2

  解压mono源码包。之后再

1
cdmono-2.8

  进入解压出来的文件夹后,执行配置命令,这里都使用默认配置,如果使用–prefix指定目录的话,需要修改很多配置,操作起来非常麻烦。

1
./configure

  之后就是最常规的

1
make

  进入漫长的编译过程。中间过程如果出错,根据它的提示安装相当的文件。然后直接进行安装。

1
makeinstall

  到这里,mono就安装完成了。这步非常简单。我走的弯路是腾讯要求要把软件都安装到/usr/local/services/目录,而mono指定安装目录后,需要设置系统变量及在后面的软件安装过程都要显式的指定mono目录,一直都没有折腾好,最后只好使用默认安装,结果一次就好了。

  3、安装xsp-2.8.tar.bz2。

  一样解压文件并执行configure,

1
2
3
tarxf xsp-2.8.tar.bz2
cdxsp-2.8
./configure

  到这里一直都是正确的,但是执行

1
make

  的时候,就不能进行下去了。会有这样一个提示:

Your sqlite3 version is old – please upgrade to at least v3.5.0!

Unhandled Exception:System.EntryPointNotFoundException: sqlite3_next_stmt

…….

  提示这个错误是因为linux本身的sqlite3版本号不够,默认的是3.1.3。你要么升级sqlite要么修改xsp的文件。查看xsp的安装文件发现是在编译xsp的demo文件时产生的错误。在$XSP_PATH/test/1.1/webcontrols目录下有dbpage1.aspx/dbpage1.sqlite/dbpage2.aspx/dbpage2.sqlite/dbpage_test_setup.cs这几个文件,错误就是在编译这些文件的时候产生的。于是我修改了这个目录下的Makefile/Makefile.am/Makefile.in这三个文件,把和sqlite有关的都删除掉了。

  分别编辑这三个文件,找到:

1
samples_Data =

  把这个值的

1
2
dbpage1.aspx \
dbpage2.aspx \

  把这两个删掉,还有:

1
2
3
4
5
6
7
8
9
sqlitedir = $(pkglibdir)/test/1.1/webcontrols
sqlite_DATA = dbpage.sqlite \
                       dbpage2.sqlite
samplesbindir = ....
samplesbin_SCRIPTS = ...
dbpage_test_setup_build = ...
EXTRA_Dist = $(sqlite_DATA) ...
all: all-am

  这些都删掉。在页面的底部还有:

1
2
3
4
dbpage_test_setup.exe :$(dbpage_test_setup_build)....
# ...... 一直到 ......
dbpage2.sqlite: dbpage_test_setup.exe
    $(RUNTIME) dbpage_test_setup.exe

  全部都需要删掉。三个页面都执行这样的删除操作。删除完后,再make,就能成功编译了。完了再

1
makeinstall

  安装mono最麻烦的问题就是这里编译出错。网上查这个编译错误,貌似很多人都有遇到,但是又都没有说怎么解决。期间我还尝试升级sqlite3,可是没有升级成功。最后一个文件一个文件打开来看,才发现Makefile文件的秘密。主要是第一次折腾linux系统,所以多走了很多弯路。

  4、安装mod_mono-2.8.tar.bz2。

  安装这个也没有遇到什么问题,主要是如果你的apache文件不是安装在默认目录的,需要在configure命令时指定apache的bin目录。

5、都安装好后,剩下的就是配置apache了。

  编辑$APACHE_PATH/conf/httpd.conf文件,增加一个配置:

1
2
#Mono module
Include conf/mod_mono.conf

  安装mod_mono之后,这个mod_mono.cnf是自动生成的,和apache的httpd.conf在相同的目录。

  对于网站的配置,Mono的官方网站有一个mod_mono的配置生成工具,建议使用里面的Virtual Host的方式来生成配置文件。它能帮我们生成这样的配置文件:

代码
<VirtualHost *:80>
ServerName mono.moozi.net
ServerAdmin moozi@moozi.net
DocumentRoot /srv/www/mono.moozi.net
# MonoServerPath can be changed to specify which version of ASP.NET is hosted
# mod-mono-server1 = ASP.NET 1.1 / mod-mono-server2 = ASP.NET 2.0
# For SUSE Linux Enterprise Mono Extension, uncomment the line below:
# MonoServerPath mono.moozi.net "/opt/novell/mono/bin/mod-mono-server2"
# For Mono on openSUSE, uncomment the line below instead:
MonoServerPath mono.moozi.net "/usr/bin/mod-mono-server2"
# To obtain line numbers in stack traces you need to do two things:
# 1) Enable Debug code generation in your page by using the Debug="true"
# page directive, or by setting
<compilation debug="true" /> in the
# application's Web.config
# 2) Uncomment the MonoDebug true directive below to enable mod_mono debugging
MonoDebug mono.moozi.net true
# The MONO_IOMAP environment variable can be configured to provide platform abstraction
# for file access in Linux. Valid values for MONO_IOMAP are:
# case
# drive
# all
# Uncomment the line below to alter file access behavior for the configured application
MonoSetEnv mono.moozi.net MONO_IOMAP=all
#
# Additional environtment variables can be set for this server instance using
# the MonoSetEnv directive. MonoSetEnv takes a string of 'name=value' pairs
# separated by semicolons. For instance, to enable platform abstraction *and*
# use Mono's old regular expression interpreter (which is slower, but has a
# shorter setup time), uncomment the line below instead:
# MonoSetEnv mono.moozi.net MONO_IOMAP=all;MONO_OLD_RX=1
MonoApplications mono.moozi.net "/:/srv/www/mono.moozi.net"
<Location "/">
Allow from all
Order allow,deny
MonoSetServerAlias mono.moozi.net
SetHandler mono
</Location>
</VirtualHost>

  这里我们增加了两个<Location />配置节,让静态资源文件使用apache的默认handler处理。最后,重启apache就好了。

  经过了近一周时间的折腾,终于成功地在腾讯社区开放平台部署好MONO环境。

  我们的应用是腾讯社区开放平台的首个.NET应用,测试了一下午,程序运行状态良好。从感官上来看,响应比IIS还快…当然,事实还有待于验证。

  杯具的是腾讯体验区的web服务器今天封网了,要年后初九才能上线到体验区…

0
0
标签:mono

其他分类热门文章

    其他分类最新文章

      最新新闻

        热门新闻