1. 程式人生 > >第一次在linux下執行.netcore程式

第一次在linux下執行.netcore程式

.netcore的跨平臺如此之火,忍不住想試試 在linux下部署 .net 程式。

雖然是借鑑,但過程坎坷。對從未使用過linux的我難度可想而知,但萬事有百度。分享一些坑,下載Centos7後,安裝在VMware中,注意網路連線,最好是關機後重新啟動。

總體思路

環境說明 VMware虛擬機器+CentOS7
在linux中用 dotnet 命令建立ASP.NET Core應用程式
安裝CentOS7  下載地址:http://pan.baidu.com/s/1i4aIJ7B
安裝.NET Core SDK for CentOS7。
部署ASP.NET Core應用程式
配置Nginx 
配置守護服務(Supervisor) 最後這步未實踐

可把寫好的.netcore程式上傳到linux下,通過ftp服務上傳,需在linux中安裝 vsftpd,然後開啟服務,在windows中下載安裝WinSCP,開啟WinSCP,連線linux,可把.netcore程式上傳到linux,不會的百度,踩的坑越多瞭解的越多。

64位系統安裝 sudo yum install libunwind libicu(安裝libicu依賴)


sudo mkdir -p /opt/dotnet && sudo tar zxf dotnet.tar.gz -C /opt/dotnet(解壓縮)

sudo ln -s /opt/dotnet/dotnet /usr/local/bin(建立連結)


dotnet --info檢視是否可以使用dotnet命令


cd到home資料夾下 執行如下命令

dotnet new mvc 建立

dotnet restore 還原包

dotnet run 執行

出現下圖,則說明執行成功,但還無法訪問,需要部署一個 web 容器來轉發

安裝 Nginx


rpm -ivh nginx.rpm

yum install nginx


安裝成功!

輸入:systemctl start nginx 來啟動nginx。

輸入:systemctl enable nginx 來設定nginx的開機啟動(linux宕機、重啟會自動執行nginx不需要連上去輸入命令)

配置防火牆

命令:firewall-cmd --zone=public --add-port=80/tcp --permanent(開放80埠)

命令:systemctl restart firewalld(重啟防火牆以使配置即時生效)

測試nginx是否可以訪問。


配置Nginx對Asp.Net Core應用的轉發,監聽 5000埠

安裝 vim  , yum -y install vim

修改 /etc/nginx/conf.d/default.conf 檔案。通過 vim /etc/nginx/conf.d/default.conf 開啟,編輯裡面的內容,儲存時按住 Esc 再輸入 :wq! 命令儲存退出

將檔案內容替換為

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;
    }
}

上傳至CentOS進行覆蓋。

執行:nginx –s reload 使其即時生效

dotnet run 執行ASP.NET Core應用程式 發現還是無法訪問,

這個問題是由於SELinux保護機制所導致,我們需要將nginx新增至SELinux的白名單。

接下來我們通過一些命令解決這個問題。。

yum install policycoreutils-python

sudo cat /var/log/audit/audit.log | grep nginx | grep denied | audit2allow -M mynginx

sudo semodule -i mynginx.pp


再次嘗試訪問,在虛擬機器中打 ip a可檢視虛擬機器ip,在虛擬機器外的windows系統中通過IP訪問即可


至此基本完成了部署。

後面的守護服務,我沒有進行配置了,喜歡嘗試的可以自己試試,下面貼出

配置守護服務

目前存在三個問題

問題1:ASP.NET Core應用程式執行在shell之中,如果關閉shell則會發現ASP.NET Core應用被關閉,從而導致應用無法訪問,這種情況當然是我們不想遇到的,而且生產環境對這種情況是零容忍的。

問題2:如果ASP.NET Core程序意外終止那麼需要人為連進shell進行再次啟動,往往這種操作都不夠及時。

問題3:如果伺服器宕機或需要重啟我們則還是需要連入shell進行啟動。

為了解決這個問題,我們需要有一個程式來監聽ASP.NET Core 應用程式的狀況。在應用程式停止執行的時候立即重新啟動。這邊我們用到了Supervisor這個工具,Supervisor使用Python開發的。

安裝Supervisor

yum install python-setuptools

easy_install supervisor

配置Supervisor

mkdir /etc/supervisor

echo_supervisord_conf > /etc/supervisor/supervisord.conf

修改supervisord.conf檔案,將檔案尾部的配置


修改為


ps:如果服務已啟動,修改配置檔案可用“supervisorctl reload”命令來使其生效

配置對Asp.Net Core應用的守護

建立一個 WebApplication1.conf檔案,內容大致如下

[program:WebApplication1]
command=dotnet WebApplication1.dll ; 執行程式的命令
directory=/home/wwwroot/WebApplication1/ ; 命令執行的目錄
autorestart=true ; 程式意外退出是否自動重啟
stderr_logfile=/var/log/WebApplication1.err.log ; 錯誤日誌檔案
stdout_logfile=/var/log/WebApplication1.out.log ; 輸出日誌檔案
environment=ASPNETCORE_ENVIRONMENT=Production ; 程序環境變數
user=root ; 程序執行的使用者身份
stopsignal=INT

將檔案拷貝至:“/etc/supervisor/conf.d/WebApplication1.conf”下

執行supervisord,檢視是否生效

supervisord -c /etc/supervisor/supervisord.conf

ps -ef | grep WebApplication1

如果存在dotnet 程序則代表執行成功,這時候在使用瀏覽器進行訪問

至此關於ASP.NET Core應用程式的守護即配置完成。

配置Supervisor開機啟動

新建一個“supervisord.service”檔案

# dservice for systemd (CentOS 7.0+)
# by ET-CS (
https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

將檔案拷貝至:“/usr/lib/systemd/system/supervisord.service”

執行命令:systemctl enable supervisord


執行命令:systemctl is-enabled supervisord #來驗證是否為開機啟動