ubuntu16.04-x64系統中Jexus web server部署.NetCore和埠分析引發的猜想!

神牛003發表於2017-06-21

您有這樣的牢騷麼?

有一週沒更新部落格了,簡單說下在幹什麼吧;主要是公司安排對接某旅遊大公司的介面,介面數量倒也就10個左右,對接完後還需要加入到業務系統中和App端,因此還是需要花點時間的;時間上來說業務需求安排在6月最後一週上線,整個3周的時間,就本人一人負責,由於在這之前對接過另外一個公司介面,我已經搭建好了整體架構和提供給app端介面了,因此主要還是對接某公司介面而已,至於細節上的東西改改後臺系統,調調資料格式應該就差不多了;就本人開發的熟練度來講一週時間基本能搞定,其他剩餘時間就測試,喝喝茶,學習一下;誰知。。。由於介面方說明文件不全,介面幾乎是每位技術負責一兩個介面(沒錯這就是大公司,分得就這麼細),而且有疑問通過qq諮詢時響應慢(可能別人大公司的人就是忙),就這樣來到第一週的星期五,從app測試結果和對接介面幾乎都完成的情況來看還是不錯的(我的方式對接一個介面就嵌入到業務中,所以可以直接拿app測試),誰知第二週的時候,也就是本週星期二我在測試多人下單出現了異常,隨後聯絡對方,結果被告知對接的這個下單介面不是最新的,但是除此之外其他幾個介面都是最新的,最新的下單介面我們等一段時間才上線,等上線了在對接吧;來到此時我只能無語(誰叫您們是大公司呢),純屬浪費我對接和諮詢的“熱情”;

部署前的準備

來到這裡就開始進入正題了,首先要準備ubuntu系統(後面我會單獨寫一篇怎麼在OracleVM中安裝ubuntu和注意事項),這裡我是16.04-x64版本,為什麼我重點寫明版本號呢,因為我在官網直接下載最新的Jexus包後,盡然執行不起來,後來在善友兄文章中找到了個地址,安裝試執行後是可以的也同樣標記的是最新版,只不過後面帶了個64位的標記,這是一個悲催的天;

我們還需要一個.netcore程式,為了測試方便我這裡建立的是一個api程式,並且api的action裡面這樣修改了下:

1 [HttpGet]
2         public IEnumerable<string> Get()
3         {
4             return new string[] {$"這個站點是:{Request.Host.Host}:{Request.Host.Port}" };
5         }

輸出當前應用程式對應的ip和埠,因為在後面為了更好的測試以及區分;這裡也簡單改造了下Program.cs中的程式碼,同樣也是為了方便測試:

 1  public static void Main(string[] args)
 2         {
 3             var builder = new WebHostBuilder()
 4                 .UseKestrel();
 5             //引數指定埠
 6             builder = args.Length > 0 ? builder.UseUrls(args[0]) : builder;
 7             var host = builder.UseContentRoot(Directory.GetCurrentDirectory())
 8                   .UseIISIntegration()
 9                   .UseStartup<Startup>()
10                   .UseApplicationInsights()
11                   .Build();
12             host.Run();
13         }

改完程式碼後,需要生成執行包,怎麼生成這裡就不講了,有興趣的朋友可以去看這裡Asp.NetCore1.1版本沒了project.json,這樣來生成跨平臺包;然後通過多種方式把程式包傳到虛擬機器上,這裡我通過共享目錄的方式傳遞的,如果有朋友需要以後有機會分享吧;

再來剩下的就是在ubuntu中使用Jexus web server服務了,為了我虛擬機器空間著想,這裡我是在tmp中操作的,主要以下步驟,開啟終端:

1. cd /tmp(進入臨時目錄)

2. wget linuxdot.net/down/jexus-5.8.2-x64.tar.gz(下載jexus檔案包)

3. tar zxvf jexus-5.8.2-x64.tar.gz(解壓到當前目錄,無需安裝)

4. chmod o+w /tmp/jexus/siteconf(為了方便設定jexus資料夾中的siteconf配置資料夾可以直接操作)

5. chmod o+w /tmp/jexus/siteconf/default(設定預設配置default檔案可直接通過開啟檔案方式修改 注:本人不喜歡通過命令來修改,才有此步驟)

6. cd jexus(進入jexus目錄  注:由於如果按照我步驟操作的話這樣可以直接進入jexus目錄,實際jexus目錄在 cd /tmp/jexus)

7. ./jws start(測試jexus是否能正常執行,就我寫本篇部落格的時候第一次執行這命令返回的結果是:Failure,原因是我沒用root許可權執行命令,改成root執行命令就行了,怎麼root以後有機會再講)

 

Jexus web server開始部署.NetCore

