在 Ubuntu Server 上安裝配置 Mono 生產環境
在 Ubuntu Server 上安裝和配置 Apache2 + Mono 生產環境的記錄。 服務器環境是 Ubuntu Server 13.04 虛擬機模式 (Virtual Machine Mode), 安裝的 Mono 的版本是 3.2.1 , 最終環境如下圖所示:
準備編譯環境
還是老話題, 先準備 GCC 編譯環境, 這樣才可以從源代碼編譯安裝所需要的軟件。 首先需要安裝的是基本的編譯工具, 只要輸入下面的命令即可:
sudo apt-get install g++ gettext autoconf
接下來輸入用戶名和密碼, 就可以自動安裝必須的命令行編譯工具了。
從源代碼編譯安裝 libgdiplus
對于服務器來說, 主要運行 Apache、 ASP.Net、 Mvc 以及 WCF 等服務端程序, 一般不會運行圖形界面, 因為圖形界面會消耗額外的內存和處理器資源, 所以說 libgdiplus 不是必須安裝的, 不過一個常見的場景是需要在服務端動態生成圖片, 也會用到 libgdiplus , 因此 libgdiplus 還是推薦安裝的。 如果服務器上不需要生成圖片, 則可以不用安裝 libgdiplus 。
先安裝編譯 libgdiplus 所需的依賴項, 輸入下面的命令:
sudo apt-get install libglib2.0-dev libpng12-dev libexif-dev libx11-dev libfreetype6-dev libfontconfig1-dev libjpeg62-dev libgif-dev libxrender-dev
下載 libgdiplus 最新版的源代碼:
wget https://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.9.tar.bz2
下載完成之后解壓, 并且換到源代碼的目錄:
tar -jxvf libgdiplus-2.10.9.tar.bz2
cd libgdiplus-2.10.9
配置并檢查 libgdiplus 的編譯選項:
./configure
這是最關鍵的步驟, 如果 configure 命令中途出錯, 則一般是缺少了某個依賴的庫, 只要根據提示安裝相應的依賴庫就可以了, configure 命令運行結果如果如下圖所示, 則表示可以進行下一步了:
上圖中的配置結果不支持 tiff , 因為在服務端動態生成 tiff 圖片的需求很小, 所以這個 tiff 可以直接忽略了, 如果需要生成 tiff, 只要安裝 libtiff-dev 再次執行 configure 命令即可。
接下來接著輸入下面的命令就可以編譯并安裝 libgdiplus 了:
make
sudo make install
常見問題:
如果在 make 的過程中出現類似如下錯誤:
Making all in pixman
make[4]: Entering directory `/usr/local/src/libgdiplus-2.10.9/pixman/pixman'
source='pixman-access.c' object='pixman-access.lo' libtool=yes \
DEPDIR=.deps depmode=none /bin/sh ../depcomp \
/bin/sh ../libtool --tag=CC --mode=compile gcc -DHAVE_CONFIG_H -I. -I.. -g -O2 -Wall -fvisibility=hidden -c -o pixman-access.lo pixman-access.c
../libtool: line 852: X--tag=CC: command not found
../libtool: line 885: libtool: ignoring unknown tag : command not found
../libtool: line 852: X--mode=compile: command not found
../libtool: line 1018: *** Warning: inferring the mode of operation is deprecated.: command not found
../libtool: line 1019: *** Future versions of Libtool will require --mode=MODE be specified.: command not found
../libtool: line 1162: Xgcc: command not found
../libtool: line 1162: X-DHAVE_CONFIG_H: command not found
../libtool: line 1162: X-I.: command not found
../libtool: line 1162: X-I..: command not found
../libtool: line 1162: X-g: command not found
../libtool: line 1162: X-O2: command not found
../libtool: line 1162: X-Wall: command not found
../libtool: line 1162: X-fvisibility=hidden: command not found
../libtool: line 1162: X-c: command not found
../libtool: line 1214: Xpixman-access.lo: command not found
../libtool: line 1219: libtool: compile: cannot determine name of library object from `': command not found
make[4]: *** [pixman-access.lo] Error 1
make[4]: Leaving directory `/usr/local/src/libgdiplus-2.10.9/pixman/pixman'
make[3]: *** [all-recursive] Error 1
make[3]: Leaving directory `/usr/local/src/libgdiplus-2.10.9/pixman'
make[2]: *** [all] Error 2
解決方法是輸入下面的命令, 然后再繼續執行 make 命令:
export echo=echo
如果出現類似這樣的錯誤:
/usr/lib64/libglib-2.0.so.0: could not read symbols: Invalid operation
collect2: error: ld returned 1 exit status
make[2]: *** [testgdi] Error 1
make[2]: Leaving directory `/usr/local/src/libgdiplus-2.10.9/tests'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/local/src/libgdiplus-2.10.9'
make: *** [all] Error 2
解決方法是:
先執行 ./configure 命令, 然后編輯 test/Makefile 文件;
將 130 行的 LIBS = -lpthread -lfontconfig 改為 ` LIBS = -lpthread -lfontconfig -lglib-2.0 -lX11`;
再次執行 make 命令即可。
最終, 在 make 命令執行成功之后, 在繼續執行 sudo make install 命令進行安裝。
從源代碼編譯安裝 mono 、 xsp
安裝好了 libgdiplus 之后, 接下來的 mono 和 xsp 就是一路順風了, 只要簡單的敲幾行命令就可以了:
wget https://download.mono-project.com/sources/mono/mono-3.2.3.tar.bz2
tar -jxvf mono-3.2.3.tar.bz2
cd mono-3.2.3
make
sudo make install
wget https://download.mono-project.com/sources/xsp/xsp-2.10.2.tar.bz2
tar -jxvf xsp-2.10.2.tar.bz2
cd xsp-2.10.2.tar.bz2
make
sudo make install
執行上面的命令, 一般都不會出現什么錯誤了。 現在可以測試一下安裝的 mono 和 xsp , 在終端輸入:
mono --version
可以得到如下圖的提示:
編譯安裝 xsp 之后, 會在 /usr/local/lib/xsp/test 目錄下生成一個 .net 測試網站, 我們可以用這個測試站點來測試 mono + xsp 的安裝, 輸入下面的命令:
cd /usr/local/lib/xsp/test
ls
xsp
可以看到的命令行輸出如下:
打開瀏覽器, 訪問服務器的 8080 端口, 可以看到的如下的畫面, 說明 mono + xsp 已經安裝成功了。
安裝 apache2 和 apache2-dev
前面已經安裝好了 mono + xsp , 用來測試應用的話足夠了, 但是不能做為服務器生產環境使用, 因此還需要繼續安裝 apache http server , 并將 mono 做為 apache 的模塊掛載上去。 Apache http server 我們選擇從 Ubuntu Server 的軟件倉庫中安裝, 只要輸入下面的命令即可:
sudo apt-get install apache2 apache2-prefork-dev apache2-threaded-dev
第一個軟件包是 Apache Http 服務器, 另外兩個是 Apache 的開發包, 接下來要安裝的 mod_mono 依賴這兩個開發包, 因此一并安裝。
從源代碼編譯安裝 mod_mono
現在, 安裝 mod_mono 也是非常簡單的:
wget https://origin-download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2
tar -jxvf mod_mono-2.10.tar.bz2
cd mod_mono-2.10
./configure
make
sudo make install
這個一般也不會出現什么錯誤, 基本上都能正確安裝。
配置 apache2 和 mod_mono
現在, 可以說萬事具備, 只欠東風, 只要將 mod_mono 配置并加載到 apache 中就可以了, apache 在 Ubuntu Server 上的配置目錄是 /etc/apache2 , 在編譯安裝 mod_mono 的時候, 已經將 mod_mono.conf 復制到這個目錄了, 我們只要修改 apache2 的配置, 引用這個文件即可, /etc/apache2 的目錄結構如下:
通過查看 /etc/apache2/apache2.conf 文件可以知道各個目錄的含義, 只要在 /etc/apache2/mods_enabled 目錄新建一個鏈接文件, 指向 /etc/apache2/mod_mono.conf 即可加載 mod_mono , 切換到 /etc/apache2/mods-enabled 目錄, 輸入下面的命令添加鏈接:
cd /etc/apache2/mod-enabled
sudo ln -s ../mod_mono.conf ./mod_mono.conf
現在輸入 ls -l /etc/apache2/mods-enabled/mod_*.conf , 輸出如下所示:
ls -l /etc/apache2/mods-enabled/mod_*.conf
lrwxrwxrwx 1 root root 16 Sep 6 13:34 mod_mono.conf -> ../mod_mono.conf
看到有 mod_mono.conf -> ../mod_mono.conf 的輸出提示, 說明鏈接鏈接已經做好了, 重啟 Apache 服務就會加載 mod_mono 。
有興趣的可以輸入命令 more /etc/apache2/mod_mono.conf 查看一下這個文件的內容, 看是不是很熟悉的 aspx 、 asmx 、 ashx 等都出現了。
現在在默認站點下添加一個名為 MonoTest 的測試程序, 需要編輯 /etc/apache2/sites-available/default 文件, 在文件的最后, CustomLog 指令之前, 插入下面的配置:
Alias /MonoTest "/usr/local/lib/xsp/test"
MonoServerPath MonoTest "/usr/bin/mod-mono-server2"
MonoDebug MonoTest true
MonoSetEnv MonoTest MONO_IOMAP=all
MonoApplications MonoTest "/MonoTest:/usr/local/lib/xsp/test"
Allow from all
Order allow,deny
MonoSetServerAlias MonoTest
SetHandler mono
SetOutputFilter DEFLATE
SetEnvIfNoCase Request_URI "\.(?:gif|jpe?g|png)$" no-gzip dont-vary
AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript
保存并關閉這個文件, 然后輸入下面的命令重啟 Apache2 服務:
sudo service apache2 restart
然后再次打開瀏覽器, 輸入地址: https://server-name-or-address/MonoTest , 看到類似下面的畫面就大功告成了:
當然, 一切只是個開始, 接下來將繼續測試 ASP.Net MVC 、 EntityFramework 、 NHibernate 等常用組件在 Mono 上的表現。
參考資料