近期由於一個項目需要,進行了將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