簡介
本文詳細介紹了在CentOS 7系統上部署.NET 8網站項目的完整流程,主要內容包括:系統版本更新與檢查、PostgreSQL數據庫的安裝配置(含防火墻設置、數據庫初始化及遠程訪問配置)、Nginx Web服務的安裝與防火墻配置。文章通過分步命令演示和效果截圖,詳細說明了關鍵操作步驟,如服務啟動與自啟設置、數據庫密碼修改、Nginx反向代理配置等,為在Linux環境下部署.NET項目提供了完整的技術參考。
1、更新系統版本
yum -y update
2、查看Centos系統版本
lsb_release -a
命令執行效果如下:
2.1、使用 hostnamectl 命令檢查 CentOS 版本
要獲取 CentOS 操作系統的分支號,可以使用 hostnamectl 命令,如下所示。此命令將打印 CentOS 操作系統所需的所有詳細信息:
hostnamectl
命令執行效果如下:
3、安裝PostgreSQL
PostgreSQL是一個功能強大的 開源 的關系型數據庫,底層基于C實現。
PostgreSQL使用的開源協議是PostgreSQL許可證,也被稱為PostgreSQL開放源碼許可證。這是一種自由軟件許可證,基于BSD許可證。該許可證允許用戶自由地使用、修改和分發PostgreSQL數據庫管理系統的源代碼。它還允許用戶將PostgreSQL用于商業目的,并且沒有強制性的要求或限制。這使得PostgreSQL成為一個受歡迎的開源數據庫解決方案。
PostgreSQL的名字由兩部分組成:Post和SQL。
"Post"是指Postgres,這是PostgreSQL的前身。Postgres是由Michael Stonebraker和他的團隊在加州大學伯克利分校開發的一個關系數據庫管理系統。它是早期關系數據庫系統的一個重要研究項目。
"SQL"代表結構化查詢語言(Structured Query Language),它是一種用于管理和操作關系數據庫的標準語言。PostgreSQL是一個完全支持SQL的關系數據庫管理系統。
因此,將這兩個部分合并在一起,就得到了PostgreSQL這個名字。
3.1、設置防火墻
3.1.1、開啟防火墻
sudo systemctl start firewalld
3.1.2、開放PostgreSQL默認端口防火墻
sudo firewall-cmd --zone=public --add-port=5432/tcp --permanent
命令執行效果如下:
3.1.3、重啟防火墻服務
sudo firewall-cmd --reload
命令執行效果如下:
3.2、查看所有可用的軟件包和版本
PostgreSQL 軟件倉庫包含所有可用的 PostgreSQL 版本的信息。您可以使用以下命令查看所有可用的軟件包和版本:
sudo yum list postgresql*
命令執行效果如下:
3.3、使用命令查看PostgreSQL是否已安裝
3.3.1、使用rpm命令(適用于Red Hat/CentOS系統)查看PostgreSQL是否已安裝
對于基于Red Hat/CentOS的系統,可以使用rpm命令來檢查某個軟件包是否已安裝。可以通過執行以下命令來檢查PostgreSQL是否已安裝:
如果該命令返回帶有”postgresql”關鍵字的軟件包列表,則表示PostgreSQL已安裝。否則,沒有任何輸出表示未安裝。
rpm -qa | grep postgresql
3.3.2、使用pg_config命令
pg_config是一個用于獲取關于當前已安裝的PostgreSQL的信息的命令。我們可以在終端中執行以下命令來檢查是否安裝了PostgreSQL:
pg_config --version
如果該命令返回版本號,則表示PostgreSQL已安裝。否則,將顯示命令未找到或包括PostgreSQL的相關信息。
3.4、安裝
sudo yum install postgresql-server
3.5、初始化PostgreSQL數據庫
sudo -u postgres initdb -D /var/lib/pgsql/data
命令執行效果如下:
3.6、重新啟動 PostgreSQL 服務
sudo systemctl restart postgresql
3.7、設置開機自啟(如果尚未設置)
sudo systemctl enable postgresql
3.8、驗證安裝
登錄到 PostgreSQL 數據庫,以驗證安裝是否成功。
sudo -u postgres psql
命令執行效果如下:
3.9、修改postgres用戶的登錄密碼
因為安裝之后,用戶“postgres”默認沒有登錄密碼,所以我們需要使用命令進行密碼修改。
alter user postgres with password 'a12345678@';
命令執行效果如下:
3.10、設置外部IP能夠連接本機的PostgreSQL數據庫
3.10.1、修改pg_hba.conf配置文件
執行命令,按“i”進入編輯模式:將postgresql.conf配置文件中的,新增一行“host all all 0.0.0.0/0 trust”,設置完成之后,按“ESC”,在輸入“:wq”進行強制保存并退出。
vi /var/lib/pgsql/data/pg_hba.conf
命令執行效果如下:
3.10.1、修改postgresql.conf配置文件
執行命令,按“i”進入編輯模式:將postgresql.conf配置文件中的listen_addresses屬性設置為"*",設置完成之后,按“ESC”,在輸入“:wq”進行強制保存并退出。
vi /var/lib/pgsql/data/postgresql.conf
命令執行效果如下:
3.11、重新啟動 PostgreSQL 服務
sudo systemctl restart postgresql
3.12、命令集
# 檢查服務狀態
sudo systemctl status postgresql# 啟動服務
sudo systemctl start postgresql# 停止服務
sudo systemctl stop postgresql# 重啟服務
sudo systemctl restart postgresql# 設置開機自啟動
sudo systemctl enable postgresql# 禁用開機自啟動
sudo systemctl disable postgresql
4、安裝Nginx Web 服務
Nginx (engine x) 是一個高性能的HTTP和反向代理web服務器,同時也提供了IMAP/POP3/SMTP服務。Nginx是由伊戈爾·賽索耶夫為俄羅斯訪問量第二的Rambler.ru站點(俄文:Рамблер)開發的,第一個公開版本0.1.0發布于2004年10月4日。其將源代碼以類BSD許可證的形式發布,因它的穩定性、豐富的功能集、簡單的配置文件和低系統資源的消耗而聞名。2011年6月1日,nginx 1.0.4發布。
Nginx是一款輕量級的Web 服務器/反向代理服務器及電子郵件(IMAP/POP3)代理服務器,在BSD-like 協議下發行。其特點是占有內存少,并發能力強,事實上nginx的并發能力在同類型的網頁服務器中表現較好,中國大陸使用nginx網站用戶有:百度、京東、新浪、網易、騰訊、淘寶等。
Nginx 是高性能的 HTTP 和反向代理的web服務器,處理高并發能力是十分強大的,能經受高負 載的考驗,有報告表明能支持高達 50,000 個并發連接數。
Nginx支持熱部署,啟動簡單,可以做到7*24不間斷運行。幾個月都不需要重新啟動。
4.1、在root權限下配置防火墻
sudo firewall-cmd --add-service=http --permanent
命令執行效果如下:
sudo firewall-cmd --reload
命令執行效果如下:
4.2、在root權限下安裝Nginx
sudo yum install nginx
在此處輸入“y”,回車等待安裝完成即可。
4.3、啟動Nginx
sudo systemctl start nginx
4.4、將Nginx服務設置為開機自啟(尚未設置的話)
sudo systemctl enable nginx
命令執行效果如下:
4.5、設置Nginx文件上傳的大小
在使用 Nginx 進行文件上傳時,為了防止用戶上傳過大的文件,導致服務器負載過高,需要對上傳文件的大小進行限制。
要調整Nginx允許的最大上傳文件大小,主要使用的是client_max_body_size指令。該指令可以放置在不同的配置塊中,影響其作用范圍:
- http塊:全局生效,適用于所有虛擬主機;
- server塊:僅對該站點生效;
- location塊:僅對特定路徑生效
4.5.1、修改 Nginx 配置文件
要設置文件上傳大小限制,我們需要修改 Nginx 的配置文件。打開 Nginx 的配置文件,在config目錄下面有個nginx.conf文件,找到 http 塊,添加以下內容:
http {client_max_body_size 800m;
}
client_max_body_size 指定了上傳文件的最大大小,這里設置為:800MB。
4.6、重啟Nginx服務
sudo systemctl restart nginx
4.7、驗證web服務
Web服務器搭建完成后,可以通過如下方式驗證是否搭建成功。
4.7.1、在root權限下查看服務器的IP地址
ip a
命令執行效果如下:
4.7.2、驗證web服務器是否搭建成功,用戶可選擇Linux或Windows系統進行驗證
執行如下命令,查看是否可以訪問網頁信息,服務搭建成功時,該網頁可以正常訪問
4.7.2.1、使用Linux系統驗證
curl http://10.1.12.3
命令執行效果如下:
執行如下命令,查看命令返回值是否為0,返回值為0,說明nginx服務器搭建成功。
echo $?
命令執行效果如下:
4.7.2.2、使用Windows系統驗證
打開瀏覽器,在地址欄輸入公網地址IP,如果能正常訪問網頁,說明nginx服務器搭建成功。
4.8、配置Nginx后無法訪問上級
錯誤日志: 1 connect() to 127.0.0.1:5163 failed (13: Permission denied) while connecting to upstream, client:
問題原因:
SELinux 限制導致的問題,因為:
- 服務僅監聽 IPv6(:::5163),但 Nginx 默認嘗試使用 IPv4 連接;
- SELinux 可能阻止 Nginx 通過 IPv4 訪問 IPv6 服務(即使是本地回環)
解決方案
永久配置 SELinux 允許 Nginx 網絡連接:
# 1、允許 Nginx 進行網絡連接(包括連接本地服務)
sudo setsebool -P httpd_can_network_connect 1# 2、允許 Nginx 使用網絡套接字
sudo setsebool -P httpd_can_network_relay 1# 3、重啟防火墻
sudo firewall-cmd --reload
5、安裝配置 .NET 環境
5.1、安裝.NET 8的SDK以及運行時
.NET 8下載官網鏈接:Download .NET 8.0 (Linux, macOS, and Windows) (microsoft.com)
5.2、查看系統支持的可用.NET 版本(通過官方源)
要查看 CentOS 7 官方源中可用的.NET 版本,可以使用以下命令:
# 安裝Microsoft官方源
sudo rpm -Uvh https://packages.microsoft.com/config/centos/7/packages-microsoft-prod.rpm# 列出可用的.NET SDK包
sudo yum list available dotnet-sdk*# 列出可用的.NET運行時包
sudo yum list available aspnetcore-runtime*
sudo yum list available dotnet-runtime*
5.3、新建存放安裝.NET的文件夾“software”
mkdir /自定義的目錄路徑/software
再向“software”文件夾中新建一個存放.NET SDK的安裝目錄“dotnet8”以及一個存放.NET 運行時的安裝目錄“dotnet8run”;
mkdir /自定義的目錄路徑/software/dotnet8 && mkdir /自定義的目錄路徑/software/dotnet8run
5.4、解壓并安裝.NET SDK
tar -zxvf bak/dotnet-sdk-你下載SDK的版本號-linux-x64.tar.gz -C /自定義的目錄路徑/software/dotnet8
5.4.1、添加環境變量
全局永久、所有用戶有效,執行以下命令進行環境變量文件修改:
sudo vi /etc/profile
在輸入命令之后,按“i”進行插入操作,在文件末尾,添加一下內容:
export PATH=$PATH:/自定義的目錄路徑/software/dotnet8
確認無誤之后,按“ESC”,再輸入:“:wq”保存并退出。(如果錯了,或者想重新寫入,可以按“ESC”,再輸入:“:q!”不保存并強制退出)。
5.4.2、更新profile文件
source /etc/profile
5.4.3、查看環境變量
echo $PATH
5.5、解壓安裝.NET 運行時
tar -zxvf bak/aspnetcore-runtime-你下載運行時的版本號-linux-x64.tar.gz -C /自定義的目錄路徑/software/dotnet8run
安裝完成之后,可使用命令“dotnet --info”查看SDK以及運行時。
5.6、錯誤解決
1、dotnet: /lib64/libstdc++.so.6: version GLIBCXX_3.4.20' not found (required by dotnet) dotnet: /lib64/libstdc++.so.6: version
GLIBCXX_3.4.21’ not found (required by dotnet)
這可能是因為CentOS版本太低或者缺少libstdc++.so.6 版本 GLIBCXX_3.4.20 和 GLIBCXX_3.4.21
解決方案如下:
cd /usr/local/lib64/# 下載最新版本的`下載最新版本的libstdc.so_.6.0.26`
wget http://www.vuln.cn/wp-content/uploads/2019/08/libstdc.so_.6.0.26.zip# 解壓
unzip libstdc.so_.6.0.26.zip# 將下載的最新版本拷貝到 /usr/lib64
cp libstdc++.so.6.0.26 /usr/lib64
cd /usr/lib64# 查看 /usr/lib64下libstdc++.so.6鏈接的版本
ls -l | grep libstdc++# 使用 cp -a 保留軟鏈接屬性(不跟隨鏈接復制目標文件),備份為 libstdc++.so.6.bak
sudo cp -a /usr/lib64/libstdc++.so.6 /usr/lib64/libstdc++.so.6.bak# 刪除原先的軟連接(不放心可以備份)
rm libstdc++.so.6# 使用最新的庫建立軟連接
ln -s libstdc++.so.6.0.26 libstdc++.so.6# 查看新版本,成功
strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX
6、部署.NET Core Web網站項目
將.NET Web網站項目進行發布,再使用XFTP上傳至服務器下自己創建的目錄下。
6.1、修改Nginx的配置文件
sudo vi /etc/nginx/nginx.conf
- 在“location”下添加以下內容:
location / {proxy_pass http://localhost:5163; #自己發布的.NET 項目所運行的url,若不知道在哪里查看,可在Windows發布的文件夾中找到項目.exe的文件,雙擊后,會彈出控制臺窗口,里面有個urlproxy_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;root /自定義目錄/wwwroot; #自己的項目路徑,.NET Core的Web項目需要定位到“wwwroot”文件
}
- 將“server_name”修改成:公網IP、域名或_(“_”表示任意域名或IP)即可;
- 將“proxy_pass http”修改成:自己發布的.NET 項目所運行的url即可(若不知道在哪里查看,可在Windows發布的文件夾中找到項目.exe的文件,雙擊后,會彈出控制臺窗口,里面有個url);
- 確認無誤之后,按“ESC”,再輸入:“:wq”保存并退出。(如果錯了,或者想重新寫入,可以按“ESC”,再輸入:“:q!”不保存并強制退出)。
6.2、重啟Nginx
sudo systemctl restart nginx
6.3、創建.NET Core Web項目系統服務
mkdir:創建文件夾;touch:創建文件
在“/etc/systemd/system/”目錄下創建一個新的服務文件,例如 web.service:
touch /etc/systemd/system/自定義的web服務名稱.service
6.3.1、修改服務文件內容
sudo vi /etc/systemd/system/自定義的web服務名稱.service
在輸入命令之后,按“i”進行插入操作,在“ExecStart”末尾,添加以下內容: /自定義的目錄路徑/software/dotnet8/dotnet
[Unit]
Description=ASP.NET Core applications
After=network.target[Service]
WorkingDirectory=/自定義的網站項目目錄路徑/
ExecStart=/自定義的目錄路徑/software/dotnet8/dotnet 自定義的網站項目目錄路徑/netproject.dll --urls "http://*:5163"
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=project
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false[Install]
WantedBy=multi-user.target
下面是此內容的一些關鍵方面:
- WorkingDirectory 是發布應用程序的目錄。
- ExecStart 是啟動應用程序的實際命令。
- Restart=always 不言而喻。 如果由于某種原因(無論是手動還是崩潰)而停止,則始終會啟動此過程。
- RestartSec=10 也是不言而喻的。 進程停止后,它將在經過 10 秒后啟動。
- SyslogIdentifier 很重要。 它表示“系統日志標識符”。 有關守護程序的信息以此名稱記錄在系統日志中。 還可以使用此標識符來查找進程的 PID。
- User 是管理服務的用戶。 它應存在于系統中,并具有應用程序文件的相應所有權。
- 可以在服務文件中設置任意數量的環境變量。
6.3.2、重載配置文件
sudo systemctl daemon-reload
6.3.3、啟動Web服務
執行以下命令啟動 web 服務:
sudo systemctl start 自定義的web服務名稱.service
6.3.4、設置Web服務開機自啟動
如果你希望 web 在系統啟動時自動啟動,可以執行以下命令設置開機自啟動:
sudo systemctl enable 自定義的web服務名稱.service
6.3.5、其他命令
#1、開機自啟
sudo systemctl enable 自定義的web服務名稱.service#2、啟動服務
sudo systemctl start 自定義的web服務名稱.service#3、查看狀態
sudo systemctl status 自定義的web服務名稱.service#4、關閉服務
sudo systemctl stop 自定義的web服務名稱.service#5、重啟服務
sudo systemctl restart 自定義的web服務名稱.service