在 Ubuntu 26.04 LNMP安装后,为了防止apt update 自动升级大版本的升级,比如php 8.4 升级到8.5 或者7 升级到8 类似这样的升级配置一下,让其可以升级小版本,避免漏洞等更新。
下面将锁定 MySQL、Nginx、PHP 的主版本系列,允许同一系列内的安全更新和小版本更新,采用 APT Preferences(Pinning)实现,不使用 apt-mark hold。因为 hold 会阻止软件包正常更新,而我们希望保留同系列更新能力。

一、创建 APT 版本锁定规则
1. 锁定 MySQL 8.4

#创建配置:
sudo nano /etc/apt/preferences.d/mysql
# 写入:
Package: mysql-server mysql-server-core mysql-server-core-8.4 mysql-client mysql-client-core mysql-client-core-8.4 mysql-community-server mysql-community-server-core mysql-community-client
Pin: version 8.4.*
Pin-Priority: 1001

说明:
- 允许 MySQL 8.4.x 更新。
- 限制不匹配 8.4.x 的候选版本。
- mysql-common 不直接放入规则,避免其包版本格式与 MySQL 主版本不一致导致规则失效。
2. 锁定 Nginx 1.28

#创建配置:
sudo nano /etc/apt/preferences.d/nginx
#写入:
Package: nginx nginx-core nginx-common nginx-full nginx-light nginx-extras nginx-dev
Pin: version 1.28.*
Pin-Priority: 1001

允许 1.28.x 系列更新,避免升级到其他版本系列。

3. 锁定 PHP 8.5

#创建配置:
sudo nano /etc/apt/preferences.d/php
#写入:
Package: php8.5*
Pin: version 8.5.*
Pin-Priority: 1001

PHP 包名已经限定 PHP ABI 版本为 8.5,规则适用于版本号以 8.5. 开头的 PHP 包。
注意: php8.5-redis、php8.5-igbinary 等扩展包自身的 Debian 版本号可能是 6.2.0-1ubuntu1、3.2.16-4ubuntu1,并不以 8.5. 开头。因此上述版本规则不会匹配它们。这些扩展需要单独检查,不能认为已经通过该规则锁定。

4. 锁定redis

#创建文件
sudo nano /etc/apt/preferences.d/redis
# 内容如下:
Package: redis-server redis-tools
Pin: version 7.*
Pin-Priority: 1001

二、更新软件包索引
执行:

sudo apt update


三、检查锁定规则是否生效

#1. 检查 MySQL
apt-cache policy mysql-server
#2. 检查 Nginx
apt-cache policy nginx
#3. 检查 PHP
apt-cache policy php8.5-fpm

重点检查:
- Installed:当前安装版本。
- Candidate:APT 计划安装的候选版本。
- 版本列表中的优先级是否符合预期。

四、模拟升级,确认实际升级范围

这是最重要的一步。
sudo apt-get -s upgrade

如果希望模拟完整升级(包括可能需要安装或删除依赖的情况),可以另外执行:
sudo apt-get -s full-upgrade

模拟升级不会真正修改系统。

重点检查输出中是否出现:
Inst mysql-server
Inst nginx
Inst php8.5-fpm
如果出现,需要进一步检查括号中的目标版本。

例如:
Inst mysql-server [8.4.11...] (8.4.13...)

这是正常的 MySQL 8.4 小版本升级。
如果出现 9.x,则说明当前规则没有有效限制该候选版本,需要进一步调整。

五、正式升级
#确认模拟结果没有跨大版本升级后,执行:
sudo apt upgrade
#不建议在没有检查模拟结果的情况下直接执行:
sudo apt full-upgrade
#因为 full-upgrade 可能为了满足依赖关系安装或删除软件包。

六、日常维护命令
操作    命令
更新软件源    sudo apt update
查看可升级软件    apt list --upgradable
模拟升级    sudo apt-get -s upgrade
正式升级    sudo apt upgrade
检查 MySQL 版本    mysql --version
检查 Nginx 版本    nginx -v
检查 PHP 版本    php -v
查看 Pin 配置    cat /etc/apt/preferences.d/mysql /etc/apt/preferences.d/nginx /etc/apt/preferences.d/php

七、重要注意事项
1. APT Pinning 不是完整的版本锁定机制。 当前配置主要提高目标版本的优先级,并没有显式禁止所有不匹配的版本。若要严格禁止跨大版本,需要进一步添加针对非目标版本的负优先级规则,并验证所有相关依赖包。
2. Ubuntu 系统更新、内核更新、其他软件包更新不受这三份配置全面控制。
3. PHP 扩展需要独立检查,尤其是 Redis、igbinary 等版本号不以 PHP 版本开头的包。
4. MySQL 相关依赖包也需要检查,不能只锁定 mysql-server 一个包。
5. 升级前建议备份数据库和网站文件。