要处理上传,经典的解决方案是将实际目录移出主网络空间,仅将其留给要签出的新版本(就像我在下面的脚本中所做的那样),然后使用 Apache 来“别名”它作为网站的一部分恢复原状。
Alias /uploads /home/user/uploads/
但是,如果您对服务器没有太多的控制权,那么您的选择就更少了。
我有一个脚本,用于将给定脚本部署到开发/实时站点(它们都在同一台服务器上运行)。
#!/bin/sh
REV=2410
REVDIR=$REV.20090602-1027
REPOSITORY=svn+ssh://topbit@svn.example.com/var/svn/website.com/trunk
IMAGES=$REVDIR/php/i
STATIC1=$REVDIR/anothersite.co.uk
svn export --revision $REV $REPOSITORY $REVDIR
mkdir -p $REVDIR/tmp/templates_c
chown -R username: $REVDIR
chmod -R 777 $REVDIR/tmp $REVDIR/php/cache/
chown -R nobody: $REVDIR/tmp $REVDIR/php/cache/ $IMAGES
dos2unix $REVDIR/bin/*sh $REVDIR/bin/*php
chmod 755 $REVDIR/bin/*sh $REVDIR/bin/*php
# chmod -x all the non-directories in images
find $IMAGES -type f -perm -a+x | xargs -r chmod --quiet -x
find $STATIC1 -type f -perm -a+x | xargs -r chmod --quiet -x
ls -l $IMAGES/* | grep -- "-x"
rm dev && ln -s $REVDIR dev
我输入了修订号,以及用于签出目录名称的日期/时间。中间的 chmod 也使图像的权限正常,因为它们也符号链接到我们的专用图像服务器。
最后发生的事情是旧的符号链接 .../website/dev/ 重新链接到新签出的目录。 Apache 配置的文档根目录为 .../website/dev/htdocs/
还有一个匹配的 .../website/live/htdocs/ docroot,同样,“live”是另一个符号链接。这是我的另一个脚本,它将删除实时符号链接,并将其替换为 dev 指向的任何内容。
#!/bin/sh
# remove live, and copy the dir pointed to by dev, to be the live symlink
rm live && cp -d dev live
我只是每隔几个数据推送一个新版本的网站,所以您可能不想每天使用几次(我的 APC 缓存不会喜欢该网站的多个版本),但对我来说,我发现这对于我自己的部署来说是没有问题的。