Rails 3.1部署到生产环境(使用Apache和Passenger)资产问题

10

Rails 3.1 改变了其处理资产管道的方式,导致在部署到生产环境时出现问题。

我正在使用 Apache 和 Passenger,它们似乎运行良好。

我的生产环境设置如下(暂时)。

# congif/environments/production.rb
config.cache_classes = false
config.consider_all_requests_local       = true
config.action_controller.perform_caching = true
config.serve_static_assets = false
config.assets.compress = true
config.assets.compile = false
config.assets.digest = true
config.action_dispatch.x_sendfile_header = "X-Sendfile" # for apache

我在Ubuntu上运行rake assets:precompile,然后启动服务器。但是...什么也没有发生。我的所有图片都没有加载。

传说中的“我找不到此URL上的图像”的框。

我在CentOS上运行rake assets:precompile,然后启动服务器。但是...出现了权限错误。

*Error Compiling CSS Asset*
Errno::EACCESS: Permission Denied - [app path]/tmp/cache/assets/E95
[path to RVM Ruby]/fileutils.rb:243:in 'mkdir'

我无法使它移动。非常感谢任何帮助。谢谢!

更新

这个解决方案每次都适用于我:

首先清理你的资源

rm -rf public/assets

rake assets:clean RAILS_ENV=production

其次,在 #production.rb 中进行更改

config.assets.compile = false
config.assets.compile = true

第三步,运行预编译你的资产

rake assets:precompile RAILS_ENV=production

第四步,在 #production.rb 文件中更改

config.assets.compile = true

返回

config.assets.compile = false

第五步,通过运行以下命令重新启动您的服务器:

touch tmp/restart.txt

第六步,通过运行以下命令取消限制您新创建的资源的权限:

chmod -R 777 public/assets

第七步,庆祝吧!

4个回答

8

这是一个简单的权限问题。给予服务器/守护进程在 [app_path]/tmp 递归创建文件的权限。

假设您的服务器进程使用 www-data 用户运行,则可以执行以下操作:

cd APP_PATH
chmod -R u+w tmp

如果该目录不属于该用户,您必须更改所有权:

chown -R www-data tmp

我尝试过了,但仍然出现相同的错误。我使用的是CentOS系统,而www-data不是有效的用户。我尝试了使用apache用户。更新:我运行了chown -R 755 tmp命令,问题得到解决! - mikeborgh
好的,你修复了我的CentOS错误,Michael de Silva修复了我的Ubuntu错误。谢谢你们! - mikeborgh
我该如何在Heroku上解决这个问题?我遇到了相同的问题,其中一张图片被拒绝访问。 - Igbanam
我在本地进行了更改并将其推送到Heroku。现在一切都正常工作。 - Igbanam

4
尝试通过sudo创建public/assets,或尝试执行rvmsudo rake assets:precompile - 实际上,它无法在您的服务器上创建目录,因此出现错误。

好的,你们修复了我的Ubuntu错误,Topek修复了我的CentOS错误。谢谢大家! - mikeborgh

0

在Windows 8上:

  1. 删除样式表的引用
  2. 重新启动生产环境
  3. 使用浏览器访问受影响的页面
  4. 添加样式表引用
  5. 重新启动生产环境
  6. 对我有用!

0

你更新的解决方案对我不起作用。 我使用Rails 4.2,只有在设置config.serve_static_files = true时CSS和JS才能正常工作(虽然这并不推荐,但这是我在这里使事情正常运转的唯一方法)。


这似乎不是一个答案。最好将其发布为评论。 - Alastair Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接