nginx+php部署walle,发布php站点

nginx+php部署walle,发布php站点

环境说明

  • 服务器:Linux node-10-0-0-13

  • 系统版本:Ubuntu 24.04 LTS(6.14.0-27-generic)

  • 架构:x86_64

  • 目标:部署Walle 2.0(开源代码发布系统),并通过Walle发布PHP站点

前置准备

1. 服务器基础环境检查与更新

bash 复制代码
# 更新系统包索引(apt的软件源缓存),确保能获取最新的软件包版本
sudo apt update 
# 升级已安装的软件包到最新版本,-y表示自动确认所有提示(无需手动输入y)
sudo apt upgrade -y

# 安装基础依赖工具:
# wget/curl:下载文件;git:克隆代码仓库;zip/unzip:解压/压缩文件;
# vim:文本编辑器;net-tools:网络工具(如ifconfig);
# software-properties-common:管理软件源(添加PPA源必需)
sudo apt install -y wget curl git zip unzip vim net-tools software-properties-common

为什么要做:新服务器默认包索引可能过时,升级包可修复安全漏洞;基础工具是后续部署的必备前提,比如git用于拉取Walle源码,curl用于下载Composer。

2. 关闭防火墙/放行端口(可选)

bash 复制代码
# Ubuntu 24.04 默认使用ufw防火墙,放行22端口(SSH远程登录)
sudo ufw allow 22/tcp
# 放行80端口(HTTP访问Walle和PHP站点)
sudo ufw allow 80/tcp
# 放行443端口(HTTPS,后续可选配置)
sudo ufw allow 443/tcp
# 重新加载ufw规则,使放行配置生效
sudo ufw reload

# 临时关闭selinux(如果开启),setenforce 0表示临时禁用(重启失效)
sudo setenforce 0
# 永久关闭selinux:修改配置文件,将SELINUX值改为disabled,重启后生效
# SELINUX是Linux安全模块,可能限制Nginx/PHP访问文件,部署初期关闭避免权限问题
sudo sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

为什么要做:防火墙默认会拦截80/443端口,导致外部无法访问Walle和PHP站点;SELINUX的强制访问控制可能干扰服务运行,部署阶段临时关闭简化问题排查。

第一步:安装并配置PHP环境

Walle 2.0 要求PHP >= 7.4(推荐8.1),PHP 8.1中JSON扩展已整合到核心,无需单独安装。

1. 添加PHP源

bash 复制代码
# 添加Ondrej PHP源(Ubuntu官方维护的PHP源,提供最新的PHP版本)
# Ubuntu默认源的PHP版本较旧,PPA源能获取8.1版本且更新及时
sudo add-apt-repository ppa:ondrej/php -y
# 刷新包索引,使新增的PPA源生效
sudo apt update

为什么要做:Ubuntu 24.04默认源的PHP版本可能不满足Walle要求,Ondrej PPA是最稳定的第三方PHP源,确保安装到兼容的PHP 8.1。

2. 安装PHP及扩展(修正版)

bash 复制代码
# 安装PHP 8.1核心及扩展,逐个解释:
# php8.1:PHP核心程序;php8.1-fpm:PHP FastCGI进程管理器(Nginx解析PHP必需);
# php8.1-mysql:MySQL数据库扩展(Walle连接MariaDB必需);
# php8.1-curl:curl扩展(Walle调用HTTP接口、拉取Git仓库可能用到);
# php8.1-gd:GD库(处理图片,Walle后台上传图片/验证码必需);
# php8.1-mbstring:多字节字符串扩展(处理中文等多字符集,Walle界面显示必需);
# php8.1-xml:XML扩展(解析XML配置,Composer依赖);
# php8.1-zip:ZIP扩展(解压Composer下载的依赖包);
# php8.1-bcmath:高精度数学扩展(Walle计算、加密等场景用到);
# php8.1-redis:Redis扩展(Walle缓存、队列功能可选依赖);
# 注:php8.1-json已整合到PHP 8.1核心,无需单独安装
sudo apt install -y php8.1 php8.1-fpm php8.1-mysql php8.1-curl php8.1-gd php8.1-mbstring php8.1-xml php8.1-zip php8.1-bcmath php8.1-redis

