開始玩 mono 2.2 ASP.NET 3.5

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 是不是可以追上來

發佈留言