我有两个版本的网站,我必须多次快速交换。
在我的主目录中,我有:
drwxr-x--- 8 lorem nobody 4096 Jul 12 20:50 public_html/
drwxr-x--- 3 lorem nobody 4096 Jul 13 12:59 public_html_3.0/
public_html
拥有当前网站,public_html_3.0
拥有新网站。
我希望通过以下方式替换这两个:
//move the complete current site to another tmp location
mv public_html public_html_2.0
//move the new site in place
mv public_html_3.0 public_html
在测试帐户上尝试后,我收到禁止您无权访问/在此服务器上。错误。
我已确保public_html_ * 文件夹具有相同的权限,但我想这是一个符号链接问题?我是不是想做一些不可想象的事情而且不推荐?
在CentOs 5.9上使用具有root权限的VPS WHM / Cpanel。
修改
经过一些网络阅读后,我删除了public_html
(移至临时)和sym链接的public_html -> public_html_3.0
,导致:
lrwxrwxrwx 1 lorem nobody 15 Jul 13 14:11 public_html -> public_html_3.0/
drwxr-x--- 3 lorem nobody 4096 Jul 13 12:59 public_html_2.0/
drwxr-x--- 2 lorem nobody 4096 Jul 13 14:02 public_html_3.0/
lrwxrwxrwx 1 lorem lorem 11 Jul 9 2012 www -> public_html/
结果仍然相同。
答案 0 :(得分:1)
如上所述移动public_html不是一个大问题。
mv public_html public_html_2.0 mv public_html_3.0 public_html
如果你知道自己在做什么,这些都是无害的命令。
确保两个目录都有750个权限。
chmod 750 public_html *
然后确保两个目录中的文件都具有正确的权限。
find / home / user / public_html / -type f -exec chmod -R 644 {} \; 找到/home/user/public_html_3.0/-type f -exec chmod -R 644 {} \;
find / home / user / public_html / -type d -exec chmod -R 755 {} \; 找到/home/user/public_html_3.0/-type d -exec chmod -R 755 {} \;
还要确保所有权也正确无误。递归地改变那些
chown -R lorem:/ home / user / public_html / * chown -R lorem:/home/user/public_html_3.0 / *
如果你使用的是suphp处理程序,你也可以使用lorem:nobody。如果有帮助,请告诉我们。
答案 1 :(得分:1)
我遇到的错误(禁止您无权访问/在此服务器上。)是新网站的错误放置的根文件夹,而不是文件系统问题。新网站实际上位于~/public_html_3.0/public_html/
,因为我解压错了。我设置的新sym-link public_html => public_html_3.0
现在指向没有索引文件的文件夹,因此出错。
替代解决方案
Leo Prince的回答是正确的,但我会提供一个单指令开关的替代解决方案,这也适用于我(解释像我这样的新手):
此解决方案要求您为服务器或此特定VirtualHost启用FollowSymlinks,并假定您的vhost指向/ home / user / public_html(〜/ public_html)。有关许可/所有权说明,请参阅已接受的答案。
我们假设您的旧网站位于~/public_html
,新网站位于~/app2
。
-public_html
-index.html
-other.html
-app2
-index.html
-other_new.html
首先,将旧网站复制到新目录:
# mkdir app1
# cp -a public_html/. app1/.
// -a option copies recursively with permissions/owners/groups
// but doesn't follow symbolic links
然后将public_html移动(重命名)到临时目录,然后从public_html到旧应用程序创建符号链接。
# mv public_html public_html_bak
// moves the public_html "out of way"
# ln -s app1 public_html
// creates a symbolic-link
# ls -l
drwxr-x--- user nobody app1/
drwxr-x--- user nobody app2/
lrwxr-x--- user nobody public_html -> app1/
drwxr-x--- user nobody public_html_bak/
这使〜/ public_html POINT为〜/ app1。 Read more on symbolic links。服务器看到public_html,但文件来自app1。
如果不起作用,请返回上一个状态:
# rm public_html
//// use rm, NOT rmdir, since it's a symlink, not a dir
# mv public_html_bak public_html
// return backup to previous location
如果有效,您希望切换到新网站(app2)的那一刻,您需要更改符号链接以指向app2目录:
# rm public_html; ln -s app2 public_html
// remove existing link, create new link with a single line (instant change)
# ls -l
drwxr-x--- user nobody app1/
drwxr-x--- user nobody app2/
lrwxr-x--- user nobody public_html -> app2/
drwxr-x--- user nobody public_html_bak/
虽然这与连续执行两个文件夹重命名大致相同,但它可以对应用程序版本进行全面检查,这正是我想要实现的目标:
# ls -l
drwxr-x--- user nobody app2.3/
drwxr-x--- user nobody app3.0/
drwxr-x--- user nobody app3.1/
drwxr-x--- user nobody app3.2b/
lrwxr-x--- user nobody public_html -> app3.0/ <- the current active version
# rm public_html; ln -s app3.1 public_html
/// a one-line switch to a different app version
/// first remove the symbolic link; then create new
当然,所有应用程序目录都必须具有适当的权限,如上面接受的答案和所有者所述:目录组必须与原始的public_html相同。此外,符号链接必须属于同一用户:具有相同权限的组,以防您的服务器配置仅允许来自同一用户的符号链接。
请注意,要删除符号链接,您应该使用rm
,而不是rmdir
,因为如果您尝试删除实际目录,它将会失败。
我还在学习* NIX,所以我不知道这个解决方案可能存在一些问题。但是对于频繁的版本更改,这就像魔术一样:)