在 centos 7* 上部署ASP.NET Core 至 完全托管
添加dotnet産品Feed
在安裝.NET之前,您需要注冊Microsoft密鑰,注冊産品存儲庫并安裝所需的依賴項。這隻需要每台機器完成一次。
打開終端并運作以下指令:
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rpm
安裝.NET SDK
更新可用于安裝的産品,然後安裝.NET SDK。
在終端中,運作以下指令:
sudo yum update
sudo yum install dotnet-sdk-2.2
檢查所有安裝正确
安裝完成後,打開一個新終端并運作以下指令:
dotnet
若沒報錯,說明安裝成功
建立您的應用
在終端中,運作以下指令:
dotnet new console -o myApp
dotnet new webApp -o myWebApp --no-https
該 console/webApp 參數選擇建立應用時要使用的模闆。
該-o參數建立一個名為myWebApp存儲應用程式的目錄。
該--no-https标志指定不啟用HTTPS。
運作以下指令來運作:
cd myWebApp
dotnet run
直至出現 http://localhost:5000 說明運作成功
此時仍不能通路,需要部署一個 web 容器來轉發
現在來安裝一個 Nginx
curl -o nginx.rpm http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
rpm -ivh nginx.rpm
yum install nginx
或:
sudo yum install epel-release
sudo yum install nginx
配置防火牆:
sudo firewall-cmd --permanent --zone=public --add-service=http (加入http協定連結)
sudo firewall-cmd --permanent --zone=public --add-service=https(加入https協定連結)
firewall-cmd --zone=public --add-port=80/tcp --permanent(開放80端口)
sudo firewall-cmd --reload(重新開機防火牆使之生效)
ok了
systemctl start/stop nginx 運作和停止nginx
systemctl enable/disable nginx 允許和阻止開機啟動nginx
設定 nginx 反向代理:
vi /etc/nginx/nginx.config
找到:
server {
...
}
寫入
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 –s reload 重新加載 nginx
此時運作.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
現在,一切就 over 了
此時,雖然步驟差不多了,但你會發現:
1. 運作了項目過後,就不能進行其他操作了,需要結束程序,才能操作,這種情況當但是我們不想看到的,而且在生産環境中對這種情況是零容忍的。
2. 如果 .NET Core 程序意外中止,那麼我們就需要再次啟動,往往,這種操作也不夠及時
3. 如果伺服器當機或需要重新開機,我們也必須要重新開機項目。
為了解決這個問題,我們需要有一個程式來監聽.NET Core 應用程式的狀況。在應用程式停止運作的時候立即重新啟動。這邊我們用到了Supervisor這個工具,Supervisor使用Python開發的。
安裝 Supervisor
yum install python-setuptools
easy_install supervisor
配置Supervisor
mkdir /etc/supervisor
echo_supervisord_conf > /etc/supervisor/supervisord.conf
vi /etc/supervisor/supervisord.conf
将尾部的:
;[include]
;files = relative/directory/*.ini
改成:
[include]
files = conf.d/*.conf
配置對.Net Core應用的守護:
touch /etc/supervisor/conf.d/項目名.conf
vi /etc/supervisor/conf.d/項目名.conf
[program:Scorpio.WebApi] ;自定義程序名稱
command=dotnet Scorpio.WebApi.dll ;程式啟動指令
directory=/home/wwwroot/scorpio ;指令執行的目錄
autostart=true ;在Supervisord啟動時,程式是否啟動
autorestart=true ;程式退出後自動重新開機
startretries=5 ;啟動失敗自動重試次數,預設是3
startsecs=1 ;自動重新開機間隔
user=root ;設定啟動程序的使用者,預設是root
priority=999 ;程序啟動優先級,預設999,值小的優先啟動
stderr_logfile=/var/log/Scorpio.WebApi.err.log ;标準錯誤日志
stdout_logfile=/var/log/Scorpio.WebApi.out.log ;标準輸出日志
environment=ASPNETCORE_ENVIRONMENT=Production ;程序環境變量
stopsignal=INT ;請求停止時用來殺死程式的信号
supervisord -c /etc/supervisor/supervisord.conf
如果出現了
Error: Another program is already listening on a port that one of our HTTP servers is configured to use. Shut this program down first before starting supervisord.
試試 supervisorctl stop 再輸入,如果不管用就重新開機再輸入接着:
ps -ef | grep 項目名
supervisorctl reload
輸入 supervisorctl
exit 或 Ctrl + c 可以退出 supervisorctl指令模式
看看是否存在 你建立的 項目程序,如有則,運作成功
配置Supervisor開機啟動:
建立一個 supervisord.service
touch /usr/lib/systemd/system/supervisord.service
vi /usr/lib/systemd/system/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
執行指令:
systemctl enable supervisord
執行指令:
systemctl is-enabled supervisord #來驗證是否為開機啟動
如果為enabled則ok了
本文章參考自:https://blog.csdn.net/zhuyu19911016520/article/details/61210489