如何将Rails项目文件读写路径从RAILS_ROOT/public/assets改为/extra_drive?
嘿,这个问题我之前帮不少开发者搞定过,首先得明确你要迁移的是两类文件:一类是Rails预编译出来的静态资源(比如CSS、JS、静态图片),另一类是用户上传的动态文件(比如用户头像、上传的文档)——这俩的处理方式完全不同,我分开给你拆解:
一、迁移预编译的静态Assets(原来存在RAILS_ROOT/public/assets)
这类静态资源在生产环境下是由Web服务器(比如你用的Apache)直接处理的,所以得同时调整Rails配置和Apache的配置:
1. 先改Rails的预编译路径
打开你的config/production.rb(或者全局的config/application.rb),添加/修改这行配置,指定预编译后的assets输出到外部目录:
# 把预编译的assets输出到/extra_drive/assets config.assets.prefix = '/extra_drive/assets' # 要是你用的是Rails 6+的Webpacker管理前端资源,还要改config/webpacker.yml里的public_output_path,改成'/extra_drive/packs'
改完之后,重新预编译一次assets:
RAILS_ENV=production bundle exec rails assets:precompile
2. 再配置Apache的Alias映射
因为生产环境下Apache直接处理静态资源请求,所以得告诉它:当用户访问你的域名/assets/xxx时,去/extra_drive/assets里找文件。打开你的Apache虚拟主机配置文件,添加这段:
Alias /assets /extra_drive/assets <Directory /extra_drive/assets> Options FollowSymLinks AllowOverride None Require all granted </Directory>
保存后重启Apache,这样静态资源的请求就会直接指向外部目录,不用经过Rails了。
二、迁移用户上传的动态文件
如果是用户上传的文件(比如用Active Storage、CarrierWave这些工具管理的),只需要在Rails里调整存储配置就行,不用动Apache:
1. 用Active Storage的情况
打开config/storage.yml,新增一个指向外部目录的存储配置:
external_uploads: service: Disk root: /extra_drive/uploads
然后在config/production.rb里指定使用这个存储服务:
config.active_storage.service = :external_uploads
2. 用CarrierWave的情况
找到你的上传器类(比如app/uploaders/image_uploader.rb),修改存储目录的配置:
class ImageUploader < CarrierWave::Uploader::Base storage :file # 上传文件的存储目录 def store_dir '/extra_drive/uploads/images' end # 缓存目录也可以改到外部,避免占Rails项目的空间 def cache_dir '/extra_drive/uploads/tmp' end end
必做:检查目录权限
不管是哪种场景,都得确保Rails进程(比如Puma、Passenger)和Apache进程有对应的权限访问/extra_drive目录:
# 假设运行Rails和Apache的用户是www-data,给目录设置权限 sudo chown -R www-data:www-data /extra_drive sudo chmod -R 755 /extra_drive
最后总结一下
- 静态Assets:必须同时改Rails预编译路径 + Apache的Alias配置
- 动态上传文件:只需要调整Rails的存储工具配置(Active Storage/CarrierWave)
- 权限是最容易踩坑的点,一定要确认进程能读写/读取目标目录
内容的提问来源于stack exchange,提问作者Noam B.

