第一步 安裝.Net Core環境
安裝 dotnet 環境參見官方網站 https://www.microsoft.com/net/core。
選擇對應的系統版本進行安裝。安裝完成過后 輸入命令查看版本,目前最新版為 2.x:
dotnet --version
此時已經可以發布Asp.Net Core應用程序到Linux上運行了
將Asp.Net Core程序發布到Linux服務器上,通過 dotnet 命令來運行,如:
dotnet /應用程序全路徑/應用程序名.dll
成功運行后會顯示 :
Hosting environment: Production
Content root path: /應用程序全路徑/ Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down.
(Asp.Net Core應用程序默認使用5000端口,可以在項目 Program.cs 中進行自定義端口,但不建議在Program.cs中進行自定義端口)
但是這個時候,只要關閉當前的 ssh 會話 那么 Asp.Net Core應用程序就會結束運行。
那么該怎么辦呢?使用 Jexus ! (需要使用5.8.2 版本或更高版本的)https://news.cnblogs.com/n/569277/
Jexus 官網地址: https://www.jexus.org/
Jexus 官網論壇: https://www.linuxdot.net
第二步 安裝Jexus
安裝 Jexus 直接使用一下命令即可(需要在root身份下執行):
curl https://jexus.org/release/x64/install.sh|sh
安裝成功后會提示:OK, Jexus has been installed in /usr/jexus.
第三步 發布程序並復制到到Linux服務器
1、發布
可使用vs直接發布,也可以使用dotnet命令進行發布,或者可以使用我寫的一個小工具,對項目進行發布 小工具鏈接
2、復制到服務器
將發布的整個應用程序文件夾copy到Linux服務器的 /var/www/ 路徑下
(如果 www 文件夾不存在,則使用 mkdir /var/www/ 命令創建 www 文件夾)
此時,應用程序所在的完整路徑為 /var/www/應用程序文件夾/應用程序名稱.dll
第四步 配置Jexus運行Asp.Net Core應用程序
使用以下命令:
1、切換到Jexus配置文件目錄
cd /usr/jexus/siteconf
2、復制默認的配置文件為test
cp default test
3、編輯test配置文件
vi test
test文件默認內容為:
###################### # Web Site: Default ######################################## port=80 root=/ /var/www/default hosts=* #OR your.com,*.your.com # addr=0.0.0.0 # CheckQuery=false NoLog=true # AppHost={CmdLine=/usr/local/x/xx;AppRoot=/usr/local/x;Port=5000} # NoFile=/index.aspx # Keep_Alive=false # UseGZIP=false # UseHttps=true # ssl.certificate=/x/xxx.crt #or pem # ssl.certificatekey=/x/xxx.key # ssl.protocol=TLSv1.0 # TLSv1.1 or TLSv1.2... # ssl.ciphers= # DenyFrom=192.168.0.233, 192.168.1.*, 192.168.2.0/24 # AllowFrom=192.168.*.* # DenyDirs=~/cgi, ~/upfiles # indexes=myindex.aspx # rewrite=^/.+?\.(asp|php|cgi|pl|sh)$ /index.aspx # reproxy=/bbs/ http://192.168.1.112/bbs/ # host.Redirect=abc.com www.abc.com 301 # ResponseHandler.Add=myKey:myValue # Jexus php fastcgi address is '/var/run/jexus/phpsvr' ####################################################### # fastcgi.add=php|socket:/var/run/jexus/phpsvr # php-fpm listen address is '127.0.0.1:9000' ############################################ # fastcgi.add=php|tcp:127.0.0.1:9000
編輯完成后 test 的內容為(注意AppHost中的每一項結尾應該有英文半角的分號):
###################### # Web Site: test ######################################## port=8888 root=/ /var/www/應用程序文件夾/ hosts=* #OR your.com,*.your.com AppHost={ cmd=dotnet 應用程序名稱.dll; root=/var/www/應用程序文件夾/; port=0; } # addr=0.0.0.0 # CheckQuery=false NoLog=true # AppHost={CmdLine=/usr/local/x/xx;AppRoot=/usr/local/x;Port=5000} # NoFile=/index.aspx # Keep_Alive=false # UseGZIP=false # UseHttps=true # ssl.certificate=/x/xxx.crt #or pem # ssl.certificatekey=/x/xxx.key # ssl.protocol=TLSv1.0 # TLSv1.1 or TLSv1.2... # ssl.ciphers= # DenyFrom=192.168.0.233, 192.168.1.*, 192.168.2.0/24 # AllowFrom=192.168.*.* # DenyDirs=~/cgi, ~/upfiles # indexes=myindex.aspx # rewrite=^/.+?\.(asp|php|cgi|pl|sh)$ /index.aspx # reproxy=/bbs/ http://192.168.1.112/bbs/ # host.Redirect=abc.com www.abc.com 301 # ResponseHandler.Add=myKey:myValue # Jexus php fastcgi address is '/var/run/jexus/phpsvr' ####################################################### # fastcgi.add=php|socket:/var/run/jexus/phpsvr # php-fpm listen address is '127.0.0.1:9000' ############################################ # fastcgi.add=php|tcp:127.0.0.1:9000
編輯完成后,在英文半角輸入法下 按 Esc 鍵 輸入 :wq 完成保存文件修改並退出 (以上修改會在下面進行詳細說明)
4、啟動/重啟 Jexus
當配置文件編輯完成后使用以下命令對Jexus進行 啟動/重啟
# 如果已啟動 Jexus: sh /usr/jexus/jws restart # 如果未啟動 Jexus: sh /usr/jexus/jws start
啟動/重啟成功后,在瀏覽器中輸入 ip地址/域名:端口號 例如(192.168.1.1:8888 或 www.aspnetcore.com:8888 ) 即可訪問Asp.Net Core應用程序
以上即是Jexus托管Asp.Net Core應用程序的配置全過程
通過微軟官方的介紹,Asp.Net Core應用程序是運行在 Kestrel 服務器上的,
那么Jexus和Kestrel之間的關系什么呢?正如 Apache與Tomcat之間的關系.
Jexus作為Web服務器,Kestrel是應用服務器,Jexus會將瀏覽器發送的請求轉交給Kestrel,Kestrel 根據請求 交給Asp.Net Core應用程序 處理后將處理結果返回到到Jexus,再由Jexus響應到瀏覽器,如圖所示:
通過上面的圖片我們可以看到一次完整的請求響應的過程。
那么Jexus是怎么將請求轉發到 Kestrel 服務器中的Asp.Net Core應用程序上的呢?
這里不得不感嘆Jexus的強力與使用的便捷,只需要簡單的編輯配置文件即可。
在上面 第四步 配置Jexus運行Asp.Net Core應用程序 時,test文件編輯后的內容含義
port=8888 # 外部訪問的端口號,可以改成你想要的端口號,外部訪問通過 ip/域名:端口號 即可訪問 root=/ /var/www/應用程序文件夾/ # 應用程序的工作根目錄(全路徑) hosts=* #OR your.com,*.your.com # 如果為服務器設置了DNS解析,則可以填寫解析到服務器的域名,如:www.myweb.com AppHost={ # 最最最重要的配置 cmd=dotnet 應用程序名稱.dll; # 命令,啟動Asp.Net Core應用要執行的命令
root=/var/www/應用程序文件夾/; # Asp.Net Core應用程序所在的全路徑
port=0; # Asp.Net Core應用程序所使用的端口號,如果在程序中使用了UsrUrls自定義端口則使用UsrUrls中填寫的端口(不建議使用UsrUrls自定義端口),
# 在沒有使用UsrUrls自定義端口的情況下端口號設置為 0,Jexus會在運行時與Asp.Net Core進行"協商"具體使用的端口號,避免多個應用分配 # 端口的麻煩和沖突的風險。
}
配置的重點就在於AppHost中,需要注意的是在AppHost中的port(端口號)不代表Jexus對外服務的port(端口號),而是指要轉發的 Asp.Net Core應用程序的端口號,簡單來說就是會將外部的請求轉發到這個端口,由這個端口對應的Asp.Net Core應用程序對請求進行處理。
強烈推薦“協商端口”,而不是在Asp.Net Core中使用UsrUrls設置端口,避免多個應用分配端口的麻煩和沖突的風險
推薦博客:
另推薦博文:
另感謝 宇內流雲 的耐心指導。