# 验证PHP版本,确认安装的是8.1.x版本(确保版本符合Walle要求)
php -v
# 验证JSON扩展是否内置启用(PHP 8.1默认开启,输出json表示正常)
php -m | grep json
# 验证PHP-FPM状态,确保服务已启动(active (running)表示正常)
sudo systemctl status php8.1-fpm

为什么要做:Walle是PHP开发的Web系统,必须安装对应版本的PHP及扩展,缺少任一扩展都会导致Walle功能异常(比如mbstring缺失会导致中文乱码,mysql缺失无法连接数据库)。

3. 配置PHP-FPM(优化)

bash 复制代码
# 编辑PHP-FPM的主配置文件(php.ini),调整运行参数
sudo vim /etc/php/8.1/fpm/php.ini

# 需要修改的参数及含义:
# memory_limit = 512M:PHP进程最大内存限制,Walle处理大文件/多任务需提高(默认128M可能不足)
# upload_max_filesize = 100M:允许上传的单个文件最大大小(Walle上传部署包/配置文件需放宽)
# post_max_size = 100M:POST请求最大数据量,需与upload_max_filesize一致(否则上传会失败)
# max_execution_time = 300:PHP脚本最大执行时间(秒),Walle部署脚本可能需要较长时间运行(默认30秒不足)
# date.timezone = Asia/Shanghai:设置PHP时区为上海(避免Walle日志/时间显示错误)

# 重启PHP-FPM,使配置修改生效
sudo systemctl restart php8.1-fpm
# 设置PHP-FPM开机自启,确保服务器重启后自动运行
sudo systemctl enable php8.1-fpm

为什么要做:PHP默认配置偏保守,针对Walle的使用场景优化参数,避免因内存不足、执行时间过短导致部署失败;时区错误会导致Walle的发布记录、日志时间混乱。

第二步:安装并配置MySQL(MariaDB)

Walle需要数据库存储用户、项目、发布记录等数据,MariaDB是MySQL的开源分支,兼容性更好。

1. 安装MariaDB

bash 复制代码
# 安装MariaDB服务器和客户端(服务器端提供数据库服务,客户端用于命令行操作)
sudo apt install -y mariadb-server mariadb-client

# 启动MariaDB服务
sudo systemctl start mariadb
# 设置MariaDB开机自启
sudo systemctl enable mariadb

# 验证MariaDB状态,确保服务正常运行
sudo systemctl status mariadb

# 安全初始化MariaDB,执行以下操作加固安全:
# 1. 设置root密码;2. 删除匿名用户(避免未授权访问);3. 禁止root远程登录(可选);
# 4. 删除测试数据库;5. 刷新权限表
sudo mysql_secure_installation

初始化交互步骤及含义

  • Enter current password for root (enter for none):直接回车(默认无密码)
  • Set root password? [Y/n]:Y → 设置root密码(核心!防止数据库被未授权访问)
  • Remove anonymous users? [Y/n]:Y → 删除匿名用户(匿名用户可能被恶意利用)
  • Disallow root login remotely? [Y/n]:N(如果需要远程管理数据库则选N,否则选Y)
  • Remove test database and access to it? [Y/n]:Y → 删除测试库(测试库无实际用途,减少攻击面)
  • Reload privilege tables now? [Y/n]:Y → 立即刷新权限(使配置生效)

为什么要做:数据库是Walle的核心数据存储,必须安装并加固安全,默认配置存在安全隐患(如空密码、匿名用户),容易被攻击。

2. 创建Walle数据库

bash 复制代码
# 登录MySQL,-u指定用户(root),-p表示需要输入密码(刚设置的root密码)
mysql -uroot -p

# 创建Walle数据库,字符集设为utf8mb4(兼容emoji等特殊字符,避免中文乱码)
# COLLATE utf8mb4_unicode_ci:排序规则,确保中文排序正确
CREATE DATABASE walle CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

# 创建walle数据库用户,密码替换为实际值(避免使用root用户直接连接,降低权限风险)
CREATE USER 'walle'@'localhost' IDENTIFIED BY 'your_password';
# 授予walle用户对walle数据库的所有权限(仅授权必要数据库,最小权限原则)
GRANT ALL PRIVILEGES ON walle.* TO 'walle'@'localhost';
# 刷新权限表,使授权生效
FLUSH PRIVILEGES;

