mono 2.2 終於推出正式版了 號稱支援 ASP.NET 3.5 , LINQ , 且可以跑 ASP.NET MVC 嘿嘿嘿 ,心很癢 .. 但由於我家濫 CentOS 5.2 我覺得它應該不會那麼快就提供 2.2 版的 mono 套件 , 所以只好自己來手動編譯了 ~
首先要到官方網站的下載區下載原始碼來編譯
網址是 http://ftp.novell.com/pub/mono/sources-stable
我下載了以下套件
mono-2.xx.tar.bz2 是 mono 主要套件 , 有編譯器 , 主要的 .Net 物件等等 , 但是並不包含 ASP.NET 的 Web Server
xsp-2.xx.tar.bz2 是提供 ASP.NET 服務的套件
mod_mono-2.xx.tar.bz2 是 for apache 模組的 , 讓 apache 能夠和 XSP 服務溝通
由於我的 Server 本身已經有安裝舊版的 RPM 套件 , 所以我打算把新版的全部裝到 /usr/local/ 來測試
1. 安裝 mono
解開 mono-2.xx.tar.bz2 後下指令 ./configure --prefix=/usr/local , 它會幫你檢查套件是否有缺東缺西以及初始設定 若沒問題 , 下指令 make
make 的時間很長 , 比編譯 mysql 或 apache 之類的久的多 , 這中間過程我是都沒有錯誤 , 運氣似乎還不錯 ^^
最後下 make install 進行安裝 若一切順利 , 可以打 /usr/local/bin/mono -V 看看版本 , 像我家的爛 Server 會出現如下字樣 , 版本對了是
Mono JIT compiler version 2.2 (tarball 二 1月 27 19:16:11 CST 2009) Copyright (C) 2002-2008 Novell, Inc and Contributors. www.mono-project.com TLS: __thread GC: Included Boehm (with typed GC) SIGSEGV: altstack Notifications: epoll Architecture: amd64 Disabled: none
2. 安裝 XSP
如同安裝 mono 一樣的方法 , 先下 ./configure --prefix=/usr/local 之後下 make , 編譯期間這裡卻發生了錯誤訊息 我會出現如下訊息
make[2]: Entering directory `/usr/local/src/xsp-2.2/test’ /usr/local/bin/mcs -pkg:dotnet -r:System.Xml.dll -target:library -out:SiteMapReader_1.1.dll SiteMapReader_1.1.cs Package dotnet was not found in the pkg-config search path. Perhaps you should add the directory containing `dotnet.pc’ to the PKG_CONFIG_PATH environment variable No package ‘dotnet’ found error CS8027: Error running pkg-config. Check the above output. make[2]: *** [SiteMapReader_1.1.dll] Error 1 make[2]: Leaving directory `/usr/local/src/xsp-2.2/test’ make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory `/usr/local/src/xsp-2.2/test’ make: *** [all-recursive] Error 1
看樣子 , pkg-config 檢查套件找不到 , 後來我在 /usr/local/lib/pkgconfig 發現一堆檔案 , 因為預設的 pkg-config 是會找 /usr/lib/pkgconfig 或 /usr/lib64/pkgconfig 下的檔案 , 但因為剛剛安裝 mono 時是安裝在 /usr/local/ 下 , mono 則把 pkg-config 需要檔案安裝在 /usr/local/lib 下了 , 因此預設的情形下 pkg-config 是找不到 mono 的相關檔案 , 因此要自己設定 PKG_CONFIG_PATH 這個參數然後編譯 , 於是我下了如下的指令
PKG_CONFIG_PATH=/usr/local/lib/pkgconfig make
編譯看來似乎沒問題了 , 然後下 make install , YA 終於安裝成功啦 ^^
3. 安裝 mod_mono
一開始看 mod_mono 的 INSTALL 文件有提到 , 需要 apache devel 套件 , 在 RedHat 系列下的 apache devel 都是叫 httpd-devel , 於是我用 yum install httpd-devel 先安裝好 , 安裝完成後再來安裝 mod_mono 一樣如法炮製 , 解壓後進入 mod_mono 的原始碼目錄下
接著下指令 ./configure --prefix=/usr/local --with-apxs=/usr/sbin/apxs
沒問題後 , 下指令 make 進行編譯 , 這中間我又運氣好又沒出錯了 , 哈
最後下指令 make install 進行安裝 , 預設 mod_mono 會將 mod_mono.so 安裝在 /etc/httpd/modules 下 , 但若是 RPM舊版的會安裝在 /usr/lib(64)/httpd/modules/ 中 , 所以舊版的還有保留就是了
4. 修改 Apache 設定檔
最後 , 要修改 Apache 設定檔以支援 ASP.NET 服務 , 如果一開始就有安裝 RPM 版本的 mod_mono , 應該 /etc/httpd/conf.d 下就已經有了 mod_mono.conf 這個檔案 , 但若沒有則可以自行建立 , 而我的設定檔內容如下 , 有注解的是之前舊版所寫的
<IfModule !mod_mono.c>
# RPM Version
# LoadModule mono_module /usr/lib64/httpd/modules/mod_mono.so
LoadModule mono_module modules/mod_mono.so
MonoUnixSocket /tmp/.mod_mono_server2
# RPM Version
# MonoServerPath /usr/bin/mod-mono-server2
MonoServerPath /usr/local/bin/mod-mono-server2
MonoAutoApplication enabled
AddType application/x-asp-net .aspx
AddType application/x-asp-net .asmx
AddType application/x-asp-net .ashx
AddType application/x-asp-net .asax
AddType application/x-asp-net .ascx
AddType application/x-asp-net .soap
AddType application/x-asp-net .rem
AddType application/x-asp-net .axd
AddType application/x-asp-net .cs
AddType application/x-asp-net .config
AddType application/x-asp-net .Config
AddType application/x-asp-net .dll
DirectoryIndex index.aspx
DirectoryIndex Default.aspx
DirectoryIndex default.aspx
</IfModule>
修改設定檔之後 , httpd 服務先關了 , 然後啟動 , 這時候用 ps aux 觀察行程會發現有跑一個 /usr/local/bin/mono /usr/local/lib/mono/2.0/mod-mono-server2.exe , 這樣就 OK 了 , 若沒有 , 就要查看看 apache 的 error log 看看是不是目錄設定錯誤 , 由這個行程來看 , 這個程式是 .NET 的執行檔而非純二進制的檔案
這個 mod-mono-server2 是 XSP 套件所提供的一個小型 web server for apache , 專責跑 ASP.NET , 而 mod_mono 則是為了要與 mod-mono-server2 作溝通的模組 , XSP也有另外提供 Fast-CGI 版本及獨立的 web server 可單獨跑 ASP.NET 不必透過 Apache , 但不知道效能如何就是了
最後我在 http://aspnet.pigo.idv.tw/上放了個測試程式來跑 .... 好高興 .. 可以跑了 , 基本的按鈕事件也抓得到 先研究到這裡 , 我還不確定到底 ASP.NET 3.5 新東西如 LINQ 能不能跑 , 就先研究到這 , 有心得再補上來囉
另外我用 apache 的 ab 來測試效能 , 比 mod_php 跑簡單的 hello world 快了兩倍(我還裝了 xcache 來加速) , 測試數據如下 :
[root@linux1 tmp]# ab -c 10 -n 100 http://aspnet.pigo.idv.tw/hello.php This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright 2006 The Apache Software Foundation, http://www.apache.org/ Benchmarking aspnet.pigo.idv.tw (be patient)…..done Server Software: Apache/2.2.3 Server Hostname: aspnet.pigo.idv.tw Server Port: 80 Document Path: /hello.php Document Length: 325 bytes Concurrency Level: 10 Time taken for tests: 0.25904 seconds [root@linux1 tmp]# ab -c 10 -n 100 http://aspnet.pigo.idv.tw/hello.aspx This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/ Copyright 2006 The Apache Software Foundation, http://www.apache.org/ Benchmarking aspnet.pigo.idv.tw (be patient)…..done Server Software: Apache/2.2.3 Server Hostname: aspnet.pigo.idv.tw Server Port: 80 Document Path: /hello.aspx Document Length: 317 bytes Concurrency Level: 10 Time taken for tests: 0.113447 seconds
看來 mono + apche 跑 ASP.NET 還不賴說 , 有空再來測試比較複雜的程式 , 看看 PHP 是不是可以追上來