首先直接通過點選資料夾的方式進入如下目錄(您也可以通過終端進入,個人喜好便捷):/tmp/jexus/siteconf;能夠看到名稱問default的檔案,此檔案在安裝時是非root許可權只讀的,由於我們在上面使用命令:chmod o+w /tmp/jexus/siteconf/default設定了執行其他許可權的使用者都能修改內容,所以這裡我直接改,其他資訊暫時不改動,只需要增加apphost節點:

1 port=80
2 root=/ /var/www/default
3 hosts=*    #OR your.com,*.your.com
4 #增加apphost節點
5 AppHost={CmdLine=dotnet /home/wangrudong003/netcore/publish01/T_Jexus.dll;AppRoot=/home/wangrudong003/netcore/publish01;Port=5000}

增加apphost節點的幾個屬性說明:

CmdLine:執行命令(熟悉一點.netcore執行的朋友可能知道,.netcore執行命令可以這樣:dotnet xxx.dll這樣就能跑起來程式了,同理可以看成一樣的,但是需要指定應用程式具體目錄,這裡我的是 /home/wangrudong003/netcore/publish01 )
AppRoot:表示應用程式的目錄,這裡我的是 /home/wangrudong003/netcore/publish01
Port:監聽埠;

 

jexus注意點(大家可以去這裡詳細瞭解:https://www.linuxdot.net/bbsfile-3084):
port=80:表示通過jexus來監聽80埠,以此來訪問我們的  /home/wangrudong003/netcore/publish01/T_Jexus.dll  程式
root=/ /var/www/default:指定的虛擬目錄

最後root許可權進入cd /tmp/jesux目錄,然後開啟服務:./jws start  ;如果不出意外的話,您也能夠看到如下截圖資訊:

然後咋們來通過80埠訪問以下我們部署的介面(這裡我ubuntu伺服器的ip是172.16.9.66):http://172.16.9.66/api/values,訪問成功的截圖:

 

分析一下AppHost配置中的Port是否起作用

有上圖測試我們看到了通過80埠能正常訪問我們的介面站點,現在我們通過linux命令,檢視下伺服器上所監聽的埠,檢視tcp監聽埠命令: sudo netstat -lntp ,能投得到如圖:

由圖能夠看出來jexus服務監聽的80埠,dotnet命令執行的5000埠;為了更好的測試apphost的port的作用,我們需要把default檔案中的port為5000埠改成5001來測試,改完之後的配置:

1 AppHost={CmdLine=dotnet /home/wangrudong003/netcore/publish01/T_Jexus.dll;AppRoot=/home/wangrudong003/netcore/publish01;Port=5001}

然後需要重啟jexus服務,通過如下命令: ./jws restart :

重啟完之後,我們又來訪問:http://172.16.9.66/api/values,這個時候就訪問不了介面了:

儘管我們的jexus伺服器是ok狀態,但是介面已經無法訪問了,那麼我們再來看看監聽的埠:

埠圖對比分析

這張和之前埠截圖對比,能夠發現dotnet執行的還是5000埠,和我們修改配置檔案的port:5001不能對應,這有點奇怪,就這點能夠讓我們大膽猜想jexus的這個port埠設定沒有效果;而最後5000埠應該還是dotnet自帶的預設埠;

疑問

然而又讓我們奇怪的是,如果5000埠執行沒問題,那麼為什麼jexus公佈出去的80埠無法訪問api介面能,我們又來大膽猜想,是不是由於我們設定的jexus的port:5001埠也真實監聽的5000不對應造成的呢?為了測試我們再一次修改下AppHost的配置資訊:

AppHost={CmdLine=dotnet /home/wangrudong003/netcore/publish01/T_Jexus.dll http://127.0.0.1:5001;AppRoot=/home/wangrudong003/netcore/publish01;Port=5001}

這次我們按照netcore的命令格式:dotnet xxx.dll http://127.0.0.1:5001來設定下netcore監聽的埠,這也就是為什麼開篇部分我修改Program.cs中程式碼的原因,一切為了測試猜想;同樣修改完後,我們執行jexus服務的命令:./jws restart ;命令執行ok有,先來訪問下80埠的介面:

此時能夠正常訪問咋們的介面了,那最好需要驗證的就是看看監聽埠了:

第二幅與第三幅埠圖大比拼分析

通過上面第三方圖能夠看到netcore程式此時繫結的是5001埠,這個時候由jexus開放出去的80埠也能正常訪問咋們的介面了,那說明我們在jexus的defaut檔案中的apphost節點中的port:5001必須要與dotnetcore自身監聽的埠一致,沒錯一致;假如jexus的埠是8080,那麼netcore監聽的埠也必須是8080,這樣咋們通過jexus開放出來的地址才能正常的訪問;好了到這裡本篇分享文章就結束了,希望能給您帶來好的幫助,也希望大家多多點贊推薦,謝謝!!!

相關文章