简介
本文详细介绍了在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