必读说明
1.背景
Debian系统下的apache软件包版本较滞后,没有及时引入bug及安全漏洞的修复,比如debian8下的2.4.10版本长期存在scoreboard is full bug,会导致apache性能严重下降。最新版本修复了较多安全漏洞和bug,建议升级apache到最新版本2.4.58; 未升级的版本会面临各种已知的性能与安全漏洞风险。
2.影响
(1)请服主根据自身业务apache使用情况,决定升级时间,升级需要重启apache,约有10 s 左右不可用
(2)需要在3月31号前升级完成,并将升级情况和升级后的版本截图同步给运营同学
操作前检查方案
1. 查看当前系统版本
cat /etc/debian_version
(1)如果是debian10
,进入步骤2
(2)如是debian8
或debian9
,则需要换apt源
- debian8
# 备份当前apt源
cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
# 更新源
vim /etc/apt/sources.list
# 将下面源地址覆盖旧的源地址
deb http://apt.x.netease.com:8660/debian-archive/ jessie main non-free contrib
deb-src http://apt.x.netease.com:8660/debian-archive/ jessie main non-free contrib
deb http://apt.x.netease.com:8660/debian-security-archive/ jessie/updates main non-free contrib
deb-src http://apt.x.netease.com:8660/debian-security-archive/ jessie/updates main non-free contrib
deb http://sa.apt.netease.com:8660/debian/ jessie main
- debian9
# 备份当前apt源
cp -a /etc/apt/sources.list /etc/apt/sources.list.bak
# 更新源
vim /etc/apt/sources.list
# 将下面源地址覆盖旧的源地址
deb http://apt.x.netease.com:8660/debian-archive/ stretch main non-free contrib
deb-src http://apt.x.netease.com:8660/debian-archive/ stretch main non-free contrib
deb http://apt.x.netease.com:8660/debian-security-archive/ stretch/updates main non-free contrib
deb-src http://apt.x.netease.com:8660/debian-security-archive/ stretch/updates main non-free contrib
deb http://sa.apt.netease.com:8660/debian/ stretch main
2. 更新源缓存
apt update
3. 查看有无扩展包
通过命令 dpkg -l |grep apache
查看机器上apache版本,若为最新版本则无需升级(最新版本2.4.58),否则进行升级
也关注一下扩展包,已安装扩展包不会处理,会继续保留,但需重点关注是否有php扩展包,如有则后续升级apache版本操作会稍微复杂一点,如上截图就有三个扩展包,且有php扩展包
4. 备份当前apache运行端口
netstat -tnlp | grep apache | awk '{print $4}' | awk -F":" '{print $NF}' | sort -n > apache_old_port
5. 测试当前所有端口是否正常
for i in $(cat apache_old_port);do curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:$i;done
6. 记录已加载的模块
apache2ctl -M
7. 备份配置文件
cp -a /etc/apache2 /etc/apache2.$(date +%Y%m%d%H%M%s)
8. 备份旧包体文件
dpkg --listfiles $(dpkg --list | grep apache | grep -v apache2-2458 | awk '{print $2}' | tr '\n' ' ') | sort | uniq > rsync.list
mkdir -p backup-old-apache2
while read item; do if [ ! -d $item ]; then rsync -aR $item backup-old-apache2/; fi;done < rsync.list
升级执行步骤
1. 根据有无拓展包选择对应升级方式
情形一:无php扩展包升级方式
# 执行命令 进行Apache版本升级
apt-get update && apt-get install apache2-2458
情形二:有php扩展包升级方式
# mod_php强制依赖prefork mpm,在安装前先删除prefork配置
cd /etc/apache2/mods-enabled && rm -f mpm_prefork.*
# 升级Apache版本
apt-get update && apt-get install apache2-2458
# 删除升级后引入的event mpm
cd /etc/apache2/mods-enabled && rm -f mpm_event.*
# 重新引入prefork mpm
ln -s ../mods-available/mpm_prefork.* .
注意:安装过程会提示是否需要覆盖配置文件,请选择否(直接回车就行),即保留现有配置文件
2.升级命令执行完成后检查
执行命令 dpkg -l |grep apache 检查apache版本是否升级成功,预期能看到最新版本2.4.58 (deibian12升级成功只会有2.4.58一个版本,其他OS版本升级成功可以看到新旧两个版本)
执行命令 apache2ctl -v ,预期看到的版本是2.4.58
执行命令 apache2ctl -M 检查之前已安装好的扩展包
执行命令 apache2ctl -t 确保输出为 OK
3.重启apache
# 停止后再重启
/etc/init.d/apache2 stop
/etc/init.d/apache2 start
# 检查进程命令,确保apache服务重启成功
ps -ef |grep apache
# 再次执行命令,确保运行的版本为 2.4.58
/usr/sbin/apache2 -v
4.升级后的端口检查
# 备份升级后的端口号
netstat -tnlp | grep apache | awk '{print $4}' | awk -F":" '{print $NF}' | sort -n > apache_new_port
# 检查diff升级前后的端口号,如有diff,先排查diff后续,再继续后面操作
diff apache_old_port apache_new_port
# 升级后检查前保存的端口状态码是否正常
for i in $(cat apache_old_port);do curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:$i;done
5. curl检查业务状态是否有正确返回
# $ip为升级机器的ip,$port为apache业务的端口
curl http://$ip:$port
升级失败回滚方案
1.卸载新包
aptitude remove apache2-2458
2. 重装旧包
aptitude reinstall apache2 apache2-bin apache2-data apache2-utils