添加fillable-pdf gem后Capistrano部署时monit无法启动Puma、Sidekiq
问题根因
fillable-pdf依赖rjb(Ruby Java Bridge)组件,rjb启动时必须读取正确的JAVA_HOME环境变量。你手动执行启动命令时使用的是交互式shell,会加载你配置的bashrc和全局环境变量,所以可以正常运行;但monit调用systemd启动Puma、Sidekiq服务时使用的是非交互式非登录shell,不会加载你修改的/etc/bash.bashrc、/etc/environment里的配置,导致rjb初始化失败,服务启动崩溃。
修复步骤
- 首先在deploy.rb中配置bundle传递环境变量,取消原有bundle_env_variables相关注释,修改为:
set :bundle_env_variables, -> { { JAVA_HOME: "/usr/lib/jvm/java-11-openjdk-amd64", DEPLOYMENT_NAME: fetch(:deployment_name) } }
- 修改Sidekiq的systemd服务单元配置,文件路径一般为
/etc/systemd/system/sidekiq-<你的应用名>-production.service,在[Service]配置段新增一行:
Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
修改完成后执行sudo systemctl daemon-reload使配置生效。
- 修改Puma的monit配置文件,路径一般为
/etc/monit/conf.d/puma_<你的应用名>_production,在启动Puma的命令前新增JAVA_HOME导出逻辑,示例:
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64 && bundle exec puma <原有启动参数>
修改完成后执行sudo monit reload加载新配置。
- 额外优化建议:不需要用sudo全局安装rjb,直接将rjb写入项目Gemfile由bundle统一管理即可,避免全局版本和项目依赖版本冲突。
配置完成后重新执行Capistrano部署,即可正常通过monit自动重启Puma和Sidekiq服务。
内容的提问来源于stack exchange,提问作者sajid nawaz
相关产品推荐
相关产品推荐

