近期由于一个项目需要,进行了将ASP.NET网站部署在Linux下的调研,并做了一些DEMO来进行测试。最后由于客户不接受在Linux上跑.net程序,我们的工作也只能做到这一步。记录在此,以便后续需要时好查阅。
由于我们项目使用了文件依赖缓存、推技术,故调研中对这些技术在Linux下是否能稳定运行有较多关注。
在此之前我们对于Linux的经验甚少,如果此文描述有错误之处,欢迎各位批评指正。
一:方案思路
采用在Linux环境下运行现有的***平台[.NET],数据库采用Oracle 10g。
***目前于Windows平台上能稳定运行,我们可以使用Mono,通过一些代码及架构调整将***平台稳定、高效运行于Linux系统下。
二:Mono简介
Mono是一个由Novell公司(由Ximian发起,并由Miguel de lcaza 领导的,一个致力于开创.NET在Linux上使用的开源工程。它包含了一个C#语言的编译器,一个CLR的运行时,和一组类库,并实现了 ADO NET和ASP NET。能够使得开发人员在Linux用C#开发程序。)主持的项目.
该项目的目标是创建一系列符合标准ECMA (Ecma-334和Ecma-335)的.Net工具, 包括C #编译器和共同语言(CL即 Common Language)执行平台(Platform).与微软的.Net不同, Mono项目不仅可以运行于Windows系统内,还可以运行于Linux, FreeBSD, Unix, Mac OS X和Solaris。
首页:
http://www.mono-project.com/Main_Page
三:Mono应用案例
目前Mono已经被国内外广泛使用,以下提供几个案例以做参考:
1. 中天证券
2. 东北师大附中
3. 四川省蓬溪县人民政府
以上案例涵盖证券、教育、政府等多个行业。
以下是Mono官网上提到的众多使用Mono的成功案例:
http://www.mono-project.com/Software
四:运行环境
Linux + apache2.2 + Mono2.10.8.1 + Oracle 10g,所使用的.net匹配版本为2.0版。
目前测试的Linux平台是Ubuntu,其他主流Linux下同样支持,部署方法大同小异。
Web服务器不局限于apache,可以换用Nginx,或者是咱们国人开发的Jexes,这几大Web服务器是目前使用较为广泛,性能较好的几个选择。
五:Linux下部署Mono与Apache
相关文章参考:
http://www.cnblogs.com/hcl0208/archive/2010/10/25/1860173.html
http://www.cnblogs.com/andhm/archive/2012/08/02/2619680.html
http://www.guanwei.org/post/LINUXnotes/01/ubuntuapache2configure.html
1. 安装apache2
apt-get install apache2
2. 安装Mono
使用的在界面上安装的办法,如果使用命令:
apt-get install mono-gmcs mono-xsp2
apt-get install libapache2-mod-mono
apt-get install mono-apache-server2
sudo a2enmod mod_mono
3. 配置mono运行库
1)修改配置文件./etc/apache2/mods-available/mod_mono.conf 以达到可以显示控件
DirectoryIndex index.aspx
增加如下两行
MonoAutoApplication enabled
MonoServerPath "/usr/bin/mod-mono-server2"
2). 重启apache
sudo /etc/init.d/apache2 restart
4. 设置忽略大小写 [Ubuntu下]
在/etc/apache2/mods-enabled
1). 增加speling.conf
内容:CheckSpelling on
2). 增加 speling.load
内容:LoadModule speling_module /usr/lib/apache2/modules/mod_speling.so
5. apache设置虚拟目录
在 /etc/apache2下修改apache2.conf,在最后增加:
Alias /monotest/ "/var/www/monotest/"
<Directory "/var/www/monotest">
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>
六:Linux下安装Oracle XE 10g及访问
1. 安装Oracle XE 10g
1). 下载oracle-xe-universal_10.2.0.1-1.0_i386.deb
2). 执行sudo dpkg -i oracle-xe-universal_10.2.0.1-1.0_i386.deb
3). 编辑/etc/profile,增加如下:
export ORACLE_HOME=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server
export LD_LIBRARY_PATH=/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/lib
PATH=$LD_LIBRARY_PATH:$PATH:
export PATH
启动oracle xe 10g
sudo /etc/init.d/oracle-xe restart
2. 在Linux上安装Oracle XE 10g客户端
1). 下载oracle-xe-client_10.2.0.1-1.0_i386.deb
2). 执行sudo dpkg -i oracle-xe-client_10.2.0.1-1.0_i386.deb
3). 编辑/var/bin/mod-mono-server2,增加如下:
export LD_LIBRARY_PATH=/usr/lib/oracle/xe/app/oracle/product/10.2.0/client/lib:$LD_LIBRARAY_PATH
export NLS_LANG=AMERICAN_AMERICA.UTF8
重启apache
sudo /etc/init.d/apache2 restart
注:之所以采用下载离线安装包的办法,是因为在我家里的网络中,没有办法访问oracle的软件源信息。
下载地址如下:
http://115.com/355054741
七:Linux设置文件共享及缓存访问
1. 在共享服务器上安装nfsserver
sudo aptitude install nfs-kernel-server
2. 在访问客户机上安装client
sudo apt-get install nfs-common
3. 在服务器上添加共享的目录【设置好读写权限】
/home/web/sharedirtest 192.168.2.179(rw,sync,no_subtree_check)
4. 在服务器上启动NFS服务
sudo exportfs -r
sudo /etc/init.d/portmap restart
sudo /etc/init.d/nfs-kernel-server restart
5. 在客户机上加载此共享的目录
$sudo mount 主机IP:/home/yourname/sharedir ~/nfsshare
注意,nfsshare必须先存在
6. 读写缓存中的注意点。
mount目录后,即可按本地路径一样来进行使用,需要注意的是:缓存指定的文件需要有读写权限[chmod 777 dir -R],否则缓存无响应
另:通过共享目录的缓存,可能会有延迟。
可以采用两种方案:
1.oracle写本地文件, web读加载的共享目录
2.web读本地文件, oracle写加载的共享目录
测试发现在monodevelop下编译的访问共享的缓存正常,但WIN下编译的不生效
八:其他
设置开机启动:
sudo /etc/init.d/oracle-xe enable
添加连接文件:
sudo ln -s /etc/apache2/sites-available/chaichunyan /etc/apache2/sites-enabled/chaichunyan
注:
在apache的设置中,可以将配置放在任何一个文件中,只是为了便于管理,建议还是各自分开配置。
将相关的模块放于available中,需要启用时,在enable中添加链接即可。
mono下通过调用存储过程时构造参数的异常:
OracleParameter para = new OracleParameter("test", OracleType.Varchar);
会报异常,提示未将对象设置到实例:
http://mono.1490590.n4.nabble.com/System-Data-OracleClient-OracleParameter-SetOracleType-bug-td3855825.html[[BR]]
处理办法:
OracleParameter para = new OracleParameter();
para.ParameterName = "cur_OUT";
para.Value = 1;
para.OracleType = OracleType?.Cursor;
提供了一个测试的DEMO,可以在此下载:http://download.csdn.net/detail/tragicguy/5430001