部署 关于部署的时候的 public 目录是否可以做成一个 link 目录?

piginzoo · 2012年03月21日 · 最后由 huacnlee 回复于 2012年03月23日 · 2779 次阅读

我们开启了页面的 cache,这样,动态访问后,只要不变化就会缓冲到 public 目录下。

但是一旦重新部署,public 目录就被会被新的 release 替代,那些 cache 的页面 html 都没了,只能再重新生成了。我想了个办法,就是把 public 目录做成一个软链接目录,每次新的 release 从 git 拉下来后,就把 public 里面的东西拷贝到一个 share 目录中,然后删除掉 release 目录中的 public 目录,最后把 share 目录软链接到 release 的 public 目录中。

简而言之,就是 public 目录是一个软链接目录,这样 cache 就可以永远在一个固定目录中了。

但是,我这样做了后,访问站点的时候,总是报错:

2012/03/21 21:27:45 [error] 8496#0: *1 directory index of "/data/www/current/public/" is forbidden, client: 192.168.0.171, server: localhost, request: "GET / HTTP/1.1", host: "192.168.0.106"

但是我去访问静态页面是存在的 http://192.168.0.106/test.htmlnginx没有找到ruby的环境,但是我ps发现passenger进程都是好好的。,感觉是,

我的问题是:

1.难道 passenger 就不能把 nginx 的 root 配置成软链接目录么?何种原因导致无法启动 ruby 呢?

2.大家有好的办法,能让我保留我的那些缓冲么?你知道的,重新部署后,那些缓冲的千千万万的页面要是拷贝过来是多费资源的事啊。你们是怎么解决这个问题的呢?rubychina 也应该会遇到这个问题吧?如何解决的呢?问一下@rei@huacnlee

其实,第二个问题才是我真正困惑的。

整页 cache 是个好东西, http://www.modrails.com/documentation/Users%20guide%20Nginx.html#_page_caching_support

顺道问一下,在实际生产中,大家在大量采用么?

整页 cache 很少用,至少顶部有个用户导航是要变的

#3 楼 @Rei 很多网站顶部导航都是 ajax 进来的吧,比如京东

#2 楼 @piginzoo page caching 的过期策略比较麻烦,所以不太常用。最多也就首页用一下。

不过,对于大量的内容型的网站,个人觉得 Cache 还是很有用的,至少省得我去找静态化的方案去了,这种方式简单易用。比如说,生成大量的文章一类的东西。

1.可能与 pubic 目录以 nginx 启动 worker 的用户权限有关

  1. 保留缓存有很多办法吧,除了软硬链接,cp 或 mv 也可行的

检查一下权限吧

@blogbin, @suupic ,权限我查过了,应该不是权限的问题, 另外,保留缓冲如果用 cp 和 mv,我很担心性能,当缓冲的内容非常多的时候,会大量的拷贝, 不过实在没有办法,也只好如此了。

可以使用 nfs 或者 moosefs

page cache 的目录可以设置的啊,不一定要放在 public 目录下,一般可以设置放在 tmp/cache 目录下,然后就任你折腾了。

因为 public 这个目录比较特殊,还真没试过用软链接的办法。

#2 楼 @piginzoo 实际场景里面 page caching 几乎为零,正如 @Rei 所说。 整页 cache 的我都用 action caching 代替,他不会缓存 layout 的东西,所以用户栏的信息就不会被缓存到。

至于 public 发布的时候被 release 代替的问题,你可以在发布前将 别的目录 ln 过来。 参考:https://github.com/huacnlee/ruby-china/blob/master/config/deploy.rb#L43

你的问题是权限问题,都说了要把 Rails 环境部署到用户的 Home 目录吧,总碰上权限的地雷不累啊,干嘛非得部署到 /data 下面 /var/www 下面 或者 ...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号