從零開始,將ASP.NET Core部署到Linux生產環境


研究.NET Core已經一段時間了,一直都是在Windows上開發,這2天嘗試着將公司一個很簡單的內部Web項目改造成了ASP.NET Core,並且部署到Linux上。生產環境如下:

  1. Linux Ubuntu 14.04
  2. 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:現在回想,才覺得有些東西是很坑的。

  1. supervisor的配置,完全按照官方文檔來,是沒有設置HOME這個變量。這里的ISSUE提了幾個月了也沒人管,這個錯誤提示簡直不知所雲,還好搜到這個PR,才明白該怎么解決。
  2. SQL Server這個更坑了,只支持SQL Server 2008 R2 SP3我就不吐槽了,居然不支持命名實例。我在安裝SP3以后再遇到連接問題都開始懷疑人生了,還好又千辛萬苦搜到一個ISSUE。好消息是.NET Core 1.1.0就可以支持命名實例了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM