CentOS Linux 的停更确实让很多人需要寻找替代方案。现在有非常多优秀且免费的替代品。
1. CentOS替换系统方案
1.1. 核心需求分析
针对你的“PHP开发和生产环境”需求,我们需要一个具备以下特点的系统:
- 免费:这是基本要求。
- 长期支持:生产环境需要稳定,不能频繁升级系统大版本。
- 软件包丰富/更新及时:能方便地安装PHP、Nginx/Apache、MySQL/PostgreSQL等最新或特定版本的软件。
- 社区活跃/文档完善:遇到问题容易找到解决方案。
1.2. 首选推荐(直接替代品,无缝迁移)
这类系统是CentOS的“精神续作”,旨在100%兼容RHEL,迁移成本最低。
1.2.1. Rocky Linux 或 AlmaLinux
这两个是当前最主流的CentOS替代品,可以说是并列第一选择。它们都是由原CentOS项目的创始人或社区主导开发的。
- 背景:在Red Hat宣布停止CentOS Linux后,为了继承CentOS的使命而诞生。
- 版本建议:Rocky Linux 9.x 或 AlmaLinux 9.x(对应RHEL 9,支持到2032年)。如果你需要更长的支持周期,也可以选择 8.x 版本(支持到2029年)。
- 优点:
- 高度兼容:与RHEL/CentOS二进制兼容,你之前针对CentOS的脚本、知识和软件包几乎可以无缝迁移。
- 超长支持周期:10年支持,非常适合生产环境。
- 稳定可靠:基于企业级的RHEL,经过了严格的测试。
- 迁移工具:提供从CentOS 8/7 迁移到Rocky/AlmaLinux的官方工具,过程相对平滑。
- 缺点:
- 软件包版本相对“保守”。例如,默认仓库里的PHP版本可能不是最新的,但可以通过第三方仓库(如Remi仓库)轻松安装最新版本。这一点和CentOS完全一样。
如何选择?:Rocky和AlmaLinux在功能和稳定性上几乎没有区别。你可以根据个人偏好或社区氛围选择其中一个。对于绝大多数用户来说,它们是等价的。
1.3. 优秀替代方案(如果你愿意尝试不同风格的Linux)
1.3.1. Debian Stable
Debian是世界上最古老的Linux发行版之一,以其极致稳定和巨大的软件仓库而闻名。Ubuntu就是基于Debian构建的。
- 版本建议:Debian 12 (Bookworm)
- 优点:
- 极其稳定:Debian的稳定版以“坚如磐石”著称,是生产环境的绝佳选择。
- 软件包丰富:拥有超过6万个软件包,几乎涵盖所有需求。
- 安全更新及时:安全团队非常活跃,能快速响应漏洞。
- 清晰的许可:严格遵循自由软件准则。
- 缺点:
- 软件版本同样比较保守,倾向于稳定而非最新。
- 系统配置有时可能需要更多的手动操作(但对于有经验的用户来说不是问题)。
1.3.2. Ubuntu LTS (长期支持版)
Ubuntu是基于Debian,但更注重易用性和新硬件支持,拥有庞大的用户社区。
- 版本建议:Ubuntu Server 22.04 LTS 或 24.04 LTS
- 优点:
- 社区支持强大:遇到任何问题,网上几乎都能找到答案,中文资料也极多。
- 软件版本较新:相比RHEL系和Debian Stable,Ubuntu LTS会提供相对较新的软件版本,对PHP开发更友好。
- 易用性好:安装和配置对新手更友好。
- 云市场支持好:是所有主流云厂商的首选系统之一。
- 缺点:
- 相比Rocky/AlmaLinux,与你原有的CentOS经验略有差异(例如软件包管理工具是
apt而非yum/dnf)。 - 一些纯技术派认为它不如Debian“纯粹”,但这对实际使用影响不大。
- 相比Rocky/AlmaLinux,与你原有的CentOS经验略有差异(例如软件包管理工具是
1.4. 快速对比总结
| 特性 | Rocky Linux / AlmaLinux | Debian Stable | Ubuntu LTS |
|---|---|---|---|
| 核心来源 | RHEL 下游(100%兼容) | 独立发行版 | Debian 下游 |
| 包管理器 | yum / dnf (rpm包) |
apt (deb包) |
apt (deb包) |
| 软件版本 | 保守(追求稳定) | 非常保守(追求极致稳定) | 相对较新(稳定与新版平衡) |
| 支持周期 | 10年 | 约5年 | 5年(可延长) |
| 迁移难度 | 极低(无缝迁移) | 中等(需要学习新系统) | 低(社区资料丰富) |
| 推荐场景 | 直接从CentOS迁移,追求稳定无缝 | 追求极致稳定和自由软件 | 希望软件版本较新,社区支持强大 |
1.5. 针对PHP环境的额外建议
无论选择哪个系统,管理PHP多版本都可能是你的需求。强烈建议使用第三方仓库来获取最新版本的PHP:
- 对于Rocky/AlmaLinux/CentOS系:使用 Remi's RPM repository。这是行业标准做法,安全可靠。
- 对于Debian/Ubuntu系:使用 Ondřej Surý 的 PPA。同样是官方推荐的第三方仓库。
这些仓库可以让你轻松安装PHP 8.1, 8.2, 8.3等任何最新版本,并与系统自带的旧版本共存。
1.6. 最终建议
- 如果你希望迁移过程最平滑,不想改变使用习惯:首选 Rocky Linux 或 AlmaLinux (9.x)。这是最稳妥、最直接的选择。
- 如果你不介意学习一个新系统,并且希望软件版本稍微新一点,方便开发:选择 Ubuntu Server LTS (22.04/24.04)。它的巨大社区是你的后盾。
- 如果你是稳定性至上主义者,并且喜欢Debian的哲学:选择 Debian 12。它绝不会让你失望。
生产环境部署提醒:
- 选择LTS或稳定版系列。
- 制定严格的更新策略,先在测试环境验证后再应用到生产环境。
- 做好备份!
2. Rocky Linux 搭建LNMP
2.1. Rokcy Linux下载
2.2. 检查SELinux状态
SELinux可能会阻止SSH连接:
# 查看SELinux状态
getenforce
# 如果是Enforcing模式,可以暂时禁用测试
sudo setenforce 0
# 或者永久禁用(生产环境不推荐)
sudo sed -i 's/SELINUX=enforcing/SELINUX=permissive/g' /etc/selinux/config
2.3. 检查SSH配置
编辑SSH配置文件:
sudo vi /etc/ssh/sshd_config
确保以下配置正确:
Port 22
PermitRootLogin yes # 允许root登录
PasswordAuthentication yes # 允许密码认证
PubkeyAuthentication yes # 允许密钥认证
重启SSH服务:
sudo systemctl restart sshd
2.4. 检查用户和密码
确保你使用的用户存在且密码正确:
# 创建用户(如果需要)
sudo useradd your_username
sudo passwd your_username
# 将用户加入sudo组
sudo usermod -aG wheel your_username
2.5. 安装Nginx最新版
yum install nginx #安装版本最好方式,不过需要确认版本别太低导致web代码有兼容问题;这样,就不需要如下的代码安装方式了
#运行启动nginx
systemctl start nginx
systemctl enable nginx
# 查看配置文件路径以及合法性
nginx -t
#登录查看部署站点内容
cd /usr/share/nginx/html
# 个别系统需要检查是否关闭防火墙
systemctl disable firewalld
systemctl stop firewalld
2.6. 安装MySQL仓库
2.6.1. 安装适合Rocky Linux 的Mysql
# 对于Rocky Linux 8:
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el8-9.noarch.rpm
# 对于Rocky Linux 9:
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el9-5.noarch.rpm
sudo yum install -y https://dev.mysql.com/get/mysql84-community-release-el9-2.noarch.rpm
# 对于Rocky Linux 10:
sudo yum install -y https://dev.mysql.com/get/mysql84-community-release-el10-2.noarch.rpm
# 禁用默认模块(重要!)
sudo yum -y module disable mysql
#安装mysql
sudo yum -y install mysql mysql-community-server
# 启动 MySQL 服务
sudo systemctl start mysqld
# 检查状态
sudo systemctl status mysqld
# 开机启动 MySQL 数据库。
sudo systemctl enable mysqld
# 查看临时 root 密码
sudo grep 'temporary password' /var/log/mysqld.log
# 设置正确的权限
sudo chown -R mysql:mysql /var/lib/mysql
# 老版本需要保存数据执行如下
mysqldump -u root -p --all-databases > all_databases.sql
2.6.2. 修改Mysql密码
-
mysql cli登录
#查看MySQL初始密码。 grep "password" /var/log/mysqld.log mysql -uroot -p #第一次登录使用root #set global validate_password_policy=0; #修改密码安全策略为低(只校验密码长度,至少8位)。 #第一次登录可能没有密码 mysql -u root -h 127.0.0.1 -P 3306
执行以下命令登录mysql,修改MySQL默认密码。满足MySQL强密码策略(e.g., 大写字母,小写字母,特殊字符,最少8字符).
-
方法 1:单引号包裹 + 重复单引号转义分号
适用于 MariaDB 10.2 及以上版本:ALTER USER 'root'@'localhost' IDENTIFIED BY 'Test12345678-'; FLUSH PRIVILEGES; -
方法 2:使用 SET PASSWORD 语句
兼容旧版本 MariaDB:SET PASSWORD FOR 'root'@'localhost' = PASSWORD('Test12345678-');说明:PASSWORD() 函数自动处理特殊字符,但需注意该语法在 MariaDB 10.4 后可能废弃8。
-
方法 3:直接更新 mysql.user 表(需谨慎)
适用于所有版本:UPDATE mysql.user SET authentication_string = PASSWORD('Test12345678-') WHERE User = 'root' AND Host = 'localhost'; FLUSH PRIVILEGES;
执行以下命令,授予root用户远程管理权限。
```sql
use mysql;
select host from user;
update user set host ='%' where user ='root';
flush privileges;
```
2.6.3. 生产环境创建mysql的用户名
创建建远程专用用户 app_remote
语法说明:
CREATE USER '用户名'@'允许访问的IP' IDENTIFIED WITH 认证插件 BY '密码';
- 用户名:建议使用有意义的名称(如 app_remote ),避免直接用 remote_user。
- 允许访问的 IP:
限制特定 IP:192.168.1.100(仅允许该 IP 访问,最安全)。
限制 IP 段:192.168.1.%(允许该网段所有 IP 访问)。
禁止所有远程(仅本地):localhost 或 127.0.0.1(不适合远程用户)。 - 认证插件:
MySQL 8.0+ 默认 caching_sha2_password(更安全,需客户端支持)。
兼容旧客户端:mysql_native_password(兼容性好,安全性稍低)。
密码:必须复杂(字母 + 数字 + 特殊字符,长度≥12 位)。
示例(推荐):
创建一个仅允许从 192.168.1.100 访问的用户 app_remote,使用强密码:
-- MySQL 8.0+ 推荐(默认插件)
CREATE USER 'app_remote'@'192.168.1.100' IDENTIFIED BY 'StrongP@ssw0rd2024!';
-- 若客户端不支持 caching_sha2_password,改用旧插件
CREATE USER 'app_remote'@'192.168.1.100' IDENTIFIED WITH mysql_native_password BY 'StrongP@ssw0rd2024!';
-- 为 app_remote 添加本地登录权限(密码可与远程不同,建议统一)
CREATE USER IF NOT EXISTS 'app_remote'@'localhost' IDENTIFIED BY '你的密码';
-- 授予本地操作所需的最小权限(例如仅允许操作 app_db)
GRANT SELECT, INSERT, UPDATE, DELETE ON app_db.* TO 'app_remote'@'localhost';
-- 修改用户密码,用单引号包裹含分号的密码
ALTER USER '用户名'@'主机' IDENTIFIED BY 'MyPass;123';
-- 刷新权限
FLUSH PRIVILEGES;
导入完整文件
# 导入完整备份(所有数据库)
mysql -u root -p < all_databases.sql
# 导入到特定数据库(先创建数据库)
mysql -u root -p -e "CREATE DATABASE mydatabase"
mysql -u root -p mydatabase
2.7. 安装PHP
2.7.1. 官方仓库直接支持
- Rocky Linux 9/10 的默认AppStream仓库中直接包含了 PHP 8.1
- 安装非常简单,无需第三方仓库:
sudo yum update sudo yum module list php # 查看可用的PHP模块 sudo yum module enable php:8.1 # 启用PHP 8.1模块 sudo yum install php php-cli php-fpm php-mysqlnd # 安装PHP及相关扩展
2.7.2. 版本对应关系
| Rocky Linux 版本 | 默认PHP版本 | 可选PHP版本(官方仓库) |
|---|---|---|
| Rocky Linux 9 | PHP 8.0 | PHP 8.1, PHP 8.2, PHP 8.0 |
| Rocky Linux 8 | PHP 7.2 | PHP 7.2, 7.3, 7.4, 8.0, 8.1(需Remi仓库) |
2.7.3. 具体安装步骤(Rocky Linux)
# 1. 查看可用的PHP版本
sudo yum module list php
# 2. 启用PHP 8.1模块
sudo yum module enable php:8.1
# 3. 安装PHP 8.1及常用扩展
sudo yum install php php-cli php-fpm php-mysqlnd php-pdo php-json php-xml php-curl php-zip php-gd php-mbstring
# 4. 验证安装
php -v # 应该显示PHP 8.1.x
# 5. 启动PHP-FPM(如果使用Nginx)
sudo systemctl enable --now php-fpm
sudo systemctl status php-fpm
2.7.4. 如果需要其他PHP版本(灵活性)
即使选择Rocky Linux,你也可以通过Remi仓库安装其他PHP版本:
# 启用Remi仓库(用于更多PHP版本选择)
sudo yum install https://rpms.remirepo.net/enterprise/remi-release-9.rpm
## 下载其中rpm,网址如下 https://rpms.remirepo.net/enterprise/
# 安装PHP 8.2或8.3(如果需要)
sudo yum module enable php:remi-8.2
sudo yum install php
2.7.5. 修改配置文件,调整参数
-
调整PHP-FPM配置
首先检查并优化PHP-FPM池配置(通常在/etc/php-fpm.d/www.conf或类似路径)。
增加超时时间:确保request_terminate_timeout值设置合理,例如设置为300秒,避免脚本执行时间稍长就被中断。
request_terminate_timeout = 300
调整进程管理参数:根据服务器负载调整动态模式下的pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_servers,避免进程过载。适当提高pm.max_requests值,减少进程频繁重启。
检查慢日志:启用PHP-FPM的慢日志slowlog,定位具体是哪个脚本执行过慢。 -
优化Nginx FastCGI相关参数
在Nginx的server或location块中(特别是处理PHP的配置部分),调整以下参数:
location ~ .php$ {... 其他原有配置(如 fastcgi_pass 等)
# 调整超时时间,与PHP-FPM配置协调 fastcgi_read_timeout 300s; fastcgi_connect_timeout 60s; fastcgi_send_timeout 60s; # 调整缓冲区大小 fastcgi_buffer_size 128k; fastcgi_buffers 4 256k; fastcgi_busy_buffers_size 256k; # 其他必要的FastCGI参数 include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
超时参数:确保Nginx等待后端响应的时间足够长(fastcgi_read_timeout)。
缓冲区参数:适当增大缓冲区大小和数量,以应对较大的响应头或响应体。 -
检查系统资源与日志
检查服务器内存、CPU使用情况,确保PHP-FPM有足够资源。
仔细查看PHP-FPM的错误日志和Nginx的错误日志,寻找与这些错误同时段出现的其他警告或错误信息,这有助于定位根本原因。检查/var/log/php-fpm.log(路径可能不同)和Nginx错误日志。 -
排查应用程序问题
检查在错误时间点对应的PHP脚本(如日志中提到的/admin8cqfkp.php、user/login相关脚本),看是否存在数据库查询慢、循环执行效率低、调用外部接口超时等问题。
2.7.6. 排障
- 配置文件位置 /etc/php-fpm.d/www.conf
- 默认错误日志文件位置 /var/log/php-fpm/www-error.log
[07-Dec-2025 00:16:34 Asia/Shanghai] PHP Fatal error: Uncaught InvalidArgumentException: Undefined db config:mysql in /usr/share/nginx/html/shopxo/vendor/topthink/think-orm/src/DbManager.php:258
Stack trace:
#0 /usr/share/nginx/html/shopxo/vendor/topthink/think-orm/src/DbManager.php(273): think\DbManager->getConnectionConfig()
#1 /usr/share/nginx/html/shopxo/vendor/topthink/think-orm/src/DbManager.php(241): think\DbManager->createConnection()
#2 /usr/share/nginx/html/shopxo/vendor/topthink/think-orm/src/DbManager.php(223): think\DbManager->instance()
#3 /usr/share/nginx/html/shopxo/vendor/topthink/think-orm/src/DbManager.php(399): think\DbManager->connect()
#4 [internal function]: think\DbManager->__call()
#5 /usr/share/nginx/html/shopxo/vendor/topthink/framework/src/think/Facade.php(97): call_user_func_array()
#6 /usr/share/nginx/html/shopxo/app/service/ErrorLogService.php(36): think\Facade::__callStatic()
#7 /usr/share/nginx/html/shopxo/app/ExceptionHandle.php(81): app\service\ErrorLogService::ErrorLogAdd()
#8 /usr/share/nginx/html/shopxo/vendor/topthink/framework/src/think/initializer/Error.php(54): app\ExceptionHandle->report()
#9 /usr/share/nginx/html/shopxo/vendor/topthink/framework/src/think/initializer/Error.php(94): think\initializer\Error->appException()
#10 [internal function]: think\initializer\Error->appShutdown()
#11 {main}
thrown in /usr/share/nginx/html/shopxo/vendor/topthink/think-orm/src/DbManager.php on line 258
2.8. 网站安装
将网站目录拷贝到/usr/share/nginx/html目录下
刚开始时建议优先修改权限
cd /usr/share/nginx/html/shopxo
# 1. 设置正确的所有权
chown -R nginx:nginx /usr/share/nginx/html/shopxo
# 2. 设置正确的目录权限
find /usr/share/nginx/html/shopxo -type d -exec chmod 755 {} \;
find /usr/share/nginx/html/shopxo -type f -exec chmod 644 {} \;
# 3. 设置特定可写目录
chmod -R 777 /usr/share/nginx/html/shopxo/runtime
chmod -R 775 /usr/share/nginx/html/shopxo/public