# 退出MySQL命令行
exit;

为什么要做:使用专用用户(而非root)连接数据库,符合最小权限原则,即使Walle程序被入侵,也不会泄露root密码;utf8mb4字符集是目前最兼容的字符集,避免Walle存储中文/特殊字符时乱码。

第三步:安装并配置Nginx

Nginx是高性能的Web服务器,负责接收HTTP请求并转发给PHP-FPM解析PHP脚本。

1. 安装Nginx

bash 复制代码
# 安装Nginx Web服务器
sudo apt install -y nginx

# 启动Nginx服务
sudo systemctl start nginx
# 设置Nginx开机自启
sudo systemctl enable nginx

# 验证Nginx状态,确保服务正常运行
sudo systemctl status nginx

为什么要做:Walle是Web应用,需要Web服务器对外提供访问;Nginx比Apache更轻量、性能更好,适合作为PHP-FPM的前端服务器。

2. 配置Nginx虚拟主机(Walle)

bash 复制代码
# 创建Walle站点配置文件(sites-available存放配置模板,sites-enabled存放启用的配置)
sudo vim /etc/nginx/sites-available/walle.conf

# 配置文件内容及逐行解释:
server {
    listen 80; # 监听80端口(HTTP默认端口)
    server_name node-10-0-0-13; # 替换为服务器IP/域名,用于匹配请求
    root /var/www/walle/web; # Walle代码的Web根目录(必须指向web目录,否则访问404)
    index index.php index.html index.htm; # 默认访问的首页文件,优先解析index.php

    # 日志配置:记录访问日志和错误日志,便于排查问题
    access_log /var/log/nginx/walle_access.log;
    error_log /var/log/nginx/walle_error.log;

    # 伪静态配置(Walle基于Laravel开发,必需):
    # 尝试访问请求的文件/目录,若不存在则转发到index.php处理(实现URL美化)
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # PHP-FPM配置:解析.php文件
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock; # PHP-FPM的UNIX套接字路径(Ubuntu 24.04默认路径)
        fastcgi_index index.php; # 默认的PHP入口文件
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; # 告诉PHP-FPM要执行的脚本路径
        include fastcgi_params; # 加载Nginx的FastCGI默认参数(如请求头、环境变量)
    }

    # 禁止访问.htaccess文件(Apache的配置文件,Nginx不识别,且避免泄露敏感信息)
    location ~ /\.ht {
        deny all;
    }

    # 静态资源缓存:JS/CSS/图片等静态文件设置30天缓存,减轻服务器压力
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires 30d; # 缓存有效期30天
        add_header Cache-Control "public, max-age=2592000"; # 客户端缓存控制
    }
}

# 启用Walle站点配置:创建软链接到sites-enabled目录(Nginx仅加载该目录下的配置)
sudo ln -s /etc/nginx/sites-available/walle.conf /etc/nginx/sites-enabled/

# 检查Nginx配置语法(关键!避免配置错误导致Nginx无法启动)
sudo nginx -t

# 重启Nginx,使配置生效
sudo systemctl restart nginx

为什么要做:Nginx默认配置无法适配Walle的目录结构和URL规则,必须自定义虚拟主机配置;伪静态、PHP-FPM转发、静态资源缓存都是Walle正常运行的关键。

第四步:安装并配置Walle 2.0

1. 安装Composer(PHP包管理工具)

bash 复制代码
#该命令会从 Composer 官方获取实时的最新哈希值,避免手动复制过期值的问题。
#如果输出Installer verified,说明验证通过;若仍失败,先检查网络(是否能访问https://getcomposer.org)。
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === file_get_contents('https://composer.github.io/installer.sig')) { echo 'Installer verified'.PHP_EOL; } else { echo 'Installer corrupt'.PHP_EOL; unlink('composer-setup.php'); }"
#验证通过后,执行安装(全局安装到/usr/local/bin,方便全局调用)
php composer-setup.php --install-dir=/usr/local/bin --filename=composer
# 验证Composer安装成功(输出版本号表示正常)
composer -V

