Red Hat Enterprise Linux (RHEL)系统部署
一、准备工作
首先来详细说明一下在RHEL 9上部署系统的准备工作:
(一)、环境准备
1. 检查系统版本和内核信息
-
确保服务器的操作系统和内核版本满足应用需求:
bashcat /etc/redhat-release uname -r
2. 更新系统软件包
-
定期更新系统以修复安全漏洞并安装最新的补丁:
bashsudo subscription-manager register --username <RHN用户> --password <密码> sudo subscription-manager attach --auto sudo yum update -y sudo reboot # 如需内核更新
3. 安装必要的工具
-
根据应用需求安装开发工具、编译器或其他依赖项:
bashsudo yum groupinstall "Development Tools" -y sudo yum install -y epel-release # EPEL仓库 #确保服务器上已安装 .NET 运行时或 SDK。可以通过以下步骤安装: sudo rpm -Uvh https://packages.microsoft.com/config/rhel/8/packages-microsoft-prod.rpm sudo yum install -y dotnet-sdk-6.0 # 如果需要开发环境 sudo yum install -y aspnetcore-runtime-6.0 # 如果只需要运行时 验证安装: dotnet --version
4. 配置时间同步
-
确保服务器时间与实际时间一致,避免因时间不同步导致的问题:
bashsudo yum install chrony -y sudo systemctl start chronyd sudo systemctl enable chronyd
(二)、应用依赖安装
1. 安装运行时环境
-
根据应用类型安装所需的运行时环境(如 Java、Python、Node.js 等)。
-
示例:安装 OpenJDK 11:
bashsudo yum install java-11-openjdk-devel -y
-
示例:安装 Node.js:
bashcurl -sL https://rpm.nodesource.com/setup_16.x | sudo bash - sudo yum install nodejs -y
2. 安装数据库(如果需要)
-
如果应用依赖数据库(如 MySQL、PostgreSQL),需要安装并配置数据库服务。
示例:安装 MariaDB:
bashsudo yum install mariadb-server -y sudo systemctl start mariadb sudo systemctl enable mariadb
初始化数据库并设置密码:
bashsudo mysql_secure_installation
3. 安装 Web 服务器(如果需要)
-
如果应用需要通过 Web 服务器(如 Nginx 或 Apache)提供服务,则需安装和配置。
-
示例:安装 Nginx:
bashsudo yum install nginx -y sudo systemctl start nginx sudo systemctl enable nginx
4. 安装 Podman
-
在 Red Hat 系统上安装 Podman 非常简单,因为它是 RHEL 8 及以上版本的默认容器工具。
-
步骤:
bashsudo yum install -y podman
-
验证安装:
bashpodman --version
-
输出示例:
bashpodman version 3.4.2
(三)、配置防火墙和 SELinux
1. 开放防火墙端口
-
允许应用使用的端口通过防火墙:
bashsudo firewall-cmd --zone=public --add-port=8080/tcp --permanent sudo firewall-cmd --reload
2. 调整 SELinux 配置
-
如果 SELinux 导致权限问题,可以临时将其设置为宽容模式(permissive):
bashsudo setenforce 0
-
永久修改 SELinux 配置:
bashsudo vi /etc/selinux/config
将SELINUX=enforcing修改为SELINUX=permissive。
3. 配置 SELinux 规则(推荐)
-
如果需要更精细的控制,可以使用semanage和audit2allow工具生成规则:
bashsudo yum install policycoreutils-python-utils -y sudo semanage port -a -t http_port_t -p tcp 8080
4. 用户权限(如果需要)
-
创建专用用户:
bashsudo adduser deployuser sudo passwd deployuser sudo usermod -aG wheel deployuser # 允许sudo
-
检查目录权限
bashls -ld /app/wwwroot/Temp
-
查看当前用户
bashwhoami
-
查看该用户的 UID 和 GID
bashid uid=0(root) gid=0(root) groups=0(root)
-
为所有用户赋予完全的读/写/执行权限
bashsudo chmod -R 777 /opt/myapp/
-
更改目录的所有权:
bashsudo chown -R root:root /opt/myapp/
-
清理残留锁文件:
bashrm -f /run/user/$(id -u)/containers/lock
二、项目部署步骤
(一)、代码获取
1. Git克隆或上传代码:
bash
sudo yum install -y git
git clone https://github.com/your/project.git /opt/project
chown -R deployuser:deployuser /opt/project
2. 使用scp命令上传文件:
bash
scp /path/to/your/file user@server_ip:/remote/path/
示例:
bash
scp myapp.jar [email protected]:/opt/myapp/
3. 使用rsync(支持增量同步):
bash
rsync -avz /path/to/your/file user@server_ip:/remote/path/
4. 通过 FTP/SFTP 工具上传
-
使用工具如 FileZilla 或 WinSCP 连接到服务器并上传文件。
-
以 FileZilla 为例:
-
打开 FileZilla 客户端。
-
配置连接信息:
- 在顶部栏输入以下信息:
- 主机:
sftp://161.189.123.121
(注意添加sftp://
前缀) - 用户名:
user01
- 密码:如果使用密码认证,则输入密码;如果使用密钥认证,则留空。
- 端口:默认为
22
(SFTP 使用 SSH 协议)。
- 主机:
- 在顶部栏输入以下信息:
-
加载私钥文件
(如果使用密钥认证):
- 打开 FileZilla 的设置(Edit > Settings > Connection > SFTP)。
- 添加你的
.ppk
文件路径。
-
连接到服务器:
- 点击"快速连接"按钮,等待连接成功。
-
上传文件:
- 在左侧窗口选择本地文件夹,在右侧窗口选择远程文件夹。
- 拖拽文件或右键选择"上传"。
-
5. 使用 pscp
上传文件
bash
pscp -i D:\path\to\private_key.ppk -r D:\local\path [email protected]:/remote/path
- 参数说明:
-i
:指定私钥文件(如.ppk
文件)。-r
:递归上传整个目录。D:\local\path
:本地文件或目录路径。[email protected]:/remote/path
:目标服务器的用户名、IP 地址和远程路径。
(二)、服务器远程连接方式
-
Linux/Mac 用户可以直接使用终端:
bashssh user@server_ip
-
Windows 用户可以使用 PuTTY 或 Windows 自带的 SSH 客户端(Windows 10 及以上版本支持)。
1. 使用 SSH 连接
-
验证连接
-
成功连接后,会进入服务器的命令行界面。
-
检查服务器的基本信息:
bashuname -a cat /etc/redhat-release
-
-
配置 SSH 密钥登录(推荐)
-
在本地生成密钥对:
bashssh-keygen -t rsa -b 4096
-
将公钥上传到服务器:
bashssh-copy-id user@server_ip
-
测试免密登录:
bashssh user@server_ip
-
2. 使用 PuTTY 连接
(1) 下载和安装 PuTTY
-
下载 PuTTY
-
前往 PuTTY 的官方网站:www.chiark.greenend.org.uk/~sgtatham/p...
-
根据你的系统架构(32 位或 64 位),选择合适的版本下载。
-
-
安装 PuTTY
-
下载完成后,双击安装文件并按照提示完成安装。
-
安装过程中可以选择额外的组件(如
pscp
、plink
等工具),根据需要勾选即可。
-
(2) 配置 PuTTY 并连接服务器
-
打开 PuTTY
-
安装完成后,启动 PuTTY 应用程序。
-
配置会话
在 PuTTY 主界面中,按照以下步骤配置连接参数:
- 输入服务器地址 :
- 在 "Host Name (or IP address)" 字段中输入服务器的 IP 地址或域名。 示例:
192.168.1.100
或example.com
- 在 "Port" 字段中输入 SSH 默认端口号(通常是
22
)。 - 确保 "Connection type" 设置为
SSH
。 - 在左侧"Data"栏目中配置"username"为当前用户名,默认选择"prompt"(如果需要)。
- 在 "Host Name (or IP address)" 字段中输入服务器的 IP 地址或域名。 示例:
- 保存会话(可选) :
- 在 "Saved Sessions" 输入框中为当前配置命名(例如
MyServer
)。 - 点击右侧的 "Save" 按钮保存会话配置。
- 在 "Saved Sessions" 输入框中为当前配置命名(例如
- 输入服务器地址 :
(3) 配置身份验证(如果使用密钥认证)
如果服务器要求使用 SSH 密钥认证,请按照以下步骤操作:
- 生成密钥对(如果尚未生成) :
- 使用 PuTTYgen 工具生成密钥对:
- 打开 PuTTYgen(通常随 PuTTY 安装包一起提供)。
- 点击 "Generate" 按钮生成公钥和私钥。
- 将公钥上传到服务器的
~/.ssh/authorized_keys
文件中。 - 保存私钥(
.ppk
文件)到本地计算机。
- 使用 PuTTYgen 工具生成密钥对:
- 加载私钥 :
- 在 PuTTY 中,导航到左侧菜单栏中的
Connection > SSH > Auth
。 - 点击 "Browse" 按钮,选择之前保存的私钥文件(
.ppk
)。
- 在 PuTTY 中,导航到左侧菜单栏中的
(4) 启动连接
- 点击主界面底部的 "Open" 按钮,启动连接。
- 如果是第一次连接到该服务器,可能会弹出安全警告,提示主机密钥未被识别。点击 "Yes" 继续。
(5) 登录到服务器
-
输入用户名和密码
-
连接成功后,PuTTY 会显示一个终端窗口,提示你输入用户名:
bashlogin as:
输入服务器的用户名(例如root或普通用户)。
-
接着输入密码(密码输入时不会显示字符,这是正常现象)。
-
-
成功登录
- 登录成功后,你会看到服务器的命令行界面,可以开始执行命令。
(三)、 基础的服务启动方式
1. 手动启动
直接运行应用程序:
bash
cd /opt/myapp/
dotnet MyAspNetCoreApp.dll
此时,应用程序会以默认端口(通常是 5000)运行,并且可以在前台查看日志输出。
注意事项:
- 手动启动的方式适用于调试或临时运行。
- 如果关闭终端,应用程序会随之停止。
2. 使用 nohup
后台运行
如果希望将应用程序作为后台任务运行,可以使用 nohup
命令:
bash
nohup dotnet MyAspNetCoreApp.dll > app.log 2>&1 &
解释:
nohup
:即使关闭终端,进程仍然继续运行。> app.log
:将标准输出写入app.log
文件。2>&1
:将错误输出重定向到标准输出。&
:将命令放入后台运行。
检查后台进程:
bash
ps aux | grep MyAspNetCoreApp
3. 使用 screen
或 tmux
如果你希望在一个会话中管理多个任务,可以使用 screen
或 tmux
工具。
示例:使用 screen
-
启动一个新的screen会话:
bashscreen -S myapp
-
在会话中运行应用程序:
bashdotnet MyAspNetCoreApp.dll
-
分离会话(按
Ctrl+A
,然后按D
)。 -
重新连接会话:
bashscreen -r myapp
4. 使用 Systemd 配置后台服务
为了实现更可靠的后台运行和服务管理,推荐使用 Systemd
配置服务。
步骤:
-
创建服务文件 创建一个新的服务文件,例如
/etc/systemd/system/myapp.service
:bashsudo vi /etc/systemd/system/myapp.service #按 i 键进入"插入模式"。然后开始编辑文件。 #添加或修改内容: 编辑完你需要的内容(例如添加环境变量)之后,按 Esc 键退出插入模式,返回命令模式。 # 保存并退出: 在命令模式下,输入以下命令保存并退出文件: :wq # 重新加载配置文件: 修改完 /etc/profile 后,你可以使用以下命令让改动生效: source /etc/profile # 仅保存不退出 :w #仅退出不保存 :q! #然后按 Enter。 #检查环境变量是否设置
-
编辑服务文件内容 添加以下内容:
ini[Unit] Description=My ASP.NET Core Application After=network.target [Service] WorkingDirectory=/opt/myapp ExecStart=/usr/bin/dotnet /opt/myapp/MyAspNetCoreApp.dll Restart=always RestartSec=10 SyslogIdentifier=myapp User=root Environment=ASPNETCORE_ENVIRONMENT=Production Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false [Install] WantedBy=multi-user.target
-
重新加载 Systemd 配置
bashsudo systemctl daemon-reload
-
启动服务
bashsudo systemctl start myapp
-
设置开机自启
bashsudo systemctl enable myapp
-
查看服务状态
bashsudo systemctl status myapp
-
查看日志 使用
journalctl
查看服务日志:bashjournalctl -u myapp -f
5. 使用反向代理(Nginx 或 Apache)
如果需要通过标准 HTTP 端口(如 80 或 443)访问 ASP.NET Core 应用程序,可以配置反向代理。
配置 Nginx 示例
-
安装 Nginx:
bashsudo yum install nginx -y sudo systemctl start nginx sudo systemctl enable nginx
-
配置 Nginx 反向代理: 编辑 Nginx 配置文件(例如
/etc/nginx/nginx.conf
或/etc/nginx/conf.d/myapp.conf
):nginxserver { listen 80; server_name your-domain.com; 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; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
-
测试并重启 Nginx:
bashsudo nginx -t sudo systemctl restart nginx
6. 使用容器化技术(Podman/Docker)
如果希望使用容器化技术,可以将 ASP.NET Core 应用程序打包为容器镜像。
步骤:
-
创建
Dockerfile
:dockerfileFROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["MyAspNetCoreApp.csproj", "./"] RUN dotnet restore "./MyAspNetCoreApp.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "MyAspNetCoreApp.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "MyAspNetCoreApp.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "MyAspNetCoreApp.dll"]
-
构建镜像:
bashpodman build -t myapp .
-
运行容器:
bashpodman run -d -p 8080:80 --name myapp-container myapp #复杂需求 podman run -d --name myapp-container \ --restart unless-stopped \ #后台运行 -v /home/service/project:/root/.aspnet/DataProtection-Keys \ #增加挂载的主机目录(为了数据持久化、共享数据等需求) -v /home/service/project/wwwroot:/app/wwwroot \ #挂载文件夹 -p 8080:80 \ #端口 myapp #其他后台运行配置方式 --restart no(默认) 不自动重启 临时测试,手动控制 --restart on-failure[:max-retries] 仅在失败时重启(可设置最大重试次数) 需要容错但避免无限重启 --restart unless-stopped 总是重启,除非手动停止 生产环境长期运行的服务 --restart always 无条件重启(即使手动停止) 需要强制保持运行的场景(少用)
-
查看日志
bashpodman logs myapp-container
-
重启容器
bashpodman restart myapp-container
-
关闭容器
bashpodman stop myapp-container
-
删除容器
bashpodman rm myapp-container