语言:php。目前不打算用框架,可能会用 Composer。能接受停机维护。主要就是网站修了漏洞或者添加功能后的升级。
网上搜不到,不知道是不是我用的关键词不对。我用“网站升级 流程”和“update website”在谷歌搜的。我还找了一本运维的书,结果扫了一眼目录和可能贴边的地方也没有。
目前我能想到的容易踩坑的地方有不关闭服务直接换网站代码可能会出导致数据不一致。不知道没有什么使用中的文件无法删除的防呆机制。我目前计划用 PHP 。但是我只能想到这一个坑,总感觉可能会有其他的坑。
语言:php。目前不打算用框架,可能会用 Composer。能接受停机维护。主要就是网站修了漏洞或者添加功能后的升级。
网上搜不到,不知道是不是我用的关键词不对。我用“网站升级 流程”和“update website”在谷歌搜的。我还找了一本运维的书,结果扫了一眼目录和可能贴边的地方也没有。
目前我能想到的容易踩坑的地方有不关闭服务直接换网站代码可能会出导致数据不一致。不知道没有什么使用中的文件无法删除的防呆机制。我目前计划用 PHP 。但是我只能想到这一个坑,总感觉可能会有其他的坑。
#!/bin/bash
# 网站升级脚本
# 配置
SITE_PATH="/var/www/mysite"
BACKUP_PATH="/var/backups/mysite"
DATE=$(date +"%Y%m%d_%H%M%S")
BACKUP_FILE="$BACKUP_PATH/backup_$DATE.tar.gz"
DB_USER="dbuser"
DB_PASS="dbpass"
DB_NAME="mydb"
# 1. 创建备份
echo "创建备份..."
mkdir -p $BACKUP_PATH
tar -czf $BACKUP_FILE $SITE_PATH
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_PATH/db_$DATE.sql
# 2. 启用维护模式
echo "启用维护模式..."
cp $SITE_PATH/maintenance.php $SITE_PATH/index.php
# 3. 更新代码
echo "更新代码..."
cd /tmp
git clone https://github.com/your/repo.git new_code
rsync -av --exclude='.git' --exclude='config.php' new_code/ $SITE_PATH/
# 4. 更新数据库
echo "更新数据库..."
php $SITE_PATH/db_migrate.php
# 5. 更新权限
echo "更新文件权限..."
find $SITE_PATH -type d -exec chmod 755 {} \;
find $SITE_PATH -type f -exec chmod 644 {} \;
chmod -R 777 $SITE_PATH/uploads
chmod -R 777 $SITE_PATH/cache
# 6. 清理缓存
echo "清理缓存..."
rm -rf $SITE_PATH/cache/*
service php7.4-fpm restart # 根据你的PHP版本调整
# 7. 恢复正常模式
echo "恢复正常模式..."
cp $SITE_PATH/index.php.bak $SITE_PATH/index.php
echo "升级完成!"
7 回答5.3k 阅读
4 回答4k 阅读
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答824 阅读✓ 已解决
2 回答3.3k 阅读
常说的 CI/CD 嘛,持续集成与持续部署。
简单的办法就是升级时把代码放到一个新目录下,释放完成后,健康检查通过后,再修改 web 服务器的配置文件,把 web 服务器中的网站目录改为新的目录,然后重新加载。
(如果是以补丁的方式,可以copy 当前的目录到新目录,然后覆盖补丁)
或者启动新服务在 A 端口,启动完成健康检查通过后,切换配置文件把 web 服务引导的新的端口上,都是办法,跟前面的思路是一样的,只是使用的场景不同。
相关的关键字:热部署、滚动更新(发布)
当然,或许我说复杂了,你也可能只是想要 网站后台有个在线升级按钮,点了以后就从远端下载新的代码回来并更新。
这种其实也比较常见,比如 wordpress 的主题/插件更新,因为 php 的特性而言,这些设计的就比较简单了,直接校验后解压覆盖就实现了。
不过在 windows 下,确实可能会存在被占用的情况,可以使用 shell_exec 等方法,调用一个外部脚本,用脚本控制,先停机,然后执行前面覆盖文件的步骤, 执行完成后再开机。
当然,这里的停开机不一定是指物理机器,而是程序内。比如在入口的 index.php 判断某个文件存在,就阻止请求,待解压处理完成后再删除这个文件,就能达到自动开机了。