使用作为守护任务运行的延迟作业部署 Rails 应用程序

Posted

技术标签:

【中文标题】使用作为守护任务运行的延迟作业部署 Rails 应用程序【英文标题】:Deploy Rails Application with delayed_job running as daemon task 【发布时间】:2017-07-08 02:39:06 【问题描述】:

我意识到有一些关于此的文章,但我正在尝试在 Elastic Beanstalk 上部署 Rails 应用程序并在部署过程中启动延迟作业,但我还没有设法让它工作。

我尝试在 .ebextensions 文件夹中设置一个配置文件:

命令: 创建后目录: 命令:“mkdir /opt/elasticbeanstalk/hooks/appdeploy/post” 忽略错误:真

文件: “/opt/elasticbeanstalk/hooks/appdeploy/post/restart_delayed_job.sh”: 模式:“000755” 所有者:根 组:根 内容:| #!/usr/bin/env bash

  # Loading environment data
  EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
  EB_APP_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
  EB_APP_PID_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_pid_dir)
  EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
  EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)
  # Export EB_APP_LOG_DIR so we can access it when running bin/delayed_job below,
  # which accesses config/initializers/delayed_job.rb, which uses EB_APP_LOG_DIR.
  export EB_APP_LOG_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_log_dir)

  # Make sure the delayed_job.log exists and is owned by $EB_APP_USER
  touch $EB_APP_LOG_DIR/delayed_job.log
  chown $EB_APP_USER:$EB_APP_USER $EB_APP_LOG_DIR/delayed_job.log

  # Setting up correct environment and ruby version so that bundle can load all gems
  . $EB_SUPPORT_DIR/envvars
  . $EB_SCRIPT_DIR/use-app-ruby.sh

  # Now we can do the actual restart of the worker. Make sure to have double quotes when using env vars in the command.
  # For Rails 4, replace script/delayed_job with bin/delayed_job
  cd $EB_APP_DEPLOY_DIR
  su -s /bin/bash -c "bundle exec bin/delayed_job --pid-dir=$EB_APP_PID_DIR restart" $EB_APP_USER
  su -s /bin/bash -c "bundle exec bin/delayed_job --pid-dir=$EB_APP_PID_DIR status" $EB_APP_USER

非常感谢任何帮助使其正常工作!

【问题讨论】:

这个运气好吗? 【参考方案1】:

在花了很多时间在这之后,我终于让它与以下内容一起工作。虽然它不适用于delayed_job,但我相信这解决了获取rails 环境设置以使包运行的相同问题。

.ebextensions/01_my_server.config

files:
"/opt/elasticbeanstalk/hooks/appdeploy/post/99_restart_my_servers.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
        #!/usr/bin/env bash
        EB_APP_USER=$(/opt/elasticbeanstalk/bin/get-config container -k app_user)
        EB_APP_DEPLOY_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_deploy_dir)
        EB_APP_PID_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k app_pid_dir)
        EB_SCRIPT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k script_dir)
        EB_SUPPORT_DIR=$(/opt/elasticbeanstalk/bin/get-config container -k support_dir)

        . $EB_SUPPORT_DIR/envvars
        . $EB_SCRIPT_DIR/use-app-ruby.sh

        mkdir -p /home/webapp
        chown webapp:webapp /home/webapp
        mkdir -p /home/webapp/pids
        chown webapp:webapp /home/webapp/pids

        cd $EB_APP_DEPLOY_DIR
        su -m -c "bundle exec bin/my_server.rb --pid-dir=/home/webapp/pids restart" -s /bin/bash webapp

注意事项:

使用 su -m 选项保留环境变量。 使用 su -s 选项为 webapp 用户指定 shell。 守护进程 pid 需要存储在 /var/app/current 之外,因为每次新部署都会删除它(因此会中断重新启动守护进程)

【讨论】:

以上是关于使用作为守护任务运行的延迟作业部署 Rails 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kubernetes cron 作业中启动 rails rake 任务

销毁 Rails 中所有延迟的工作

启动或确保延迟作业在应用程序/服务器重新启动时运行

检查延迟的作业是不是在rails中运行

在 Ruby on Rails 应用程序/内存泄漏中分析延迟作业任务

在其他方法完成后运行方法延迟作业 rails 3