使用Jexus实现ASP.NET在Linux平台下的部署
?
??Hello,大家好,我是Payne,歡迎大家關(guān)注我的博客,我的博客地址是https://qinyuanpei.github.io。今天想寫一點(diǎn)關(guān)于Linux部署ASP.NET相關(guān)的話題,為什么突然想寫這個(gè)話題呢?因?yàn)榫驮趲滋烨?#xff0c;我被我所認(rèn)識(shí)的一位前輩深深地鄙視了一番,原因是我依然在使用一個(gè)落后的IoC框架——Unity,在如今已然是公元2018年的今天。我突然想到,距離.NET Core 2.0發(fā)布已經(jīng)有一段時(shí)間,而.NET Core 3.0的roadmap已經(jīng)開始提上日程,可我好像還沒來得及認(rèn)真地去對(duì)待這個(gè)現(xiàn)狀。我一直在關(guān)注跨平臺(tái)和跨語言的技術(shù),就像我在大學(xué)里的時(shí)候就開始接觸Linux一樣,未來我們要面對(duì)的是種類繁多的終端平臺(tái),從PC時(shí)代到移動(dòng)互聯(lián)網(wǎng),再到VR、AR、IoT和AI,有太多太多的事情在悄然發(fā)生著變化。偶爾我的內(nèi)心會(huì)泛起焦慮和迷茫,可在時(shí)光蹉跎直至褪色以前,我或許只是變回了曾經(jīng)的自己。既然要如同涅槃一般重新開始,為什么不首先重新拾起曾經(jīng)關(guān)注的領(lǐng)域呢?所以,在這今天這篇文章里,你將看到:如何使用Jexus實(shí)現(xiàn)ASP.NET在Linux平臺(tái)下的部署。
故事背景
??我們項(xiàng)目組在開發(fā)這樣一種服務(wù),它可以通過收集招聘網(wǎng)站的簡(jiǎn)歷來提取相關(guān)信息,而這些信息將作為訓(xùn)練集供AI算法使用??紤]到Python在AI領(lǐng)域的優(yōu)勢(shì),我們決定采用Python來開發(fā)自然語言處理相關(guān)的業(yè)務(wù),而簡(jiǎn)歷的收集則是通過.NET中的Web Service暴露給前端。整個(gè)開發(fā)相對(duì)順利,可是在部署環(huán)節(jié)出現(xiàn)了問題。因?yàn)轫?xiàng)目組以往的的項(xiàng)目都是部署在Linux Server上,所以在部署Web Service的問題上產(chǎn)生了分歧,負(fù)責(zé)運(yùn)維的同事不愿意為這一個(gè)項(xiàng)目而單獨(dú)配置一臺(tái)Windows Server。這里需要說明的是,采用.NET來開發(fā)Web Service的一個(gè)重要原因是,這些簡(jiǎn)歷中存在大量Word文檔(.doc/.docx),因此不得不采用Office提供的COM組件來支持文檔的解析,雖然后來證明的確是這些COM組件拖了跨平臺(tái)的后腿。所以,在這個(gè)時(shí)候,我們面臨著兩種選擇,第一種方案是采用Windows Server來部署,我們的運(yùn)維同事表示不開心;第二種方案是采用Linux Server來部署。我們知道.NET跨平臺(tái)的一個(gè)關(guān)鍵技術(shù)是Mono,可Mono的問題是它的基礎(chǔ)類庫不大健全,相信微軟收購Mono以后這個(gè)問題能夠得到解決。目前官方主推的跨平臺(tái)技術(shù)是.NET Core,考慮到遷移到.NET Core版本的成本,我們最終沒有選擇這個(gè)方案。事實(shí)上,即使采用.NET Core進(jìn)行開發(fā),最終我們的部署依然需要依賴Jexus。綜合考慮這些因素,我們決定采用Jexus來將ASP.NET項(xiàng)目部署到Linux平臺(tái)。
關(guān)于Jexus
??Jexus是由宇內(nèi)流云開發(fā)的一款Linux平臺(tái)上的高性能Web服務(wù)器,它是一個(gè)可以免費(fèi)使用、不開源的項(xiàng)目,最大的特色是可以支持ASP.NET、ASP.NET Core、PHP。通俗地來講,我們可以認(rèn)為它是Linux平臺(tái)上的IIS,這并不為過,因?yàn)槟憧梢宰⒁獾絁exus Manager這個(gè)項(xiàng)目,它可以同時(shí)支持Jexus,IIS 和 IIS Express三種服務(wù)器的管理,并提供了各個(gè)平臺(tái)下一致的使用體驗(yàn),而Linux平臺(tái)則主要是針對(duì)Jexus。Jexus提供了不亞于商用服務(wù)器的眾多特性,比如多站點(diǎn)支持、使用應(yīng)用程序池來調(diào)度管理工作進(jìn)程、具有良好的穩(wěn)定性和容錯(cuò)能力、支持 HTTPS 和 WebSockets、支持 FastCGI 協(xié)議和 OWIN 標(biāo)準(zhǔn)。除此以外,它同時(shí)支持 URL 重寫、反向代理、壓縮傳輸、入侵檢測(cè)等重要功能。Jexus底層采用Linux中的epoll機(jī)制來處理網(wǎng)站請(qǐng)求,所以會(huì)比通常使用libuv實(shí)現(xiàn)的技術(shù)擁有更高的性能。作為一款跨平臺(tái)軟件,Jexus支持主流的Linux發(fā)行版本。目前,國內(nèi)外已經(jīng)有大量的網(wǎng)站采用Jexus作為它的服務(wù)器,我們可以在Jexus的官網(wǎng)上找到這些案例。雖然微軟官方正在全力推廣.NET Core,但對(duì)于那些需要維護(hù)的舊項(xiàng)目而言,遷移到全新的.NET Core平臺(tái)著實(shí)是個(gè)不小的挑戰(zhàn),而且目前支持.NET Core版本的類庫并不豐富,雖然最終的趨勢(shì)一定是.NET Core替代Mono,但對(duì)于Mono而言,在.NET宣布開源以后,從.NET Framework中吸收的基礎(chǔ)類庫,極大的改善了Mono基礎(chǔ)類庫不完善的狀況,而Mono針對(duì)CLR的實(shí)現(xiàn)、C#編譯器的實(shí)現(xiàn)、AOT環(huán)境等等特性,或許可以為.NET跨平臺(tái)提供借鑒,這是一個(gè)相互促進(jìn)的過程。在新時(shí)代到來以前,我們暫時(shí)需要使用Jexus來過渡。
Hello Linux
??OK,下面我們來體驗(yàn)一下Jexus在Linux平臺(tái)上的效果,這里我們以ASP.NET MVC4為例,我們直接通過Visual Studio創(chuàng)建一個(gè)項(xiàng)目即可,這里我們需要的是這個(gè)項(xiàng)目發(fā)布以后的所有文件??傊?#xff0c;這些文件需要通過某種方式放到Linux平臺(tái)上,大家自己去想辦法就好啦,這個(gè)不再說多余的話。
安裝Jexus
??Jexus安裝起來是非常簡(jiǎn)單的,這里博主使用的是Elementary OS,基于Ubuntu14.0的衍生版本。在終端下執(zhí)行如下命令:
| 1 | curl https://jexus.org/release/x64/install.sh|sudo sh |
?
你沒有看錯(cuò),真的只需要一行命令。事實(shí)上,Jexus分為兩個(gè)版本,即通用版和獨(dú)立版。其差別是通用版不含Mono運(yùn)行時(shí),獨(dú)立版含有Mono運(yùn)行時(shí)。官方建議使用獨(dú)立版,如果有朋友想嘗試安裝通用版,請(qǐng)?jiān)诮K端下執(zhí)行如下命令:
| 1 | curl https://jexus.org/release/install|sudo sh |
?
無論采用哪一種方式安裝,當(dāng)你看到終端中顯示:Jexus已經(jīng)被成功安裝到系統(tǒng),就表示Jexus安裝成功了。
配置Jexus
??Jexus部署到網(wǎng)站,需要兩個(gè)東西,一個(gè)是網(wǎng)站內(nèi)容(廢話),一個(gè)是網(wǎng)站配置。假定我們這里將這兩個(gè)東西打包在一起,壓縮包的名字為app.tar。為什么這里選擇了.tar格式的壓縮文件呢?因?yàn)樵贚inux平臺(tái)下這個(gè)格式更好用些,我們熟悉的.zip格式,可能會(huì)需要我們安裝相應(yīng)的擴(kuò)展。此時(shí),我們可以使用如下腳本來部署網(wǎng)站:
| 1 2 3 | tar -xf app.tar sudo mv -f .aspnetconf usr/jexus/siteconf/aspnetconf sudo mv ./aspnet /var/www |
?
OK,現(xiàn)在來解釋下這個(gè)腳本,這里我們需要部署一個(gè)名為“aspnet”的網(wǎng)站,所以,網(wǎng)站的內(nèi)容被放置在“aspnet”這個(gè)目錄里。該網(wǎng)站對(duì)應(yīng)一個(gè)作用于Jexus的配置文件,配置文件的名字為aspnetconf。首先,我們將“aspnetconf”這個(gè)配置文件移動(dòng)到了“usr/jexus/siteconf/”目錄下,這是Jexus指定的配置路徑,即每一個(gè)站點(diǎn)都有一個(gè)配置文件,且該配置文件被放置在“usr/jexus/siteconf/”目錄下。然后,我們將“aspnet”這個(gè)文件夾移動(dòng)到了“/var/www”目錄下,這是Jexus指定的網(wǎng)站目錄,即每一個(gè)站點(diǎn)都有一個(gè)文件夾,文件夾的名字可以理解為網(wǎng)站的名字。默認(rèn)情況下,Jexus會(huì)在www目錄里創(chuàng)建一個(gè)名為default的文件夾,即默認(rèn)有一個(gè)名為default的站點(diǎn),不過經(jīng)過博主核實(shí),最新版(v5.8.3)中是沒有default站點(diǎn)。同理,Jexus會(huì)siteconf目錄里創(chuàng)建一個(gè)名為default的配置文件。我們通常以這個(gè)配置文件為參照來編寫我們自己的配置文件,例如下面是aspnetconf中的內(nèi)容:
| 1 2 3 4 5 | port=4000 root=/ /var/www/aspnet hosts= indexs= aspnet_exts= |
?
其中,
- port表示Jexus Web服務(wù)器監(jiān)聽的端口(必填)
- root表示網(wǎng)站虛擬目錄與其對(duì)應(yīng)的物理目錄,中間使用空格分開(必填)
- hosts表示網(wǎng)站域名(建議填寫),可以使用泛域名如.yourdomain.com或者填寫表示默認(rèn)網(wǎng)站,一個(gè)端口有且只有一個(gè)默認(rèn)網(wǎng)站,選填
- indexs表示網(wǎng)站首頁文件名,如index.html、index.aspx等,多個(gè)文件名使用英文逗號(hào)分開,選填
- aspnet_exts表示ASP.NET擴(kuò)展名,不建議填寫。如要填寫,多個(gè)擴(kuò)展名(不含.)使用英文逗號(hào)分開。
最簡(jiǎn)單的配置只需要port和root即可,更多的配置項(xiàng)可以參考官方文檔。
基本使用
??Jexus的常用命令簡(jiǎn)單到只有3個(gè),start、restart、stop。命令的基本格式為:
| 1 2 3 | sudo /usr/jexus/jws start [站點(diǎn)名(可選,不指定時(shí)表示所有)] sudo /usr/jexus/jws restart [站點(diǎn)名(可選,不指定時(shí)表示所有)] sudo /usr/jexus/jws stop [站點(diǎn)名(可選,不指定時(shí)表示所有)] |
?
在這個(gè)例子里,我們執(zhí)行如下命令來啟動(dòng)aspnet這個(gè)站點(diǎn):
| 1 | sudo /usr/jexus/jws start aspnet |
?
當(dāng)終端中返回OK時(shí),就表示啟動(dòng)成功啦,此時(shí),我們打開瀏覽器,輸入http://localhost:4000就可以看到如下畫面(這里的端口號(hào)為4000):
運(yùn)行在Linux上的ASP.NET
你就說,這算不算驚喜。我們還可以輸入http://localhost:4000/info來驗(yàn)證Jexus是否配置正確,當(dāng)Jexus被正確配置以后,你就會(huì)看到一個(gè)顯示著“Welcome?to Jexus”的頁面。嗯嗯,好像是和Nginx挺像的哈!
?
Docker+
??接下來,讓我們考慮將這些Linux上的工作轉(zhuǎn)移到Docker中來做,因?yàn)榻柚鶧ocker的容器技術(shù),它可以為我們提供一個(gè)足以自給自足的環(huán)境。通過這個(gè)環(huán)境編譯測(cè)試通過的鏡像可以批量地部署到生產(chǎn)環(huán)境中。如果你不想在每一臺(tái)Linux Server上都覆蓋本文的流程,那么Docker將是提高你部署效率的不二選擇,而且從認(rèn)知完整性的角度來看待Docker,你就會(huì)發(fā)現(xiàn)它和Jekins、TravisCI、VSTS工具一樣,都可以非常完美地被接入到持續(xù)集成(CI)的流程里去,譬如我們項(xiàng)目組采用的是Jekins + Gitlib + Docker的方案,所以,如果你想要選擇一個(gè)最適合你的持續(xù)集成(CI)方案,無論如何,Docker都是需要去了解的一個(gè)知識(shí)。關(guān)于Docker的背景知識(shí)大家可以自己去了解,這里我們通過編寫Dockerfile來完成網(wǎng)站鏡像的構(gòu)建:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | FROM ubuntu:14.04 LABEL vendor="qinyuanpei@163.com"# Prepare Environment RUN sudo apt-get update RUN sudo apt-get install -y RUN sudo apt-get install -y curl RUN sudo apt-get install -y wget RUN sudo curl -sSL https://jexus.org/release/x64/install.sh|sudo sh# Deploy Website ADD dest/ / RUN sudo mv -f aspnetconf /usr/jexus/siteconf/aspnetconf RUN sudo mkdir -p /var/www RUN sudo mv ./aspnet /var/www# Start Jexus EXPOSE 4000 WORKDIR /usr/jexus CMD sudo ./jws start aspnet |
?
如果你熟悉Linux下的命令的話,你就會(huì)知道apt-get、curl、wget這些命令的含義,真正需要的解釋的是ADD,它表示的是,將Dockerfile同級(jí)目錄下的dest目錄添加到Docker環(huán)境中,接下來的命令我們同樣非常熟悉,因?yàn)檫@和Linux下操作是完全一樣的。不過,這里的確有些坑需要踩,在博主構(gòu)建鏡像的過程中,發(fā)現(xiàn)容器環(huán)境和虛擬機(jī)環(huán)境還是有本質(zhì)不同的,這里的mv命令在Docker下有時(shí)候會(huì)引發(fā)“hard link”的問題,從Stackoverflow上好像并沒有找到太有價(jià)值的答案,總之,這個(gè)問題非常的玄學(xué)。接下來,我們會(huì)將Docker容器的4000端口暴露出來,為什么是4000端口呢?因?yàn)檫@個(gè)網(wǎng)站的配置中指向了4000端口,這一點(diǎn)在上文中我們已經(jīng)提及。而入口處的命令,顯然是啟動(dòng)Jexus服務(wù),這個(gè)不再解釋。
這里,我們通過如下命令來構(gòu)建一個(gè)鏡像版本:
| 1 | docker build -t jexus-aspnet:v1.0 . |
?
假如這個(gè)鏡像被成功構(gòu)建出來,我們就可以使用這個(gè)鏡像來啟動(dòng)網(wǎng)站啦。如下圖所示:
使用Docker創(chuàng)建網(wǎng)站鏡像
具體地,我們可以使用docke image命令來管理所有的docker鏡像。這里我們啟動(dòng)網(wǎng)站:
| 1 | docker run -p 4050:4000 -t jexus-aspnet:v1.0 |
?
這里,我們將Docker容器的4000端口映射到主機(jī)的4050端口,當(dāng)我們?cè)跒g覽器中輸入:http://localhost:4050,就可以得到和Linux下一樣的結(jié)果。不過,在寫作這篇博客時(shí),博主使用的是Windows下的Docker,如果大家遇到相關(guān)問題,歡迎在博客評(píng)論區(qū)留言。
本文小結(jié)
??本文從一個(gè)實(shí)際工作的場(chǎng)景切入,分析和闡述了如何使用Jexus實(shí)現(xiàn)ASP.NET項(xiàng)目在Linux下的部署。為了簡(jiǎn)化這篇文章的寫作,我們使用了一個(gè)ASP.NET MVC4的示例項(xiàng)目,真實(shí)的項(xiàng)目通常會(huì)有數(shù)據(jù)庫,所以情況會(huì)比本文所介紹的流程更為復(fù)雜,可這讓我們看到了一種可能性不是嗎?通過查閱相關(guān)資料,博主發(fā)現(xiàn)ASP.NET Core的部署不需要Jexus,它只需要一個(gè)dotnet run命令即可。然后,作為一次體驗(yàn)Docker的過程,我們通過編寫Dockerfile的方式讓Jexus和Docker發(fā)生了某種奇妙的關(guān)聯(lián)。作為本文的一個(gè)延伸,我們需要考慮網(wǎng)站服務(wù)停止后可以自動(dòng)重啟,這就是所謂的守護(hù)進(jìn)程機(jī)制啦,感興趣的朋友可以繼續(xù)深入研究,Jexus提供了大量的優(yōu)秀特性,這篇文章中所看到的不過是冰山一角。最終,我們的項(xiàng)目還是沒有使用Jexus,這其中有對(duì)Jexus性能的不信任,有因?yàn)镃OM組件而做出的妥協(xié),有對(duì)Mono非官方方案的鄙夷……可以說,技術(shù)選型是一個(gè)受到多種因素制約的問題,誰擁有了話語權(quán),就可以左右技術(shù)選型的走向,這是否又印證了,人類并非如自己所標(biāo)榜的那般理性和正義?好了,以上就是這篇文章的全部?jī)?nèi)容啦,今天是5月20日,如果沒有人對(duì)你說“我愛你”,請(qǐng)記得對(duì)自己說“我愛你”,謝謝大家!
- Jexus
- Linux
總結(jié)
以上是生活随笔為你收集整理的使用Jexus实现ASP.NET在Linux平台下的部署的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 局域网的远程链接
- 下一篇: linux 其他常用命令