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

您有這樣的牢騷麼?

有一週沒更新博客了,簡單說下在幹什麼吧;主要是公司安排對接某旅遊大公司的接口,接口數量倒也就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開放出來的地址才能正常的訪問;好了到這裏本篇分享文章就結束了,希望能給您帶來好的幫助,也希望大家多多點贊推薦,謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章