如何在生产服务器上运行Sidekiq?

65

我有一个带有Apache + Passenger的服务器。

我该如何在生产环境中运行sidekiq?是否需要任何配置来运行它?

bundle exec sidekiq

谢谢


你应该运行Redis服务器 - 就这样。 - Marek Lipka
我在控制台中运行redis-server,它显示[14754] 09 Apr 10:07:13 # Opening port: bind: Address already in use。 但是如果我发送电子邮件,它不起作用。没有电子邮件被接收到。 - Debadatt
@MarekLipka.. 使用Capistrano运行命令'bundle exec sidekiq'是可以的。但如果我停止它,邮件就发送不出去了。 - Debadatt
3个回答

149

bundle exec sidekiq -d -L log/sidekiq.log -C config/sidekiq.yml -e production

-d, 将进程作为守护进程运行

-L, 指定可写日志文件的路径

-C, 指定YAML配置文件的路径

-e, 应用程序环境


如果Sidekiq进程由于任何原因崩溃,我们该如何重新启动? - Debadatt
6
杀死 ps aux | grep sidekiq | grep -v grep | awk '{print $2}' 的进程,然后执行 bundle exec sidekiq -d -L log/sidekiq.log -C config/sidekiq.yml -e production - DeeDub
这不再是一个有效的答案。请查看Brian Warren的答案,获取正确的方法。 - jamesc

34

使用操作系统提供的进程监管器比使用守护进程-d标志更好的解决方案。这也是sidekiq gem's wiki提供的建议:

我强烈建议不要使用-d标志,而是使用进程监管器如systemd或upstart来管理Sidekiq(或任何其他服务器守护程序)。这可以确保如果Sidekiq由于某种原因崩溃,它将立即重新启动。

该wiki提供了upstart和systemd的示例配置文件,可以在repo的"examples"目录中找到。

注意:在我的CentOS 7服务器上,我使用rvm(Ruby版本管理器)。我必须执行额外的步骤来确保我的systemd脚本(/etc/systemd/system/sidekiq.service)能够可靠地启动和停止sidekiq,即使我的ruby和/或gemset路径在未来发生变化。最重要的指令是"ExecStart",在我的脚本中看起来像下面这样:

ExecStart=/usr/local/rvm/wrappers/surveil/bundler exec sidekiq -e production -L log/sidekiq.log -C config/sidekiq.yml

路径的一部分 "/usr/local/rvm/wrappers/surveil" 实际上是一个符号链接,在部署期间我使用 'rvm alias' 的帮助重新创建它,以确保它始终指向应用程序的 Ruby 版本和 gemset,两者都有可能在不同的部署之间发生变化。这是通过创建一个在部署期间运行的 rake 任务来实现的,该任务执行以下等效操作:

rvm alias delete surveil
rvm alias create surveil ruby-#{new_ruby_version}@#{new_gemset_name}

通过在部署期间设置此别名/符号链接,我可以安全地保持systemd脚本不变,并且它将继续正常工作。这是因为路径“/usr/local/rvm/wrappers/surveil/bundler”始终指向正确版本的bundler,从而受益于bundler魔法,使其目标在应用程序配置的ruby/gem环境中运行。

这应该是被接受的答案。在 Sidekiq 版本 > 6.0 中,守护进程 "-d" 标志已被弃用。 - jamesc

19

当您启动Sidekiq时,通过传递-d参数,应该能够将其作为后台进程(守护程序)启动:

bundle exec sidekiq -d

虽然此答案现在对您有用,但请注意,如果任何原因导致Sidekiq进程崩溃,进程必须手动重新启动。 了解如何更可靠地运行Sidekiq生产环境的好开始位置在这里:https://github.com/mperham/sidekiq/wiki/Deployment


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接