研究.NET Core已經一段時間了,一直都是在Windows上開發,這2天嘗試着將公司一個很簡單的內部Web項目改造成了ASP.NET Core,並且部署到Linux上。生產環境如下:
- Linux Ubuntu 14.04
- Windows Server 2008, SQL Server 2008 EXPRESS R2
安裝SDK
如果Linux服務器可以訪問外網,那么按照 官網文檔 的指導可以很簡單的完成SDK的安裝。
不巧的是我找的虛擬機只能訪問內網,因此只能通過代理的方式來安裝。關於如何設置代理,可以參考這篇文章
在我設置代理以后,按照官方文檔的步驟總是在這一步失敗,現在也沒搞明白原因。
sudo apt-key adv --keyserver apt-mo.trafficmanager.net --recv-keys 417A0893
如果有在這一步失敗的小伙伴,可以去DotNet Cli的Dot NET Cli Github主頁,下載4個deb文件,按照順序依次安裝。當然安裝過程中可能會出現錯誤,提示缺少依賴的組件,這個時候執行下面的命令即可。
sudo apt-get install -f
項目編譯發布
首先把代碼拷貝到Linux環境,進入web文件夾,執行以下命令進行編譯。
dotnet restore
dotnet run
如果編譯沒有問題,那么執行以下命令發布
dotnet publish -c [Debug|Release]
發布的文件會拷貝到bin/[Debug|Release]/netcoreapp1.0/publish。這個時候進入publish文件夾,執行以下命令已經可以運行網站了。
dotnet [Your Web Assembly].dll
安裝Nginx
按照官方文檔的說法,Kestrel不像IIS一樣擁有WEB服務器的豐富的特性,因此部署到生產環境時,需要在前面安裝一個反向代理服務器接收HTTP請求,並將請求轉發到Kestrel。
安裝Nginx很簡單,執行以下命令即可
sudo apt-get install nginx
然后開始配置Nginx,vim打開/etc/nginx/sites-available/default文件,編輯成如下的配置。
server {
listen 80;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
}
在執行以下命令,使Nginx配置生效
sudo nginx -s reload
安裝Supervisor
由於dotnet是我們手動執行的,如果想系統啟動時自動啟動,就需要寫個守護進程。按照官網文檔,可以安裝Supervisor解決這個需求。
執行以下命令安裝
sudo apt-get install supervisor
執行以下命令配置supervisor
sudo vim /etc/supervisor/conf.d/[Your Application Name].conf
在配置文件填寫以下內容
[program:[Your Application Name]]
command=/usr/bin/dotnet [Your Publish File Path]
directory=[Your Publish File Path]
autostart=true
autorestart=true
stderr_logfile=/var/log/[Your Application Name].err.log
stdout_logfile=/var/log/[Your Application Name].out.log
environment=ASPNETCORE_ENVIRONMENT=Production,HOME=/var/www/
user=www-data
stopsignal=INT
這里有個坑要注意了,一定要在enviroment里設置HOME變量,否則啟動時會報Value cannot be null. Parameter name: Path1這樣的錯誤
配置好以后,重新啟動supervisor服務
sudo service supervisor stop
sudo service supervisor start
可以通過以下命令查看supervisor下掛載的進程狀態,如果有異常,及時查看上面配置的日志文件
sudo supervisorctl status
連接SQL Server數據庫
我在執行以上步驟以后,已經可以訪問靜態頁面了,但是與SQL Server的連接老是出現錯誤。查了下Github上的Issue,發現是不支持SQL Server 2008 R2。裝了SP3補丁以后,發現又不支持命名實例。於是只有重新安裝了一個默認實例。這些都搞定以后,項目終於正常運行了。
整個安裝過程就是這樣,希望這篇文章能幫助到各位小伙伴。
PS:現在回想,才覺得有些東西是很坑的。
