Red Hat Enterprise Linux (RHEL)系统部署

Red Hat Enterprise Linux (RHEL)系统部署

一、准备工作

首先来详细说明一下在RHEL 9上部署系统的准备工作:

(一)、环境准备

1. 检查系统版本和内核信息
  • 确保服务器的操作系统和内核版本满足应用需求:

    bash 复制代码
    cat /etc/redhat-release
    uname -r
2. 更新系统软件包
  • 定期更新系统以修复安全漏洞并安装最新的补丁:

    bash 复制代码
    sudo subscription-manager register --username <RHN用户> --password <密码>
    sudo subscription-manager attach --auto
    sudo yum update -y
    sudo reboot  # 如需内核更新
3. 安装必要的工具
  • 根据应用需求安装开发工具、编译器或其他依赖项:

    bash 复制代码
    sudo 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. 配置时间同步
  • 确保服务器时间与实际时间一致,避免因时间不同步导致的问题:

    bash 复制代码
    sudo yum install chrony -y
    sudo systemctl start chronyd
    sudo systemctl enable chronyd

(二)、应用依赖安装

1. 安装运行时环境
  • 根据应用类型安装所需的运行时环境(如 Java、Python、Node.js 等)。

  • 示例:安装 OpenJDK 11:

    bash 复制代码
    sudo yum install java-11-openjdk-devel -y
  • 示例:安装 Node.js:

    bash 复制代码
    curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash -
    sudo yum install nodejs -y
2. 安装数据库(如果需要)
  • 如果应用依赖数据库(如 MySQL、PostgreSQL),需要安装并配置数据库服务。

    示例:安装 MariaDB:

    bash 复制代码
    sudo yum install mariadb-server -y
    sudo systemctl start mariadb
    sudo systemctl enable mariadb

    初始化数据库并设置密码:

    bash 复制代码
    sudo mysql_secure_installation
3. 安装 Web 服务器(如果需要)
  • 如果应用需要通过 Web 服务器(如 Nginx 或 Apache)提供服务,则需安装和配置。

  • 示例:安装 Nginx:

    bash 复制代码
    sudo yum install nginx -y
    sudo systemctl start nginx
    sudo systemctl enable nginx
4. 安装 Podman
  • 在 Red Hat 系统上安装 Podman 非常简单,因为它是 RHEL 8 及以上版本的默认容器工具。

  • 步骤:

    bash 复制代码
    sudo yum install -y podman
  • 验证安装:

    bash 复制代码
    podman --version
  • 输出示例:

    bash 复制代码
    podman version 3.4.2

(三)、配置防火墙和 SELinux

1. 开放防火墙端口
  • 允许应用使用的端口通过防火墙:

    bash 复制代码
    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    sudo firewall-cmd --reload
2. 调整 SELinux 配置
  • 如果 SELinux 导致权限问题,可以临时将其设置为宽容模式(permissive):

    bash 复制代码
    sudo setenforce 0
  • 永久修改 SELinux 配置:

    bash 复制代码
    sudo vi /etc/selinux/config

    将SELINUX=enforcing修改为SELINUX=permissive。

3. 配置 SELinux 规则(推荐)
  • 如果需要更精细的控制,可以使用semanage和audit2allow工具生成规则:

    bash 复制代码
    sudo yum install policycoreutils-python-utils -y
    sudo semanage port -a -t http_port_t -p tcp 8080
4. 用户权限(如果需要)
  • 创建专用用户:

    bash 复制代码
    sudo adduser deployuser
    sudo passwd deployuser
    sudo usermod -aG wheel deployuser  # 允许sudo
  • 检查目录权限

    bash 复制代码
    ls -ld /app/wwwroot/Temp
  • 查看当前用户

    bash 复制代码
    whoami
  • 查看该用户的 UID 和 GID

    bash 复制代码
    id
    uid=0(root) gid=0(root) groups=0(root)
  • 为所有用户赋予完全的读/写/执行权限

    bash 复制代码
    sudo chmod -R 777 /opt/myapp/
  • 更改目录的所有权:

    bash 复制代码
    sudo chown -R root:root /opt/myapp/
  • 清理残留锁文件:

    bash 复制代码
    rm -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 用户可以直接使用终端:

    bash 复制代码
    ssh user@server_ip
  • Windows 用户可以使用 PuTTY 或 Windows 自带的 SSH 客户端(Windows 10 及以上版本支持)。

1. 使用 SSH 连接
  • 验证连接

    • 成功连接后,会进入服务器的命令行界面。

    • 检查服务器的基本信息:

      bash 复制代码
      uname -a
      cat /etc/redhat-release
  • 配置 SSH 密钥登录(推荐)

    • 在本地生成密钥对:

      bash 复制代码
      ssh-keygen -t rsa -b 4096
    • 将公钥上传到服务器:

      bash 复制代码
      ssh-copy-id user@server_ip
    • 测试免密登录:

      bash 复制代码
      ssh user@server_ip
2. 使用 PuTTY 连接

(1) 下载和安装 PuTTY

  • 下载 PuTTY

  • 安装 PuTTY

    • 下载完成后,双击安装文件并按照提示完成安装。

    • 安装过程中可以选择额外的组件(如 pscpplink 等工具),根据需要勾选即可。

