生产环境下使用wicked_pdf生成PDF失败问题求助
解决生产环境Nginx-Passenger下WickedPDF找不到rake依赖的问题
核心原因
Passenger运行时未正确加载项目的Bundler依赖环境,导致调用wkhtmltopdf时无法找到rake gem;而rails s和rails c直接使用本地shell的Bundler环境,因此能正常运行。
解决步骤
1. 确保Passenger指向正确的Ruby和Bundler版本
- 检查Nginx配置(通常在
/etc/nginx/sites-available/你的项目配置文件),确认passenger_ruby指向项目使用的Ruby路径(比如rbenv的~/.rbenv/versions/2.7.6/bin/ruby,或rvm的对应路径),避免使用系统默认Ruby - 在server块中添加指定Bundler版本的指令:
passenger_bundler_version 2.1.4; - 重启Nginx生效:
sudo systemctl restart nginx
2. 重新安装项目依赖并验证
- 进入项目根目录,执行部署模式安装依赖,确保所有gem安装到项目本地:
bundle install --deployment - 验证rake是否存在:
输出应显示rake-13.0.6的安装路径,确认依赖已正确安装bundle show rake
3. 配置WickedPDF使用Bundler环境调用
- 在
config/initializers/wicked_pdf.rb中添加配置,明确使用bundle exec调用wkhtmltopdf:
强制WickedPDF在项目的Bundler环境下执行命令,避免环境不一致WickedPdf.config = { exe_path: `bundle exec which wkhtmltopdf`.chomp }
4. 明确Passenger的Gemfile路径
- 在Nginx的server块中添加环境变量指定Gemfile位置:
确保Passenger加载生产环境的依赖配置passenger_env_var BUNDLE_GEMFILE /path/to/your/project/Gemfile; passenger_app_env production;
内容的提问来源于stack exchange,提问作者Huy Vo
相关产品推荐
相关产品推荐

