2017年7月21日星期五

ASP.NET Core 正確發佈至CentOS/Apache & 解決Service Unavailable Error 503

若跟著Microsoft的教學文件,建立ASP.NET Core Project後,上傳至Apache後,應該都會跑得動。
但當你做了若干修改後,即使在本機以IISExpress運作得完美無瑕,
再次發佈可能都得以出現Http Error 503 - Service Unavailable
用GEdit打開Error log,Error message如下:

Long Term Support (LTS) releases are -

[Thu Jul 20 17:54:50.534863 2017] [proxy:error] [pid 1283] (111)Connection refused: AH00957: HTTP: attempt to connect to 127.0.0.1:5000 (127.0.0.1) failed
[Thu Jul 20 17:54:50.535276 2017] [proxy:error] [pid 1283] AH00959: ap_proxy_connect_backend disabling worker for (127.0.0.1) for 60s
[Thu Jul 20 17:54:50.535289 2017] [proxy_http:error] [pid 1283] [client 10.3.15.246:61490] AH01114: HTTP: failed to make connection to backend: 127.0.0.1



很自然就會Copy了上述幾句Google Search,得出的結果都是大概是(未打開SELinux, Firewall/iptables設置問題等等..)

如果依照這個方向去想,搞幾天都不會有什麼改變。
因為原因根本不是Apache的問題。

ASP.NET Core的Dependency Hell & Version Hell

由我早前所寫的問題集當中,可見.NET Core自身的版本跟其他Package的兼容性有極大關係,暫時Microsoft似乎未解決Dependency Hell問題,即使外國,已經有多位開發人員抱怨,認為.NET Core暫時不適合Production用,問題大多數跟我一樣出於開發過程上有太多難以解決的問題。

我們先了解一下.NET Core Runtime/SDK目前為止的版本。
在Github上的Release Notes可以看到有多個版本,而.NET Core Runtime and SDK download archive再分開LTS版和Current Release版,當中Runtime配搭著不同SDK版本下載。
官方解釋LTS和Current Release的分別是:

Long Term Support (LTS) releases are -
- Supported for three years after the general availability date of a LTS release
- Or one year after the general availability of a subsequent LTS release
Current releases are -
- Supported within the same three-year window as the parent LTS release
- Supported for three months after the general availability of a subsequent Current release
- And one year after the general availability of a subsequent LTS release

在Nuget上,亦不見得好。.NET Core Package頁上,舊版本的更新時間可能比新版本還要新,實在有點混亂。

ASP.NET Core / CentOS / Apache 問題集

前天以為安裝好DotNET Core至CentOS,看到ASP.NET頁面,應該就可以專心進入開發程序。
但這兩天預到的問題實在太多,由Visual Studio本身對.NET Core的兼容性,.NET Core本身的問題,到Project設定,再到Apache等等問題,我都花了不少時間解決。
始終.NET Core還是很新的產品,Google後都很難找到實際解決方法,所以我把預到的問題和解決方法寫下來,希望幫到其他人。

開發環境可以參照我前天所寫的ASP.NET Core + CentOS 7 + Apache安裝攻略
Error 1 - The project has not been restored or restore failed - run `dotnet restore`
一次就出現4個Error Message:

Severity Code Description Project File Line Suppression State
Error 3. You may be trying to publish a library, which is not supported. Use `dotnet pack` to distribute libraries. SkinCV C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets 262
Error 2. The project does not list one of 'win10-x64, win81-x64, win8-x64, win7-x64' in the 'runtimes' section. SkinCV C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets 262
Error 1. The project has not been restored or restore failed - run `dotnet restore` SkinCV C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets 262
Error Can not find runtime target for framework '.NETCoreApp,Version=v1.0' compatible with one of the target runtimes: 'win10-x64, win81-x64, win8-x64, win7-x64'. Possible causes: SkinCV C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Common.Targets 262

