1. 程式人生 > >在Linux(Ubuntu/openSUSE/CentOS)下配置ASP.NET(Apache + Mono)

在Linux(Ubuntu/openSUSE/CentOS)下配置ASP.NET(Apache + Mono)

configure serve cin mono head 服務器 決定 文章 pen

【題外話】

閑的無聊竟然想嘗試測試自己做的項目在不同操作系統上的性能表現,所以決定試試在Linux上部署Apache和Mono的環境。由於平時很少接觸Linux,所以從網上找了幾篇文章(附在相關鏈接中)嘗試,部署的過程也並非一帆風順,所以就根據自己在Azure上配置的情況重新進行了整理,希望對很少接觸Linux的同學有所幫助。以下所有操作均在Azure上的虛擬機裏配置,如果在本地或者虛擬機裏配置,可能首先還需要配置網卡設置等。

【文章索引】

  1. 在Ubuntu下安裝Apache
  2. 在Ubuntu下安裝Mono
  3. 在Ubuntu下部署ASP.NET網站
  4. 在openSUSE下的操作
  5. 在CentOS下的操作
  6. 相關鏈接

【一、在Ubuntu下安裝Apache】

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端口,配置好後使用瀏覽器訪問服務器的地址可以看到如下圖的提示,說明安裝成功。

技術分享圖片

【二、在Ubuntu下安裝Mono】

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 

【三、在Ubuntu下部署ASP.NET網站】

在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

【四、在openSUSE下的操作】

不同的系統使用不同的軟件包管理程序,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下的操作】

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

在Linux(Ubuntu/openSUSE/CentOS)下配置ASP.NET(Apache + Mono)