最近有個專案要上線,客戶提供一台 CentOS 7 的主機給我們部署,但是官網的文件主要都是以 Ubuntu 作業系統為主,並沒有完整的文件說明如何在 CentOS 安裝,我在架設 Labs 環境安裝的時候,也發現部署過程真的有點地雷,所以我打算用這篇文章說明一下實際的安裝步驟。
準備部署檔案
假設我們要從 Windows 先發行檔案到 g:\deploy
資料夾:
-
發行 ASP․NET Core 應用程式
dotnet publish -c Release -o g:\deploy\web
-
準備 MySQL 資料庫的 DDL / DML 腳本
本案使用 Code First 開發,因此資料庫的結構描述(Schema)可以透過 dotnet ef dbcontext script
產生指令碼:
dotnet ef dbcontext script -p ..\OOO.Data\ -o g:\deploy\db\InitializeDB.sql
準備部署環境
-
安裝一台 CentOS 7 作業系統 (Minimal Install)
展示 CentOS Linux release 7.9.2009 的 Minimal Install 完整安裝過程 - YouTube
-
安裝 .NET Runtime on CentOS
匯入 Microsoft package signing key 套件
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm
本案採用 ASP.NET Core 3.1 版本,所以只要安裝 ASP.NET Core 3.1 Runtime 即可:
sudo yum install -y aspnetcore-runtime-3.1
Install the .NET SDK or the .NET Runtime on CentOS
-
安裝 MariaDB 資料庫伺服器
本案採用 MySQL/MariaDB 資料庫,在 CentOS 安裝 MariaDB 非常方便。
sudo yum install mariadb-server -y
sudo systemctl enable mariadb
sudo systemctl start mariadb
sudo systemctl status mariadb
預設安裝的 root
並沒有設定密碼,部署完成後記得用 sudo mysql_secure_installation
加強 MySQL/MariaDB 資料庫安全性。
-
安裝 Nginx 網站伺服器軟體 (反向代理伺服器)
sudo yum install nginx -y
部署應用程式與資料庫
-
新增 MariaDB 資料庫
如果要讓 MariaDB 資料庫與 ASP.NET Core 可以無縫接軌,避免有中文亂碼的情況,你一定要特別注意建立資料庫的時候要選擇正確的 字集(CHARACTER SET) 與 定序(COLLATE)!
CREATE DATABASE mydb
CHARACTER SET = 'utf8mb4'
COLLATE = 'utf8mb4_general_ci';
其中 mydb
為資料庫名稱。
-
新增 MariaDB 使用者
任何網站都不應該使用 root
登入帳號連接資料庫,因此建議要為該網站的資料庫設定一組專用的登入帳號密碼,並授予特定資料庫權限。
CREATE USER 'mydbuser'@'localhost' identified by '2UfpbP3FSSZy';
GRANT ALL ON mydb.* TO 'mydbuser'@'localhost';
其中 mydbuser
為資料庫登入使用者名稱,而 2UfpbP3FSSZy
則為資料庫登入密碼。
-
部署 MariaDB 資料庫結構描述
將 InitializeDB.sql
複製到 CentOS 中,並透過以下命令匯入資料庫:
mysql -u root mydb < InitializeDB.sql
-
部署 ASP․NET Core 應用程式
將 g:\deploy\web
資料夾完整複製到 CentOS 中,並複製到 /var/www/myweb
目錄錄下。
sudo mkdir -p /var/www/myweb
sudo cp -r ~/web/* /var/www/myweb/
其中 myweb
為你的站台名稱。
-
建立一個 www-data
使用者
sudo adduser -M www-data
-
調整檔案上傳功能需要寫入資料夾的擁有者
chown www-data /var/www/securityscan/wwwroot/UploadFiles
chown www-data /var/www/securityscan/wwwroot/UploadFiles/*
-
建立 systemd 服務定義檔
sudo vi /etc/systemd/system/kestrel-myweb.service
這裡最重要的設定則是 Environment=
環境變數的指派:
[Unit]
Description=myweb App running on CentOS
[Service]
WorkingDirectory=/var/www/myweb
ExecStart=/usr/local/bin/dotnet /var/www/myweb/myweb.dll
Restart=always
# Restart service after 10 seconds if the dotnet service crashes:
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=kestrel-myweb
User=www-data
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false
Environment=ConnectionStrings__ServerConnection=server=127.0.0.1;port=3306;database=mydb;Uid=mydbuser;Pwd=2UfpbP3FSSZy;charset=utf8;
[Install]
WantedBy=multi-user.target
-
註冊並啟動 kestrel-myweb
服務
sudo systemctl enable kestrel-myweb.service
sudo systemctl daemon-reload
sudo systemctl restart kestrel-myweb.service
sudo systemctl status kestrel-myweb.service
查詢 kestrel-myweb
的執行記錄 (Logs)
sudo journalctl -fu kestrel-myweb.service
-
設定 Nginx 網站伺服器軟體 (反向代理伺服器)
編輯 /etc/nginx/nginx.conf
檔案:
sudo vi /etc/nginx/nginx.conf
找到 server_name _;
片段,在這行的下一行加入以下內容:
location / {
proxy_pass http://127.0.0.1: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;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# 設定檔案上傳的 HTTP 封包最大值為 100MB
client_max_body_size 100M;
proxy_busy_buffers_size 512k;
proxy_buffers 4 512k;
proxy_buffer_size 256k;
}
注意: ASP․NET Core 的 Kestrel 預設可接受用戶端 HTTP 要求封包大小上限為 30MB,請參考 How to increase file upload size in ASP.NET Core 進行設定。
設定讓 Nginx 可以 Reverse Proxy 轉發 HTTP 要求到 ASP.NET Core 網站:
sudo setsebool -P httpd_can_network_connect 1
上面這一個步驟是 Ubuntu 不太需要的,CentOS 沒做這段設定的話 Nginx 完全連不上 ASP.NET Core 網站!(🔥)
重新啟動 Nginx 服務
sudo systemctl restart nginx.service
sudo systemctl status nginx.service
-
開啟防火牆設定
sudo firewall-cmd --zone=public --add-port=80/tcp --permanent
sudo firewall-cmd --reload
-
測試網站連接
IP: http://ip.add.ress/
-
加強 MySQL/MariaDB 資料庫安全性
sudo mysql_secure_installation
相關連結