(2) 配置 PuTTY 并连接服务器

  • 打开 PuTTY

  • 安装完成后,启动 PuTTY 应用程序。

  • 配置会话

    在 PuTTY 主界面中,按照以下步骤配置连接参数:

    • 输入服务器地址
      • 在 "Host Name (or IP address)" 字段中输入服务器的 IP 地址或域名。 示例:192.168.1.100example.com
      • 在 "Port" 字段中输入 SSH 默认端口号(通常是 22)。
      • 确保 "Connection type" 设置为 SSH
      • 在左侧"Data"栏目中配置"username"为当前用户名,默认选择"prompt"(如果需要)。
    • 保存会话(可选)
      • 在 "Saved Sessions" 输入框中为当前配置命名(例如 MyServer)。
      • 点击右侧的 "Save" 按钮保存会话配置。

(3) 配置身份验证(如果使用密钥认证)

​ 如果服务器要求使用 SSH 密钥认证,请按照以下步骤操作:

  • 生成密钥对(如果尚未生成)
    • 使用 PuTTYgen 工具生成密钥对:
      • 打开 PuTTYgen(通常随 PuTTY 安装包一起提供)。
      • 点击 "Generate" 按钮生成公钥和私钥。
      • 将公钥上传到服务器的 ~/.ssh/authorized_keys 文件中。
      • 保存私钥(.ppk 文件)到本地计算机。
  • 加载私钥
    • 在 PuTTY 中,导航到左侧菜单栏中的 Connection > SSH > Auth
    • 点击 "Browse" 按钮,选择之前保存的私钥文件(.ppk)。

(4) 启动连接

  • 点击主界面底部的 "Open" 按钮,启动连接。
  • 如果是第一次连接到该服务器,可能会弹出安全警告,提示主机密钥未被识别。点击 "Yes" 继续。

(5) 登录到服务器

  • 输入用户名和密码

    • 连接成功后,PuTTY 会显示一个终端窗口,提示你输入用户名:

      bash 复制代码
      login 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. 使用 screentmux

如果你希望在一个会话中管理多个任务,可以使用 screentmux 工具。

示例:使用 screen

  • 启动一个新的screen会话:

    bash 复制代码
    screen -S myapp
  • 在会话中运行应用程序:

    bash 复制代码
    dotnet MyAspNetCoreApp.dll
  • 分离会话(按 Ctrl+A,然后按 D)。

  • 重新连接会话:

    bash 复制代码
    screen -r myapp
4. 使用 Systemd 配置后台服务

为了实现更可靠的后台运行和服务管理,推荐使用 Systemd 配置服务。

步骤:
  • 创建服务文件 创建一个新的服务文件,例如 /etc/systemd/system/myapp.service

    bash 复制代码
    sudo 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 配置

    bash 复制代码
    sudo systemctl daemon-reload
  • 启动服务

    bash 复制代码
    sudo systemctl start myapp
  • 设置开机自启

    bash 复制代码
    sudo systemctl enable myapp
  • 查看服务状态

    bash 复制代码
    sudo systemctl status myapp
  • 查看日志 使用 journalctl 查看服务日志:

    bash 复制代码
    journalctl -u myapp -f
5. 使用反向代理(Nginx 或 Apache)

如果需要通过标准 HTTP 端口(如 80 或 443)访问 ASP.NET Core 应用程序,可以配置反向代理。

配置 Nginx 示例

  • 安装 Nginx:

    bash 复制代码
    sudo yum install nginx -y
    sudo systemctl start nginx
    sudo systemctl enable nginx
  • 配置 Nginx 反向代理: 编辑 Nginx 配置文件(例如 /etc/nginx/nginx.conf/etc/nginx/conf.d/myapp.conf):

    nginx 复制代码
    server {
        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:

    bash 复制代码
    sudo nginx -t
    sudo systemctl restart nginx
6. 使用容器化技术(Podman/Docker)

如果希望使用容器化技术,可以将 ASP.NET Core 应用程序打包为容器镜像。

步骤:

  • 创建 Dockerfile

    dockerfile 复制代码
    FROM 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"]
  • 构建镜像:

    bash 复制代码
    podman build -t myapp .
  • 运行容器:

    bash 复制代码
    podman 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	无条件重启(即使手动停止)	需要强制保持运行的场景(少用)
  • 查看日志

    bash 复制代码
    podman logs myapp-container
  • 重启容器

    bash 复制代码
    podman restart myapp-container
  • 关闭容器

    bash 复制代码
    podman stop myapp-container
  • 删除容器

    bash 复制代码
    podman rm myapp-container
相关推荐
liulilittle2 小时前
Linux 高级路由配置策略之打通双/三网卡路由转发
linux·运维·网络
_Chipen2 小时前
5.9-selcct_poll_epoll 和 reactor 的模拟实现
linux·网络·网络协议·tcp/ip
学习编程的gas3 小时前
Linux基本指令(一)
linux·运维·服务器
悟空空心3 小时前
iperf3的介绍与舒勇
linux·网络
一尘之中3 小时前
二进制与十六进制数据转换:原理、实现与应用
linux·c语言·人工智能
风口上的吱吱鼠3 小时前
记录 ubuntu 安装中文语言出现 software database is broken
linux·服务器·前端
newdf观察者3 小时前
penEuler操作系统结合豆包测试github仓库8086-Emulator项目
linux·运维·github
绵绵细雨中的乡音3 小时前
Linux进程学习【进程地址】
linux·学习
Lw老王要学习3 小时前
Linux架构篇、第四章_ELK与EFK-7.17.9的日志管理
linux·运维·elk·架构·云计算
知北游天3 小时前
Linux:进程间通信---消息队列&&信号量
linux·服务器