【題外話】
閑的無聊竟然想嘗試測試自己做的項目在不同操作系統上的性能表現,所以決定試試在Linux上部署Apache和Mono的環境。由于平時很少接觸Linux,所以從網上找了幾篇文章(附在相關鏈接中)嘗試,部署的過程也并非一帆風順,所以就根據自己在Azure上配置的情況重新進行了整理,希望對很少接觸Linux的同學有所幫助。以下所有操作均在Azure上的虛擬機里配置,如果在本地或者虛擬機里配置,可能首先還需要配置網卡設置等。
【文章索引】
Ubuntu Server安裝以后,默認沒有圖形界面,其實在Linux不用圖形界面也很容易就可以進行配置。在Azure上配置好Ubuntu Server(這里使用Azure上提供的Ubuntu Server 12.04 LTS,2013/6/24)以后,會自動配置好SSH的22端口,我們可以直接使用SSH工具連接服務器,這里使用免費開源的PuTTY(http://www.putty.org/)。如果在Azure上配置的使用密碼連接主機則這里直接輸入地址點擊“Open”即可,如果還上傳了SSH密鑰,則還應在Connection/SSH/Auth里選擇對應的密鑰才可以連接。
連接后輸入設置的用戶名和密碼即可登錄Ubuntu系統,會出現如下圖的命令行,我們所做的幾乎所有工作都是通過命令行操作的。
在Ubuntu下安裝軟件其實非常方便,Ubuntu提供了apt-get工具,可以使用該工具直接下載安裝軟件。
在Linux里,系統最高權限賬戶為root賬戶,而默認登錄的賬戶并非root賬戶,例如不具備安裝程序等權限,不過同Windows一樣都提供了提升權限的方式,就是sudo命令,在執行的每條命令前加上“sudo ”,即可以root賬戶的權限執行。在第一次使用sudo時會要求輸入當前賬戶的密碼,確認后即可在一段時間(默認5分鐘)內使用sudo命令都不需要輸入密碼,一段時間沒有使用后則需要重新輸入密碼。
首先我們安裝Apache,輸入下列命令,之后會提示是否安裝等,輸入Y繼續。軟件包詳情:http://packages.ubuntu.com/quantal/apache2
sudo apt-get install apache2
等待一段時間后,Apache就會自動安裝配置好,這時候可以配置好Azure上的80端口,配置好后使用瀏覽器訪問服務器的地址可以看到如下圖的提示,說明安裝成功。
Linux有個開源的.NET運行時,叫做Mono(http://www.mono-project.com/),可以支持在Linux上運行.NET應用程序。
仍然按上述方法輸入下列命令安裝Mono及C#編譯器,軟件包詳情:http://packages.ubuntu.com/quantal/mono-gmcs
sudo apt-get install mono-gmcs
安裝完后可以輸入“mono -V”查看安裝的mono的版本(注意V是大寫的),當然也可以寫個C#的ConsoleApp看看,可以用下列命令編譯C#代碼。
gmcs test.cs
如果程序沒有問題的話則會生成test.exe,可以通過如下命令執行。當然也可以在Windows上編譯好exe文件后復制到Linux上執行也是可以的。
mono test.exe
接下來根據自己需要的版本選擇安裝Apache對ASP.NET 2.0或者ASP.NET 4.0的支持,mono-apache-server2為ASP.NET 2.0的支持,mono-apache-server4是ASP.NET 4.0,兩者可以同時存在,切換需要在Apache的配置文件中切換。軟件包詳情:http://packages.ubuntu.com/quantal/mono-apache-server2
sudo apt-get install mono-apache-server2
不知道為什么,安裝到最后會卡在這個地方
只能通過Ctrl+Z強制退出,然后輸入“sudo reboot”重啟服務器,不過Linux服務器很快就能重啟完
之后再安裝Apache的模塊libapache2-mod-mono即可。當然,mono-gmcs、mono-apache-server2、libapache-mod-mono都是可以一起安裝的,不過要注意mono-apache-server2和libapache-mod-mono的順序,如果mono-apache-server2在libapache-mod-mono之后的話,由于依賴項的原因,libapache-mod-mono會現在自動選擇安裝mono-apache-server4。而且,如果一起裝的話,在上述卡住的位置Ctrl+Z重啟后,libapache-mod-mono并沒有配置完成導致很多操作無法執行,還需要執行“sudo dpkg --configure -a”這句命令才行。軟件包詳情:http://packages.ubuntu.com/quantal/libapache2-mod-mono
sudo apt-get install libapache2-mod-mono
不過安裝完如果打開網站發現還是無法執行,其實是沒有配置ASP.NET應用程序。雖然現在支持自動配置應用程序,但是還是需要修改/etc/apache2/mods-available/mod_mono.conf文件。(原文見:http://www.mono-project.com/AutoConfiguration)當然如果你會手動配置應用程序的話也可以在該文件中手動配置應用程序(下同)。
sudo vim /etc/apache2/mods-available/mod_mono.conf
按鍵盤上的i鍵啟用vim的編輯模式,由于mono-server2-hosts.conf文件中已經對很多參數進行了配置,所以僅需要按圖中的添加“MonoAutoApplication enabled”一行即可。此外,如果你的網站中還有其他的文件格式(比如HttpHandler經常使用.axd),請添加在第一行后邊,另外如果網站默認文件不是index.aspx還需要修改第二行后的文件名。注意,由于Linux是區分大小寫的,所以切記不要把大小寫搞錯。
如果服務器上還安裝了ASP.NET 4.0的支持(mono-apache-server4),并且需要切換到ASP.NET 4.0,那么僅需要修改最后一行,將2改為4即可。
修改完后按Ctrl+C結束編輯模式,然后按冒號鍵(:)進入命令模式,輸入w保存文件,然后再次按冒號鍵,再按q鍵退出vim。
最后執行下述命令重啟Apache服務器即可。
sudo /etc/init.d/apache2 restart
在Windows上部署網站可以通過遠程桌面直接把網站或打包好的網站復制過去,在Linux下其實SSH不光可以支持命令行,還可以支持文件傳輸,我這里使用免費開源的Filezilla(https://filezilla-project.org/),Filezilla支持FTP和SSH兩種協議,在站點管理器中選擇SFTP協議,然后把登陸類型設置為正常,輸入用戶名和密碼即可登錄。
登錄后默認的路徑為/home/用戶名/,就跟命令行下默認的目錄一致。Apache的默認路徑在/var/www/,可以在這之下找到index.html,也就是那個“It works”的網頁。不過這個目錄一般用戶的權限為無法寫入,所以無法將網站直接部署到這個目錄下。當然你可以在PuTTY下將這個目錄的權限修改后再上傳,不過其實還可以有更簡單的方式,就是將打包文件上傳到用戶目錄下然后再解壓縮到這個目錄下。
首先安裝zip解壓縮程序,軟件包詳情:http://packages.ubuntu.com/quantal/zip
sudo apt-get install zip
然后將需要上傳的網站打包為zip文件,然后上傳到用戶目錄下(/home/用戶名/),然后在命令行中輸入就可以了。
sudo unzip 壓縮文件名.zip -d /var/www
當然,現在用你的瀏覽器訪問你的服務器地址仍然是“It works”,我們還要刪除index.html就可以了。
sudo rm /var/www/index.html
不同的系統使用不同的軟件包管理程序,SUSE則提供了一個叫zypper的軟件包管理程序,使用也非常方便(這里使用的openSUSE是Azure上提供的openSUSE 12.3)。
首先是安裝Apache。
sudo zypper install apache2
與Ubuntu安裝過程不同的是,在安裝完成后并沒有啟動Apache的提示。所以還需要手動配置服務自啟動。
sudo systemctl enable apache2.service
然后立即啟動Apache。
sudo systemctl start apache2.service
現在用瀏覽器就可以訪問服務器了。
然后使用zypper安裝Mono了(其中System.Drawing會用到libgdiplus,多語言支持會用到mono-locale-extras,不過即使如此還有部分組件沒有安裝,后邊會說明):
sudo zypper install mod_mono libgdiplus mono-locale-extras
接下來需要配置mod_mono,這里推薦使用官方提供的http://go-mono.com/config-mod-mono/,頁面打開后如下圖所示:
可以選擇Virtual Host或者Application兩種模式,第一種可以根據請求的服務器地址設置ASP.NET網站的根路徑,第二種可以根據請求的虛擬目錄設置ASP.NET網站的根路徑。除此之外頁面下方還有幾個設置可以自定義,設置完后選擇頁面下方的Download下載.conf文件,將文件上傳到openSUSE服務器后使用如下命令復制到Apache配置文件夾下:
sudo cp 配置文件名.conf /etc/apache2/conf.d/
之后可以像Ubuntu一樣給openSUSE安裝上zip解壓縮工具(sudo zypper install zip),將壓縮文件解壓縮到設置的網站根目錄后即可。之后只需要重啟Apache服務器后就可以立即訪問ASP.NET網站了:
sudo systemctl restart apache2.service
需要注意的是,這樣完成后不像Ubuntu把很多依賴庫都裝上了,如果按上述命令的話只有以下部件被安裝:
所以可能還有很多需要的組件沒有安裝,比如需要連接Oracle數據庫時,可能提示找不到System.Data.OracleClient程序集,需要安裝“mono-data-oracle”,到時候可以根據出現的錯誤再安裝。其實也可以根據通配符安裝“mono*”,把跟mono有關的都安裝上,不過這樣也會裝很多不需要的組件。
CentOS的軟件管理程序是yum(這里使用的CentOS是Azure上提供的CentOS 6.3)。
首先還是安裝Apache。
sudo yum install httpd
與openSUSE類似,安裝完需要自己手動配置服務自啟動。
sudo chkconfig --levels 235 httpd on
然后立即啟動Apache服務。
sudo /etc/init.d/httpd start
現在再用瀏覽器訪問服務器地址就可以正常訪問Http服務器了。
但是CentOS官方沒有打包好的mono的rpm包,所以比較好的方式是自己編譯。
首先配置好編譯的環境。
sudo yum install gcc gcc-c++ bison pkgconfig glib2-devel gettext make freetype-devel fontconfig-devel libX11-devel libpng-devel libjpeg-devel libtiff-devel giflib-devel libexif-devel cairo-devel httpd-devel
可能會提示需要升級kernel-headers,但是系統可能默認禁止了核心的包,所以如果出現上述命令無法執行安裝的話,還需要在上一條命令之后附加“ --disableexcludes=main”,即如下的形式。
sudo yum install gcc gcc-c++ bison pkgconfig glib2-devel gettext make freetype-devel fontconfig-devel libX11-devel libpng-devel libjpeg-devel libtiff-devel giflib-devel libexif-devel cairo-devel httpd-devel --disableexcludes=main
如果一切安裝成功,可以執行下列語句下載需要安裝組件的源碼包并解壓縮。
cd /usr/src/ sudo wget http://download.mono-project.com/sources/libgdiplus/libgdiplus-2.10.tar.bz2 sudo wget http://download.mono-project.com/sources/mono/mono-2.10.8.tar.bz2 sudo wget http://download.mono-project.com/sources/xsp/xsp-2.10.tar.bz2 sudo wget http://download.mono-project.com/sources/mod_mono/mod_mono-2.10.tar.bz2 sudo tar jxf libgdiplus-2.10.tar.bz2 sudo tar jxf mono-2.10.8.tar.bz2 sudo tar jxf xsp-2.10.tar.bz2 sudo tar jxf mod_mono-2.10.tar.bz2
編譯并安裝libgdiplus。
cd /usr/src/libgdiplus-2.10 sudo ./configure --prefix=/usr sudo make ; sudo make install
然后編輯/etc/ld.so.conf文件,添加一行“/usr/lib/”,如下圖所示,保存之后再執行如下命令,從而使系統可以將libgdiplus.dll自動映射到對應的so文件中。(原文見:http://www.mono-project.com/DllNotFoundException)
sudo ldconfig
然后是Mono。
cd /usr/src/mono-2.10.8 sudo ./configure --prefix=/usr sudo make ; sudo make install
接下來安裝xsp。
export PKG_CONFIG_PATH=/usr/lib/pkgconfig cd /usr/src/xsp-2.10 sudo ./configure --prefix=/usr sudo make ; sudo make install
然后安裝mod_mono。
cd /usr/src/mod_mono-2.10 sudo ./configure --prefix=/usr sudo make ; sudo make install
然后再修改“/etc/httpd/conf/mod_mono.conf”這個文件,與Ubuntu上同名的配置文件配置相同。不過由于不像Ubuntu下有現成的配置文件,所以需要在文件中添加如下兩行,由于安裝的時候自動安裝了2.0和4.0的支持,所以可以將如下的2換為4即可啟用ASP.NET 4.0:
MonoServerPath "/usr/bin/mod-mono-server2" MonoAutoApplication enabled
然后將配置文件復制到Apache的配置文件目錄中:
sudo cp /etc/httpd/conf/mod_mono.conf /etc/httpd/conf.d/
由于CentOS自帶的SELinux的原因,使得Apache無法連接到mod-mono-server,所以我們現在還需要配置SELinux。當然,這里為了簡單就僅僅禁用SELinux,有興趣的可以自己創建安全策略,使mod-mono-server可以生效。這里修改/etc/sysconfig/selinux文件。將“SELINUX=enforcing”修改為“SELINUX=permissive”或“SELINUX=disabled”,例如下圖,保存重啟系統即可。
之后就可以通過SSH將網站打包上傳上去就可以直接訪問了。不過需要注意的是,CentOS上的Apache默認的根路徑在“/var/www/html”下,當然也可以在“/etc/httpd/conf/httpd.conf”文件中修改存放網站根目錄的路徑。
1、配置linux(apache) + mono 下運行 asp.net:http://www.cnblogs.com/hcl0208/archive/2010/10/25/1860173.html
2、openSUSE上安裝Mono并發布ASP.Net程序:http://www.linuxidc.com/Linux/2011-04/34872.htm
3、CentOS 6.0 安裝 MONO 2.10.8:http://www.cnblogs.com/aquilahkj/archive/2011/11/03/2234380.html
4、Mono環境下不支持中文的解決方法:http://www.cnblogs.com/shanyou/archive/2010/10/08/1846198.html
文章列表