0

我在使用 Nginx 的生产环境中实现Delayed_Job_Active_Record gem 时遇到问题。用户提交了一个“联系我们”表单,Nginx 调用了相关的控制器操作,以下代码行失败:

@contact.delay.send_contact_form

其中相关方法为:

def send_contact_form
   ContactMailer.contact_us(self).deliver
end  


开发环境:OK

  • 在我的本地机器上,我有 Webrick 提供的页面。一切运行良好,延迟的作业通过“Delayed_Jobs”表并发送电子邮件。


生产环境 - Rails 控制台:好的

  • 在服务器上,如果我手动创建@contact和调用@contact.delay.send_contact_form,延迟的作业会通过延迟的作业表并发送电子邮件。


生产环境 - Webrick:好的

  • 在服务器上,如果我启动 Rails Webrick 服务器并@contact通过 Web 界面输入数据,然后提交作业,则会通过延迟的作业表并发送电子邮件。


生产环境 - Nginx:错误

  • 该应用程序目前由 Nginx 提供服务。
  • 如果我通过 Nginx 访问界面并输入数据@contact并提交页面会挂起。
  • 生产日志在控制器操作上给出以下错误,(参考上面的行):

    NoMethodError(#< Contact:0x000000052962b0> 的未定义方法“延迟”)


我还确认 Rails、Ruby 以及 Delayed_Job_Active_Record 和 Daemons gem 的版本在两种环境中是相同的。

任何帮助将不胜感激,因为我已经坚持了一段时间。我想找到一个与 Nginx 一起使用的解决方案,它可以为我提供与“延迟作业”相同的功能。

谢谢。

4

1 回答 1

0

事实证明,问题在于 Unicorn/Nginx 在部署代码更新时没有重新启动,导致它们的配置不正确。将 Devise 和其他 gem 添加到应用程序时也会出现此问题。

最初的解决方案是在部署后(通过 Capistrano)登录到 VPS shell 并运行以下命令:

重启独角兽:

/etc/init.d/unicorn_esg stop
/etc/init.d/unicorn_esg start

其中 *unicorn_esg* 是我的 deploy.rb 配置中使用的应用程序的 Unicorn 引用。

重启 Nginx:

sudo service nginx restart

下一步是将其合并到 deploy.rb 脚本的末尾,以便在每次部署结束时自动运行。

于 2013-05-11T09:04:38.677 回答