为什么要做:Walle的源码只包含核心代码,依赖的第三方库(如Laravel框架)需要通过Composer下载;国内切换阿里云源可大幅提升下载速度。

2. 下载Walle源码

bash 复制代码
# 创建Walle代码目录(统一存放Web项目,符合Linux目录规范)
sudo mkdir -p /var/www/walle
# 修改目录所有者为当前用户(避免后续克隆/安装依赖时权限不足)
sudo chown -R $USER:$USER /var/www/walle

# 克隆Walle官方源码到指定目录(Git是分布式版本控制系统,拉取最新稳定版)
git clone https://github.com/meolu/walle-web.git /var/www/walle

# 进入Walle目录(后续操作需在源码根目录执行)
cd /var/www/walle

为什么要做:/var/www是Linux默认的Web项目存放目录,便于管理;克隆源码是获取Walle程序的唯一方式。

3. 安装Walle依赖

bash 复制代码
# 安装Walle的PHP依赖:
# --no-dev:不安装开发环境依赖(如测试工具),生产环境无需;
# -o:优化自动加载文件(提升PHP执行效率)
composer install --no-dev -o

为什么要做:Walle基于Laravel框架开发,依赖大量第三方库,必须通过Composer安装后才能运行。

4. 配置Walle

bash 复制代码
# 复制示例配置文件为实际配置文件(.env是Laravel框架的环境配置文件,Walle读取该文件的配置)
cp .env.example .env

# 编辑.env配置文件(核心配置项)
vim .env

# 关键配置项解释:
# APP_ENV=production:运行环境为生产环境(禁用调试模式,更安全)
# APP_DEBUG=false:关闭调试模式(避免泄露敏感信息)
# APP_KEY=base64:xxx:应用密钥(用于加密会话、Cookie等,必须生成)
# APP_URL=http://node-10-0-0-13:Walle的访问地址(服务器IP/域名)
# 
# 数据库配置(对应之前创建的数据库):
# DB_CONNECTION=mysql:数据库类型(MySQL/MariaDB)
# DB_HOST=127.0.0.1:数据库地址(本地)
# DB_PORT=3306:数据库端口(默认)
# DB_DATABASE=walle:数据库名
# DB_USERNAME=walle:数据库用户
# DB_PASSWORD=your_password:数据库密码
# 
# Redis配置(可选,用于缓存/队列):
# REDIS_HOST=127.0.0.1
# REDIS_PASSWORD=null
# REDIS_PORT=6379

# 生成APP_KEY(Laravel必需,无此密钥无法运行,自动生成并写入.env)
php artisan key:generate

# 数据库迁移(执行SQL脚本,创建Walle所需的表结构,--force强制在生产环境执行)
php artisan migrate --force

# 初始化管理员账户(默认账号:admin,密码:walle.wang,必须执行才能登录后台)
php artisan walle:install

为什么要做:.env文件包含Walle的核心配置(数据库、密钥等),必须正确配置;数据库迁移创建表结构,初始化账户是登录后台的前提。

5. 设置Walle目录权限

bash 复制代码
# 修改Walle目录所有者为www-data(Nginx/PHP-FPM的运行用户,确保能读写文件)
sudo chown -R www-data:www-data /var/www/walle
# 设置目录基本权限(755:所有者可读可写可执行,其他用户可读可执行)
sudo chmod -R 755 /var/www/walle
# 设置storage目录权限为777(Walle存储日志、缓存、上传文件,需要可写)
sudo chmod -R 777 /var/www/walle/storage
# 设置bootstrap/cache目录权限为777(Laravel缓存目录,需要可写)
sudo chmod -R 777 /var/www/walle/bootstrap/cache

为什么要做:Linux权限严格,若目录所有者/权限错误,PHP-FPM无法读写文件,会导致Walle日志写入失败、缓存生成失败、上传文件失败等问题。

6. 验证Walle访问

打开浏览器,访问 http://node-10-0-0-13(替换为服务器IP/域名),使用默认账号 admin/walle.wang 登录,登录后立即修改密码
为什么要做:验证Walle是否正常运行;默认密码是公开的,必须修改防止被入侵。

第五步:配置Walle发布PHP站点

