最新更新参看: Centos 7.0 安装Mono 3.4 和 Jexus 5.6
2012年初写过一篇《32和64位的CentOS 6.0下 安装 Mono 2.10.8 和Jexus 5.0》,2013年7月24日Mono 3.2发布了,3.2版本有很多期待的新特性,具体参看《跨平台的 .NET 运行环境 Mono 3.2 新特性》,本文主要就是这篇文章的更新。
CentOS是一个基于RHEL的Linux发行版,其目的是为了提供一套免费与*的企业等级Linux发行版。CentOS的名称来自于「Community ENTerprise Operating System」,从名称便可以知道这是一套由社区主导、并以企业级用户为主要目标的操作系统。
目前CentOS是网页服务器用途的主机中最广为使用的一套Linux发行版。根据统计,目前大约有30%的Linux服务器使用CentOS。许多书籍、网站在介绍Linux的操作方式时,也会援引CentOS作为操作接口。通常CentOS都会在RHEL推出新版本之后,经过一小段时间的修改与测试之后再推出新的版本,而其版本编号大多也会跟随RHEL的版本编号,例如目前最新版本的CentOS 6,其相对应的RHEL版本便是RHEL 6。
Jexus web server for linux 是一款基于.NET兼容环境,运行于Linux/unix操作系统之上,以支持ASP.NET为核心功能的高性能WEB服务器,用于替换Apache+mod_mono、Nginx+FastCgi 方案运行ASP.NET。Jexus不但具有跨平台ASP.NET服务器这样的标志性特征,同时还拥有内核级的安全监控、入侵检测、URL重写、无文件路由等一系列重要功能和专有特性。
Mono Xsp 和Jexus有什么区别呢:
- 速度方面: 对于ASP.NET网页,大压力访问时Jexus处理速度更快; 对于静态文件,Jexus远快于XSP,而且对磁盘的要求和影响小N倍;
- 功能方面: XSP是以ASP.NET测试工作开发的,功能单调,而Jexus是作为生产环境使用的真实的WEB服务开发的,功能全面,因此,xsp与Jexus在功能上可比性
- 稳定性方面: Jexus有良好的容错和自动纠错能力,可以长期不间断运行,而XSP是单进程程序,没有任何自动纠错机制,无法保持不间断运行。
- 安全性方面: Jexus有关键的入侵检测功能,XSP没有任何安全检测功能,没有可比性;
- 多站点支持: XSP支持一站,Jexus支持任意多网站。
Jexus for linux 有如下特点:
- 支持多种操作系统:Jexus最初的设计目标是“跨平台的ASP.NET WEB服务器”,由于在Windows系统上,IIS已经是ASP.NET的优秀平台,所以,当前的Jexus以支持Linux和FreeBSD等非Windows系统为主要设计目标。正因为这个原因,就Linux/FreeBSD等平台的ASP.NET建设而言,Jexus具有特别重大的意义。
- 高性能:“高性能”是Jexus的重要的设计目标。虽然Jexus基于Mono环境运行,但Jexus并非全部由Mono的.NET组件构成,对于涉及性能的关键代码,Jexus非常巧妙地大量采用了Linux/Unix本身的优秀特性,从代码层保证了Jexus的性能优势。
同时,Jexus的框架特征也为高性能提供了基础保证。Jexus不象XSP那样,纯HTML也需要经过ASP.NET处理,更不象Apache和Nginx等服务器,需要通过插件的形式间接地对ASP.NET进行支持,Jexus把HMTL静态文件处理模块、ASP.NET处理模块、静态文件高速缓存机制、epoll/poll数据传输机制等进行了高度集成,从架构本身入手,最大限度地提高WEB服务器的处理能力和传输速度。 - 安全性:Jexus内核含有安全监控机制,绝大多数恶意访问在进入网站前就会被Jexus直接禁止,这是Jexus有别于其它WEB服务器的又一大特色,所以,Jexus特别适合那些对安全要求较高的企业网站或*网站使用。
- 稳定性:从运行机制而言,Jexus系统中,有专门检测工作进程执行状态的管理单元,任何一个进程退出或者任何一个ASP.NET网站应用程序域退出,被会被管理单元发现并得到重启,从而保证了Jexus能够7*24小时不间断工作;从程序本身而言,Jexus程序代码力求简洁,BUG很少,同时,Jexus的每个版本在正式发布之前,都要经过严格的压力测试,影响稳定性的因素,几乎在正式发布之前即已被全部排除。
- 功能强大:Jexus支持URL重写,支持多目标服务器的反向代理,支持PHP,支持GZIP压缩传输,并且,可以利用不同端口、不同虚拟路径、不同域名设置任意数量的网站,这些功能要素,表明了Jexus是一款功能完整而强劲的WEB服务器。
- 安装、配置、操作极为简单,服务社区化,各种问题能得到快速的处理,有良好的后续服务支撑能力。
本文是在Windows Azure云平台上 使用CentOS 6.3 + Mono 3.2 + Jexus 5.4 的安装简要教程:
一、更新系统,安装编译环境,为编译Mono源码做准备。Mono 3.2的源码编译要求系统中存在一个Mono 2.4以上的环境,所以我们按照《32和64位的CentOS 6.0下 安装 Mono 2.10.8 和Jexus 5.0》这篇文章编译安装完成2.10.8 环境,下面我简要列一下:
1、 更新系统
yum –y update
2、安装Mono源码安装需要的库
yum -y install gcc gcc-c++ bison pkgconfig glib2-devel gettext make libpng-devel libjpeg-devel libtiff-devel libexif-devel giflib-devel libX11-devel freetype-devel fontconfig-devel cairo-devel
在执行yum 更新系统的时候就发生了如下错误:
--> Running transaction check ---> Package gc.x86_64 0:7.1-10.el6 will be installed ---> Package glibc-headers.x86_64 0:2.12-1.80.el6_3.5 will be installed --> Processing Dependency: kernel-headers >= 2.2.1 for package: glibc-headers-2. 12-1.80.el6_3.5.x86_64 --> Processing Dependency: kernel-headers for package: glibc-headers-2.12-1.80.e l6_3.5.x86_64 --> Finished Dependency Resolution Error: Package: glibc-headers-2.12-1.80.el6_3.5.x86_64 (updates) Requires: kernel-headers Error: Package: glibc-headers-2.12-1.80.el6_3.5.x86_64 (updates) Requires: kernel-headers >= 2.2.1 You could try using --skip-broken to work around the problem ** Found 1 pre-existing rpmdb problem(s), 'yum check' output follows: kernel-2.6.32-220.13.1.el6.x86_64 has missing requires of kernel-firmware >= ('0 ', '2.6.32', '220.13.1.el6')
解决方法:修改文件vi /etc/yum.conf 将exclude=kernel*前加注释即可解决,此参数的意思是排除安装或更新kernel开头的软件,而我们安装gcc需要依赖kernel相关的软件glibc-headers-2.12-1.80.el6_3.5.x86_64 。
3、安装Mono需要的GDI+兼容API的库Libgdiplus
cd /usr/local/src/
wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.tar.bz2
tar -jxvf libgdiplus-2.10.tar.bz2
cd libgdiplus-2.10
./configure --prefix=/usr
make
make install
4.1、源码安装Mono
cd /usr/local/src/
wget http://download.mono-project.com/sources/mono/mono-3.2.1.tar.bz2
tar -jxvf mono-3.2.1.tar.bz2
./configure --prefix=/usr
make
make install
输入 mono -V 如有mono版本信息,则安装成功.
4.2、Git安装 mono
cd /usr/local/src/
wget http://download.mono-project.com/sources/mono/mono-2.10.8.tar.bz2
tar -jxvf mono-2.10.8.tar.bz2
cd mono-2.10.8
./configure --prefix=/usr
make
make install
输入 mono -V 如有mono版本信息,则安装成功.
如果是64位版本的CentOS,在后续安装好Jexus 5,启动的时候会发生以下错误:
Sender: jws.exe, Sender TypeName: AppDomain
Exception Source: jws, TargetSite Name: A
Message is:
An exception was thrown by the type initializer for Mono.Unix.Native.Stdlib
StackTrace is:
at A.G.A (System.String[] A) [0x00000] in <filename unknown>:0
IsTerminating: True
建议你运行下命令ldconfig,建议大家在安装mono后,都 ldconfig一下 。(ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如前介绍,lib*.so*),进而创建出动态装入程序(ld.so)所需的连接和缓存文件.缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表. )
另外有一点也非常重要,要在编译Mono的是指定安装到/usr(./configure --prefix=/usr),如果安装到一个系统根本"不了解"的文件夹,仅ldconfig都不行,还要在/etc/ld.so.conf文件或/etc/ld.so.conf.d 中添加路径后再 ldconfig才行呢。
二、源码编译mono 升级到最新3.2 版本,我这里用了Git方式安装,从Mono的主干上拉下来的代码编译后是3.3版本:
安装前把mono所需的依赖包安装好:
yum –y install build-essential automake autoconf libtool bison libglib2.0-dev libfreetype6-dev libfontconfig-dev gettext libgif-dev libtiff4-dev libpng12-dev libexif-dev libx11-dev libxft-dev libjpeg-dev
git clone git://github.com/mono/mono.git
./autogen.sh --prefix=/usr [要注意目标文件夹,一定要指定同一个地方,强烈建议用 --prefix=/usr 参数]
make
编译完后,进入安装mono 2.10.8 的源文件夹,以管理员身份运行 “make uninstall”。
cd /usr/local/src/mono-2.10.8
sudo make uninstall
然后进入mono-3.2.0 目录
sudo make install
运行mono -V命令就可以看下下面的结果表示安装成功:
三、安装Jexus 5.4 :从5.3.1版本开始,Jexus的安装过程简化了,内置了两个新的脚本,它们分别是“install”和“upgrade”,对应原来的“安装”和“升级”,将Jexus的安装过程自动化了。jexus本身的安装和升级方式并没有发生更多的变化,因此对于已经习惯于5.3.1之前版本的使用方式的用户,你们仍然可以采用之前的安装方式。
wget http://www.linuxdot.net/down/jexus-5.4.tar.gz
tar -zvxf jexus-5.4.tar.gz
cd jexus-5.4
sudo ./install
安装完成~!!!在执行install脚本时,jexus默认是安装到/usr/jexus/中,如果想安装到其他目录,可以在执行该脚本时增加一个目录的参数(比如 sudu install /usr/local/jexus/)。对于升级就是执行upgrade脚本。
启动jexus 检查是否正常了
cd /usr/jexus
sudo ./jws start
看到了Jexus已经成功启动的日志,我们还可以通过浏览器来检查下:http://mono.cloudapp.net/info
四、放一个网站上去测试下,我这里放个小泥鳅的Mono兼容代码版本上去,可以从这里获取https://github.com/geffzhang/LoachsMono
使用VS编译后通过Winscp 上传到服务器,具体可以参看《使用WinSCP软件在windows和Linux中进行文件传输》。
访问http://mono.cloudapp.net/ 就可以看到我们的成功了: