typecho 发布的文章

在 Linux (CentOS 7) 系统中,随着业务的发展,默认的数据库存放路径(通常在系统盘 /var/lib/mysql)很容易被撑爆。将 MariaDB 的数据目录(Data Directory)迁移到容量更大的挂载盘(如 /data/mysql)是一个非常标准的运维操作。

为了确保数据绝对安全且迁移后服务能正常启动,请严格按照以下五个步骤进行操作:

🛠️ 第一步:安全停止 MariaDB 服务
在迁移数据之前,必须先停止数据库服务,否则在复制文件的过程中如果有新数据写入,会导致数据库文件损坏或不一致。

Bash
systemctl stop mariadb
📂 第二步:创建新目录并完整复制原数据
创建新的存放目录(假设你要迁移到 /data/mysql):

Bash
mkdir -p /data/mysql
使用 cp -a 完整复制原数据:
-a 参数极其关键,它能在复制文件的同时,完美保留原文件的所有者、所属组(mysql:mysql)以及安全权限。

Bash
cp -a /var/lib/mysql/. /data/mysql/
检查新目录的权限:
确保新目录的所有者和组确实是 mysql:

Bash
ls -ld /data/mysql

正确输出应该包含:drwxr-xr-x. ... mysql mysql ... /data/mysql

如果所有者不对,手动修正它:

Bash
chown -R mysql:mysql /data/data/mysql
⚙️ 第三步:修改 MariaDB 配置文件
新版 MariaDB 通常在 /etc/my.cnf 或 /etc/my.cnf.d/server.cnf 中配置底层路径。

打开主配置文件:

Bash
vi /etc/my.cnf
在 [mysqld] 标签下方,修改(或添加)datadir 和 socket 的路径:

Ini, TOML
[mysqld]

将原本的 /var/lib/mysql 改为你的新路径

datadir=/data/mysql
socket=/data/mysql/mysql.sock
(极为重要) 为了保证本地命令行工具(如 mysql、mysqldump)在不指定参数时也能正常连接,还需要在配置文件底部加上 [client] 和 [mysql] 的套接字重定向:

Ini, TOML
[client]
socket=/data/mysql/mysql.sock

[mysql]
socket=/data/mysql/mysql.sock
保存并退出 (:wq)。

🛡️ 第四步:调校 CentOS 7 的 SELinux 策略(核心避坑点)
CentOS 7 默认开启的 SELinux 安全策略非常严格,它默认只允许数据库读取 /var/lib/mysql。如果不给新路径放行,启动时会疯狂报错 Permission denied。

终极省心法(临时关闭):
如果你不需要 SELinux,可以直接关闭它:

Bash
setenforce 0
(永久关闭需修改 /etc/selinux/config 将其设为 disabled)。

专业安全法(不关闭 SELinux,仅对新目录赋权):
如果你希望保持系统高安全性,可以把原目录的安全上下文直接“复制”给新目录:

Bash

1. 将 /var/lib/mysql 的安全策略标签同步给 /data/mysql

semanage fcontext -a -e /var/lib/mysql /data/mysql

2. 强行刷新并应用该策略

restorecon -R -v /data/mysql
🚀 第五步:启动服务并验证
重新拉起 MariaDB 服务:

Bash
systemctl start mariadb
验证新路径是否真正生效:
登录进数据库:

Bash
mysql -u root -p
在 MariaDB [(none)]> 命令行中执行以下 SQL 语句查看当前实际存放位置:

SQL
SHOW VARIABLES LIKE 'datadir';
如果表格中漂亮的显示出 Value: /data/mysql/,说明你的数据库存放位置已经完美迁移成功!

清理旧数据(可选):
在新环境稳定运行几天、确认毫无问题后,你可以手动删掉 /var/lib/mysql 下的旧文件来释放系统盘空间:

Bash
rm -rf /var/lib/mysql_old

进行 MariaDB (或 MySQL) 数据库迁移,最稳妥、最常用的方案是使用官方自带的 mysqldump 工具。它会将数据库中的表结构和数据导出为一个纯文本的 .sql 文件,然后在新服务器上导入。

下面为你梳理标准迁移的完整步骤(假设你从 服务器 A 迁移到 服务器 B)。

第一步:在源服务器(A)上导出数据
使用 mysqldump 命令。根据你的需求选择以下三种常见场景之一:

Bash

场景 1:仅迁移某一个指定的数据库(最常用)

mysqldump -u root -p --single-transaction --routines --triggers 数据库名 > /tmp/backup.sql

场景 2:一次性迁移多个指定的数据库

mysqldump -u root -p --single-transaction --routines --triggers --databases 库名1 库名2 > /tmp/backup.sql

场景 3:整机迁移(迁移所有的数据库、表、甚至包括用户权限)

mysqldump -u root -p --single-transaction --routines --triggers --all-databases > /tmp/backup.sql
💡 核心参数解析(避坑必备):

--single-transaction:如果在迁移生产环境,这个参数可以让 InnoDB 引擎在不锁表的情况下进行安全备份,不影响线上业务读写。

--routines 和 --triggers:确保把数据库里的存储过程、自定义函数和触发器一起带走,防止新服务器跑代码时报错。

第二步:将 .sql 转移到目标服务器(B)
在服务器 A 上,利用 scp 命令将导出的文件跨服务器安全传输到服务器 B 的 /tmp/ 目录下:

Bash

请将 192.168.1.100 换成服务器 B 的实际 IP

scp /tmp/backup.sql root@192.168.1.100:/tmp/
第三步:在目标服务器(B)上导入数据
在服务器 B 上,根据你第一步导出的范围,选择对应的导入方式:

情况 A:如果你第一步只导出了“某一个数据库”(场景 1)
新服务器上可能还没有对应的空库,你需要先手动创建一个同名的空数据库:

Bash

1. 登录 B 服务器的数据库

mariadb -u root -p

2. 创建一个干净的空库(注意字符集要与原库一致,通常是 utf8mb4)

CREATE DATABASE 数据库名 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
EXIT;

3. 在 Linux 命令行执行导入

mariadb -u root -p 数据库名 < /tmp/backup.sql
情况 B:如果你第一步使用了 --databases 或 --all-databases(场景 2、3)
因为 .sql 文件里已经自动包含了 CREATE DATABASE 的指令,你不需要手动建库,直接一行命令无脑导入即可:

Bash
mariadb -u root -p < /tmp/backup.sql
🛡️ 高级进阶:大文件迁移优化(10G 以上数据库)
如果你的数据库非常庞大,普通的导出导入会非常慢,甚至卡死。你可以利用 Linux 管道命令 进行“边压缩、边传输、边解压导入”,不仅速度极快,而且不占用服务器 A 和 B 的额外磁盘空间:

Bash

在服务器 A 上执行这一行,直接一步到位传给服务器 B 并完成导入:

mysqldump -u root -p --single-transaction --routines --triggers 数据库名 | gzip | ssh root@服务器B_IP "gunzip | mariadb -u root -p 数据库名"
🚨 迁移后的硬伤排查
版本兼容性:尽量保证服务器 B 的 MariaDB 版本大于或等于服务器 A。如果从高版本往低版本迁移,可能会因为某些新语法(如新版的 JSON 格式或严格模式)导致导入时报错。

刷新权限:如果你做了整机迁移(场景 3),导入后必须在服务器 B 上执行一次刷新权限命令,否则新用户可能无法登录:

SQL
FLUSH PRIVILEGES;

在 CentOS 7 上安装最新稳定版的 MariaDB(通常是 MariaDB 10.11 LTS 或 11.x 分支),如果直接使用系统的 yum install mariadb-server,由于 CentOS 7 官方源早已停止维护,你只会装上极度老旧的 5.5 版本(2012 年的古董版)。

为了安全和性能,我们必须引入 MariaDB 官方的 Yum 仓库。以下是 2026 年最标准的完整升级与安装指南:

🛠️ 第一步:彻底清理冲突的旧环境
CentOS 7 自带的旧版 mariadb-libs 会与新版严重冲突,导致安装锁死。请先将其连根拔起:

Bash

1. 强行卸载所有旧的 mariadb 残留组件

rpm -e --nodeps $(rpm -qa | grep mariadb)

2. 顺便清理可能冲突的旧 mysql 依赖

rpm -e --nodeps $(rpm -qa | grep mysql)
🌐 第二步:配置 MariaDB 官方最新 Yum 源
由于 MariaDB 官方对 CentOS 7 的软件源结构进行了调整,直接手工写配置文件最稳妥。

创建并编辑源文件:

Bash
vi /etc/yum.repos.d/mariadb.repo
粘贴以下官方最新的归档源配置(推荐 10.11 LTS 长期支持版,最稳定):

Ini, TOML
[mariadb]
name = MariaDB
baseurl = https://archive.mariadb.org/mariadb-10.11/yum/centos7-amd64/
gpgkey = https://supplychain.mariadb.com/MariaDB-Server-GPG-KEY
gpgcheck = 1
enabled = 1
(注:如果你追求绝对最新的功能,可以将上面两处 10.11 改为 11.4)

刷新 yum 缓存:

Bash
yum clean all
yum makecache
🚀 第三步:安装并启动新版 MariaDB
正式执行安装命令:

Bash
yum install -y MariaDB-server MariaDB-client
(注意:官方源的大版本包名中,M 和 DB 必须大写)

启动服务并设置开机自启:

Bash
systemctl start mariadb
systemctl enable mariadb
验证安装版本:

Bash
mariadb --version
此时终端应该漂亮地打印出 mariadb Ver 15.1 Distrib 10.11.x-MariaDB...

🔐 第四步:执行安全初始化(设置 root 密码)
新安装的 MariaDB 默认是没有密码的。运行官方自带的安全脚本来加固数据库:

Bash
mariadb-secure-installation
进入交互界面后,按照以下提示进行(直接抄作业):

Enter current password for root (enter for none): ➔ 直接敲回车(因为现在没密码)。

Switch to unix_socket authentication [Y/n] ➔ 输入 n(除非你希望通过 Linux 账户直接免密登录)。

Change the root password? [Y/n] ➔ 输入 y,接着输入你要设置的数据库新密码并回车确认。

Remove anonymous users? [Y/n] ➔ 输入 y(删除匿名用户)。

Disallow root login remotely? [Y/n] ➔ 输入 n(注意选 n! 否则你以后在 Windows 用 Navicat 或开发工具就无法远程连接了)。

Remove test database and access to it? [Y/n] ➔ 输入 y(删除测试库)。

Reload privilege tables now? [Y/n] ➔ 输入 y(立即刷新权限)。

🌍 第五步:开远程连接权限(可选)
如果你需要让外部网络或其它虚拟机连接这个 MariaDB,除了在刚才的安全脚本中允许远程外,还需要进数据库赋予权限:

登录数据库:

Bash
mariadb -u root -p
(输入你刚刚设置的新密码)

在 MariaDB [(none)]> 终端中执行:

SQL
-- 允许 root 用户从任意 IP (%) 登录并拥有所有权限

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '你的密码' WITH GRANT OPTION;

-- 刷新生效
FLUSH PRIVILEGES;

-- 退出
EXIT;
最后一步:放行 CentOS 7 防火墙的 3306 端口:

Bash
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
至此,一个崭新、安全的现代版 MariaDB 已经在你的 CentOS 7 上彻底部署完毕,并且已经完美打通了网络!

在 CentOS 7 上将 Nginx 升级到最新稳定版(如 1.26+),并将 PHP 升级到现代版本(如 PHP 8.2 / 8.3 / 8.4)后,为了让它们完美协同并发挥最佳性能,我们需要对 Nginx 主配置文件、站点虚拟主机配置 以及 PHP-FPM 配置 进行全面联动调整。

以下是为你整理的全套生产环境标准配置文件模板及关键参数解析:

一、 PHP-FPM 核心配置文件
最新版 Remi 源安装的 PHP-FPM 配置文件通常位于 /etc/php-fpm.d/www.conf。为了与 Nginx 顺畅通信,请使用 vi /etc/php-fpm.d/www.conf 修改或确认以下关键项:

Ini, TOML
; 1. 设置 PHP-FPM 的运行用户和组为 nginx(新版 Nginx 官方源默认用户,我的为apache)
user = nginx
group = nginx

; 2. 通信方式选择:推荐使用 Unix Socket(本地运行性能比 127.0.0.1:9000 高 10% 左右)
listen = /run/php-fpm/www.sock

; 3. 🚨 极其重要:设置 Socket 文件的权限,否则 Nginx 会报 502 Bad Gateway
listen.owner = nginx
listen.group = nginx
listen.mode = 0660

; 4. 性能调优:根据服务器内存调整进程数(以下适合 2G~4G 内存服务器)
pm = dynamic
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500 ; 周期性释放内存,防止 PHP 内存泄露
修改后执行重启命令: systemctl restart php-fpm

二、 Nginx 站点虚拟主机配置文件
建议将你的站点配置写在 /etc/nginx/conf.d/ 目录下(例如 /etc/nginx/conf.d/default.conf)。这套配置已经过安全加固、伪静态支持以及大模型/长耗时脚本优化:

Nginx
server {

listen       80;
listen       [::]:80;
server_name  example.com; # 换成你的域名或服务器IP

# 现代 Web 项目推荐的网站根目录
root         /usr/share/nginx/html;
index        index.php index.html index.htm;

charset utf-8;

# 1. 优化:关闭无用日志记录,减少磁盘 I/O
location = /favicon.ico { log_not_found off; access_log off; }
location = /robots.txt  { log_not_found off; access_log off; }

# 2. 支持现代主流框架的伪静态路由(Laravel, ThinkPHP, Vue Router 等)
location / {
    try_files $uri $uri/ /index.php?$query_string;
}

# 3. 🚨 核心:联动最新版 PHP-FPM 的解析配置
location ~ \.php$ {
    # 严格防范:确保文件确实存在,防止通过恶意构造的 URL 绕过安全防护
    try_files $uri =404;

    # 核心连接:指向刚才在 php-fpm 里配置的 Unix Socket 路径
    fastcgi_pass   unix:/run/php-fpm/www.sock;
    fastcgi_index  (config).php;

    # 引入 Nginx 官方标准的 FastCGI 参数
    include        fastcgi_params;

    # 关键修正:设置正确的脚本路径,否则 PHP 会返回空白页(Blank Page)
    fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
    
    # 安全加固:隐藏 PHP 版本号,防止被黑客针对性扫描漏洞
    fastcgi_hide_header X-Powered-By;

    # 性能与超时调优:针对大数据流传输、AI 长文本生成或复杂后台任务
    fastcgi_buffer_size 128k;
    fastcgi_buffers 4 256k;
    fastcgi_busy_buffers_size 256k;
    
    # 调大超时时间(2分钟),防止高耗时脚本直接弹 504 Gateway Timeout
    fastcgi_read_timeout 120s;
    fastcgi_send_timeout 120s;
}

# 4. 安全加固:严禁外部直接访问敏感隐藏文件(如 .env, .git, .htaccess 等)
location ~ /\.(?!well-known).* {
    deny all;
    access_log off;
    log_not_found off;
}

# 5. 静态资源强缓存:针对图片、JS、CSS 开启浏览器强缓存,大幅度压低服务器带宽消耗
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
    expires 30d;
    add_header Cache-Control "public, no-transform";
    log_not_found off;
    access_log off;
}

# 错误页面友好重定向
error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   /usr/share/nginx/html;
}

}
三、 PHP 核心全局配置 (/etc/php.ini)
升级到 PHP 8.x 后,为了支撑更现代的开发需求(如本地大模型交互、文件上传、长耗时自动化任务),建议用 vi /etc/php.ini 调整以下全局核心参数:

Ini, TOML
; 1. 调整最大脚本执行时间,防止跑自动化脚本或 AI 工具时中途断开
max_execution_time = 120
max_input_time = 120

; 2. 调大单个脚本可使用的最大内存(根据你服务器的总内存决定,建议不低于 256M)
memory_limit = 512M

; 3. 调大文件上传限制,满足大文件或媒体资源的上传需求
upload_max_filesize = 100M
post_max_size = 108M

; 4. 生产环境安全:关闭错误回显,防止报错时暴露服务器敏感绝对路径
display_errors = Off
log_errors = On
error_log = /var/log/php-fpm/www-error.log

; 5. 时区修正
date.timezone = Asia/Shanghai
四、 检查与生效步骤
在完成上述所有配置后,请严格按照以下顺序测试并重启服务,以防配置低级语法错误导致 Web 服务器崩溃:

测试 Nginx 语法:

Bash
nginx -t
看到终端返回 nginx: configuration file /etc/nginx/nginx.conf test is successful 字样,才可以继续。

重启服务使其彻底生效:

Bash
systemctl restart php-fpm
systemctl restart nginx
环境联通性测试:
在 /usr/share/nginx/html 目录下创建一个测试文件:

Bash
echo "<?php phpinfo(); ?>" > /usr/share/nginx/html/index.php
在浏览器里输入服务器的 IP 地址。如果能完美看到崭新的 PHP Version 8.3.x 或 8.4.x 的蓝色大表格,且其中的 Server API 显示为 FPM/FastCGI,说明升级后的现代 Web 环境已经完全调校成功!

在 CentOS 7 上将 PHP 和 Nginx 升级到最新版本,由于 CentOS 7 官方源(Base)中的版本非常老旧(PHP 5.4 和 Nginx 1.12 左右),我们必须引入 Remi 源(针对 PHP)和 Nginx 官方源。

需要特别注意的是,CentOS 7 官方已于 2024 年 6 月 30 日停止维护(EOL),官方的 Base 源可能已经失效。如果你的系统尚未更换 CentOS 7 的归档源(Vault 源),升级前请确保你的 yum 还能正常工作。

以下是完整的升级步骤:

一、 升级 Nginx 到最新稳定版 (Mainline 或 Stable)
CentOS 7 自带的 EPEL 源版本较旧,直接使用 Nginx 官方维护的 RHEL/CentOS 7 仓库可以获取最新版。

  1. 添加 Nginx 官方源
    创建并编辑 Nginx 源配置文件:

Bash
vi /etc/yum.repos.d/nginx.repo
粘贴以下内容(这里推荐使用最新稳定版 stable,如果追求绝对最新功能,可以将下文中的 stable 改为 mainline):

Ini, TOML
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

  1. 停止旧服务并升级
    为了防止升级期间配置文件冲突或服务异常,建议先备份配置:

Bash

备份旧配置(以防万一)

cp -r /etc/nginx /etc/nginx_bak

升级 Nginx

yum clean all
yum install -y nginx

启动并设置开机自启

systemctl daemon-reload
systemctl restart nginx
systemctl enable nginx

  1. 验证版本
    Bash
    nginx -v
    (此时应该显示为最新的 1.26.x 或更高版本)

二、 升级 PHP 到最新版 (PHP 8.2 或 8.3)
在 2026 年,PHP 的主流稳定版为 8.2 / 8.3 / 8.4。由于 CentOS 7 自身编译环境限制,Remi 源是目前在 CentOS 7 上安全运行最新 PHP 的唯一可靠途径。

  1. 安装 EPEL 和 Remi 仓库
    Bash

    安装 EPEL 源(如果已安装可跳过)

    yum install -y epel-release

安装 Remi 源(专门针对 CentOS 7 的版本)

yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

安装 yum 管理工具

yum install -y yum-utils

  1. 清理旧版 PHP(如果之前装过)
    如果系统里有旧的 PHP 5.x,直接升级容易起冲突,建议先卸载旧包:

Bash
yum remove -y php php-common php-cli php-fpm

  1. 启用最新 PHP 分支并安装
    使用 yum-config-manager 激活你想要的 PHP 版本。这里以 PHP 8.3 为例(如果想装 8.2 或 8.4,只需将下面命令中的 83 改为 82 或 84):

Bash

启用 PHP 8.3 仓库

yum-config-manager --enable remi-php83

安装 PHP 8.3 核心及常用扩展(与 Nginx 配合必须安装 php-fpm)

yum install -y php php-cli php-fpm php-common php-mysqlnd php-gd php-mbstring php-xml php-json php-curl php-zip

安装 PHP 的 MySQL 核心驱动与 PDO 扩展
yum install -y php-mysqlnd php-pdo

  1. 启动 PHP-FPM
    Bash

    启动服务

    systemctl start php-fpm

    设置开机自启

    systemctl enable php-fpm

  2. 验证版本
    Bash
    php -v
    三、 避坑指南与 Nginx 配置衔接
    升级完成后,由于新版 PHP 的执行用户、用户组或者 Socket 路径可能与旧版不同,请务必核对以下两点:

检查 PHP-FPM 运行用户:
打开 /etc/php-fpm.d/www.conf,确保 user 和 group 与你的 Nginx 运行用户一致(通常 Nginx 官方源的用户名为 nginx,我的名字都为apache):

Ini, TOML
user = nginx
group = nginx
修改后记得重启:systemctl restart php-fpm

检查 Nginx 连接 PHP 的方式:
看一眼 /etc/php-fpm.d/www.conf 里的 listen 选项:

如果是 listen = 127.0.0.1:9000,则 Nginx 配置文件中应写 fastcgi_pass 127.0.0.1:9000;

如果是 listen = /run/php-fpm/www.sock,则 Nginx 中应写 fastcgi_pass unix:/run/php-fpm/www.sock;