1. 前置条件(发布目标服务器准备)

Walle发布需要目标服务器(部署PHP站点的服务器)满足:安装Git、SSH服务;配置Walle服务器到目标服务器的免密SSH登录;安装Nginx+PHP。

步骤1:Walle服务器生成SSH密钥
bash 复制代码
# 切换到www-data用户(Walle运行用户,发布时以该用户执行SSH命令)
# -s /bin/bash:指定使用bash Shell(默认www-data无登录Shell)
sudo su - www-data -s /bin/bash

# 生成SSH密钥(RSA算法,4096位(更安全),备注信息便于识别)
# 一路回车(不设置密码,否则免密登录会失效)
ssh-keygen -t rsa -b 4096 -C "walle@node-10-0-0-13"

# 复制公钥到目标服务器(替换target_ip为目标服务器IP)
# 执行后输入目标服务器root密码,公钥会被添加到~/.ssh/authorized_keys
ssh-copy-id root@target_ip

# 验证免密登录(无需密码即可登录目标服务器,表示配置成功)
ssh root@target_ip

# 退出www-data用户,回到原用户
exit

为什么要做:Walle发布代码时需要通过SSH登录目标服务器,免密登录避免每次发布都输入密码,是自动化发布的核心前提。

2. Walle后台配置

步骤1:添加环境(如测试环境、生产环境)
  1. 登录Walle后台 → 环境管理 → 新增环境
  2. 填写信息及含义:
    • 环境名称:生产环境(标识环境用途)
    • 部署用户:root(目标服务器的用户,需有目录读写权限)
    • 主机地址:目标服务器IP(SSH连接的地址)
    • 端口:22(SSH默认端口)
    • 备注:可选(便于区分环境)
      为什么要做:环境是Walle发布的核心维度,不同环境(测试/生产)对应不同的目标服务器。
步骤2:添加项目
  1. 登录Walle后台 → 项目管理 → 新增项目
  2. 填写核心信息及含义:
    • 项目名称:test-php-site(标识项目)
    • 项目标识:test-php-site(唯一标识,用于内部识别)
    • 代码仓库:git@github.com:xxx/test-php-site.git(Git仓库地址,Walle拉取代码的来源)
    • 分支/标签:master(要发布的代码分支)
    • 部署路径:/var/www/test-php-site(目标服务器的站点根目录)
    • 环境选择:生产环境(关联已添加的环境)
    • 发布用户:root(目标服务器的部署用户)
      为什么要做:项目是Walle发布的基本单元,配置项目信息后才能拉取代码并发布。
步骤3:配置构建/部署脚本

Walle支持自定义构建和部署脚本,针对PHP站点示例:

  • 构建脚本(Walle服务器执行):

    bash 复制代码
    # 安装PHP依赖(如果项目用Composer管理依赖)
    composer install --no-dev -o

    为什么:项目代码可能只包含业务代码,依赖库需要在构建阶段安装。

  • 部署脚本(目标服务器执行):

    bash 复制代码
    # 重启PHP-FPM(使新代码生效,PHP-FPM缓存旧代码可能导致修改不生效)
    systemctl restart php8.1-fpm
    # 刷新Nginx配置(可选,若Nginx配置有修改则需执行)
    nginx -t && systemctl reload nginx

    为什么:PHP-FPM是常驻进程,重启才能加载新代码;Nginx reload是平滑重启,不中断服务。

步骤4:发布代码
  1. 进入项目详情 → 点击"发布"
  2. 选择分支/提交记录 → 确认发布
  3. 查看发布日志,确认发布成功
    为什么要做:发布是最终目标,日志可排查发布失败的原因(如SSH连接失败、脚本执行错误)。

3. 目标服务器配置Nginx(PHP站点)

bash 复制代码
# 目标服务器创建PHP站点的Nginx配置文件
sudo vim /etc/nginx/sites-available/test-php-site.conf