這個錯誤大多數出現在當你以Core 1.0.0開新Project後,做第一次Nuget Package更新到v1.0.1後,就會出現。
幸好這個問題已經在Github上有人報告issue #2442
解決方法是打開project.json,加上:
"runtimes": {
    "win10-x64": {},
    "win8-x64": {} 
},
之後找出"Microsoft.NETCore.App",修改為
"Microsoft.NETCore.App": {
    "version": "1.0.1",
    "type": "platform"
}
或者你會發現,在dependencies裡同樣都有"Microsoft.NETCore.App": "1.0.1",我自己就把這個刪除,但大家視乎情況而定。

2017年7月18日星期二

ASP.NET Core + CentOS 7 + Apache安裝攻略

作為一個經歷過ASP.NET初代到4.5版本的人,見到ASP.NET終於能夠誇平台是值得興奮的事。
雖然Mono早在好幾年前已經很成熟,而且相容度亦滿足一般使用,但始終不是官方支持,商業上實在很難說服團隊使用。
現在周圍的人都在應用Azure/AWS,甚至是Docker技術把虛擬機和程式封裝運作,ASP.NET MVC/Webforms只能在IIS上執行的確是很尷尬的局面。
Microsoft此舉絕對是明智決定,由一直面對著主流的PHP,Java/Spring,到近年在Start-up廣泛使用的Ruby on Rails或Python/Django,都是Cross-platform的。
所以DotNET Core的出現使ASP.NET不再邊緣化,終於名正言順在Linux/Mac上運行了。
我都來湊下熱鬧,嘗試設置一下DotNET Ready的Linux平台,過程中固然不會一直都順利,自己都是LINUX外行人,我使用CentOS的時候已經是大約6年前的CentOS 5,很多Command都忘記了。
所以我就把每一步Command的輸出,和自己遭遇到的問題解決辦法都寫下來,給自己和大家參考一下。


事前準備
我所採用的軟件版本如下:
  • CentOS Linux release 7.3.1611 (Core) 64Bit
  • Apache 2.4.6 (httpd.x86_64 0:2.4.6-45.el7.centos.4)
  • .NET Core 1.0.4

有幾個官方連結會用上的:
  1. CentOS Linux release 7.3.1611 (Core) 64Bit
  2. Set up a hosting environment for ASP.NET Core on Linux with Apache, and deploy to it
  3. .NET Core command-line interface (CLI) tools

頭兩個是必須的,第三個頁面讓你了解一下Linux下的DotNET CLI工作的命令。

首先我們依照第一個頁面的指示先把DotNET Core核心檔案安裝至Linux。
頁面上沒有提的事,就是我們安裝CentOS後,有兩件事我認為要做的。
1. 做一次系統軟件更新
2. 安裝VNC Server,畢竟我是來自Windows世界,有GUI操作資料夾或檔案,用GUI文字編輯軟件(GEdit)去編輯Apache Config檔會更容易,沒必要扮Geek用vi Editor吧...

Yum Update

***請確認是使用Root權限作SSH連線***

#確認CentOS版本
[root@localhost ~]# cat /etc/centos-release
#> CentOS Linux release 7.3.1611 (Core)
#更新一次系統軟件
[root@localhost ~]# yum update
#完成後,重啟系統
[root@localhost ~]# reboot

安裝VNC Server
#確認沒有安裝過VNCServer
[root@localhost ~]# which vncserver
#***Output***:
#> /usr/bin/which: no vncserver in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)

#安裝Gnome Desktop
[root@localhost ~]# yum groupinstall "GNOME Desktop"

#完成後,安裝VNCServer
[root@localhost ~]# yum install tigervnc-server

#執行以下指令,檢查是否安裝完成
[root@localhost ~]# rpm -qa | grep tigervnc-server
#***Output***:
#> tigervnc-server-1.3.1-9.el7.x86_64
#> tigervnc-server-minimal-1.3.1-9.el7.x86_64