# 配置文件内容及解释:
server {
    listen 80; # 监听80端口
    server_name test.example.com; # 站点域名/IP
    root /var/www/test-php-site; # Walle部署的代码目录
    index index.php index.html; # 默认首页

    # 日志配置(便于排查站点访问问题)
    access_log /var/log/nginx/test-php-site_access.log;
    error_log /var/log/nginx/test-php-site_error.log;

    # 伪静态配置(适配PHP站点的URL规则)
    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # PHP-FPM配置(解析PHP文件)
    location ~ \.php$ {
        fastcgi_pass unix:/run/php/php8.1-fpm.sock; # PHP-FPM套接字路径
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

# 启用配置(创建软链接到sites-enabled)
sudo ln -s /etc/nginx/sites-available/test-php-site.conf /etc/nginx/sites-enabled/

# 检查配置语法(避免错误)
sudo nginx -t
# 重启Nginx(使配置生效)
sudo systemctl restart nginx

为什么要做:目标服务器需要Nginx配置才能对外提供PHP站点的访问,配置规则需匹配站点的目录结构和PHP解析需求。

第六步:常见问题排查

1. Walle访问404

  • 检查Nginx配置中的root路径是否指向/var/www/walle/web(Walle的Web根目录)
  • 检查伪静态配置(try_files规则)是否正确
  • 查看Nginx错误日志:tail -f /var/log/nginx/walle_error.log(定位具体错误)
    原因:路径错误或伪静态配置缺失,导致Nginx无法找到index.php文件。

2. Walle发布失败

  • 检查www-data用户能否免密登录目标服务器:sudo su - www-data -s /bin/bash && ssh root@target_ip
  • 检查目标服务器部署路径权限:ssh root@target_ip "ls -ld /var/www/test-php-site"(确保部署用户有读写权限)
  • 查看Walle发布日志(后台→发布记录→日志)
    原因:SSH免密配置失败、目标服务器权限不足、部署脚本错误。

3. PHP站点访问500

  • 检查目标服务器PHP-FPM状态:systemctl status php8.1-fpm(确保服务运行)
  • 查看PHP错误日志:tail -f /var/log/php8.1-fpm.log(定位PHP脚本错误)
  • 检查站点目录权限:chown -R www-data:www-data /var/www/test-php-site
    原因:PHP-FPM未运行、脚本语法错误、目录权限不足。

4. Composer下载依赖慢/失败

  • 确认已切换阿里云Composer源:composer config -g repo.packagist
  • 清除Composer缓存:composer clear-cache
    原因:官方源访问慢,缓存损坏导致依赖下载失败。

总结

  1. 完成Ubuntu 24.04下Nginx+PHP8.1+MariaDB的基础环境部署(修正JSON扩展安装问题);
  2. 安装并配置Walle 2.0,解决权限、配置等核心问题;
  3. 配置免密SSH登录,实现Walle自动化发布PHP站点;
  4. 目标服务器配置Nginx,对外提供PHP站点访问。
相关推荐
橘颂TA2 分钟前
【Linux】死锁四条件的底层逻辑:从锁冲突到 STL 组件的线程安全实践(Ⅵ)
linux·运维·服务器·c++·死锁
黄焖鸡能干四碗37 分钟前
智能制造工业大数据应用及探索方案(PPT文件)
大数据·运维·人工智能·制造·需求分析
橙露44 分钟前
国产PLC与进口PLC全面对比分析:技术、市场与未来趋势
运维·网络
lbb 小魔仙1 小时前
【Linux】云原生运维效率提升:Linux 终端工具链(kubectl + tmux + fzf)组合拳教程
linux·运维·云原生
清水白石0081 小时前
解构异步编程的两种哲学:从 asyncio 到 Trio,理解 Nursery 的魔力
运维·服务器·数据库·python
Joren的学习记录1 小时前
【Linux运维大神系列】Kubernetes详解3(kubeadm部署k8s1.23高可用集群)
linux·运维·kubernetes
眠りたいです2 小时前
Docker核心技术和实现原理第二部分:docker镜像与网络原理
运维·网络·docker·容器
Tisfy2 小时前
网站访问耗时优化 - 从数十秒到几百毫秒的“零成本”优化过程
服务器·开发语言·性能优化·php·网站·建站
2501_933513042 小时前
Linux下载离线rpm和依赖包的方法
linux·运维·服务器
XiaoHu02072 小时前
Linux多线程(详细全解)
linux·运维·服务器·开发语言·c++·git