【问题标题】:Puma does not start after server reboot服务器重启后 Puma 不启动
【发布时间】:2017-04-08 20:52:21
【问题描述】:

我用 capistrano 部署了项目,但是 puma 在服务器重启后没有启动..

我应该这样做 -> cap production puma:start 每次

我试过了:

/etc/init.d/myscript

#!/bin/sh
/etc/init.d/puma_start.sh

puma_start.sh

#!/bin/bash 
puma -C /root/project/shared/puma.rb

但是,我有错误

/usr/local/rvm/rubies/ruby-2.3.3/lib/ruby/site_ruby/2.3.0/rubygems.rb:270:in `find_spec_for_exe': can't find gem puma (>= 0.a) (Gem::GemNotFoundException)
    from /usr/local/rvm/rubies/ruby-2.3.3/lib/ruby/site_ruby/2.3.0/rubygems.rb:298:in `activate_bin_path'
    from /usr/local/rvm/gems/ruby-2.3.3@project/bin/puma:22:in `<main>'
    from /usr/local/rvm/gems/ruby-2.3.3@project/bin/ruby_executable_hooks:15:in `eval'
    from /usr/local/rvm/gems/ruby-2.3.3@project/bin/ruby_executable_hooks:15:in `<main>'

如果我输入控制台root@host:~# puma -C /root/project/shared/puma.rb 它可以工作,一切正常。

我认为我没有正确的 gem puma 路径

如何在服务器重新启动后执行 puma 自动启动
谢谢你

【问题讨论】:

  • 我的启动脚本之一也有类似的问题。这是由于同样的错误,gem not found。我通过显式传递 rvm gemset 路径并从那里执行 gem 来解决它。像这样,#{HOME_PATH}/.rvm/wrappers/jruby-1.7.13@my_repo/bundle exec rake
  • 更多研究发现了这个 puma 工具。它可以满足您的需要。 github.com/puma/puma/tree/master/tools/jungle/init.d 它将 puma 作为恶魔服务运行,并且还将在服务器启动时启动
  • 好的,我在 '/etc/init.d' 中创建了文件 'puma',在 '/usr/local/bin' 中创建了 'run-puma' 文件,然后将行 - 'CONFIG=/ root/project/shared/puma.rb' 进入 puma 文件 .. 我有 (* Status Puma rack web server puma * --> #!/usr/bin/env is not there ) .. 我不明白我该如何开始(puma -C /root/project/shared/puma.rb)
  • 您是否尝试过该文章中给出的确切步骤?
  • 是的,但我不明白它如何与我的 rails 应用程序一起使用。我运行 'sudo service puma start',然后看到 '* => Running the Jungle...'。 . 我运行 sudo service puma status ,看到 * Status Puma rack web server puma .. 但是我如何关联我的 Rails 应用程序和 puma?

标签: ruby-on-rails linux capistrano puma start-stop-daemon


【解决方案1】:

从 Ubuntu 16.04 开始推荐使用 systemctl。在我使用暴发户之前。 我为自己创建了这个指令。也许它会对某人有用。

https://gist.github.com/DSKonstantin/708f346f1cf62fb6d61bf6592e480781


说明:

Article: https://github.com/puma/puma/blob/master/docs/systemd.md
#1 nano /etc/systemd/system/puma.service
#2 paste from puma.service

Commands:
# After installing or making changes to puma.service
systemctl daemon-reload

# Enable so it starts on boot
systemctl enable puma.service

# Initial start up.
systemctl start puma.service

# Check status
systemctl status puma.service

# A normal restart. Warning: listeners sockets will be closed
# while a new puma process initializes.
systemctl restart puma.service

puma.service 文件

[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple

User=root
Group=root

WorkingDirectory=<path_to_project>/current
Environment=SECRET_KEY_BASE='<SECRET KEY>'

ExecStart=/usr/local/rvm/bin/rvm <ruby_version>@<gemset_name> do bundle exec puma -C <path_to_project>/shared/puma.rb --daemon
ExecStop=/usr/local/rvm/bin/rvm <ruby_version>@<gemset_name> do bundle exec pumactl -S <path_to_project>/shared/tmp/pids/puma.state -F <path_to_project>/shared/puma.rb stop

#Restart=always
Restart=on-failure

[Install]
WantedBy=multi-user.target

【讨论】:

  • 您好,链接随时可能中断。请edit您的回答直接在帖子中包含任何相关信息,并提供链接仅供参考。
  • 有什么方法可以从配置文件(例如:application.yml)中导入 ENV?
【解决方案2】:

我找到了这个http://codepany.com/blog/rails-5-puma-capistrano-nginx-jungle-upstart/

这对我有帮助 ->

cd ~
$ wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma-manager.conf
$ wget https://raw.githubusercontent.com/puma/puma/master/tools/jungle/upstart/puma.conf

打开下载的 puma.conf 文件并设置系统的用户帐户为 setuid 和 setguid。 (在我们的例子中,我们使用 root 帐户,但建议使用权限较低的帐户):

vim puma.conf

setuid root
setgid root

将下载的 upstart 文件移动到 /etc/init 并创建另一个 puma.conf

$ sudo cp puma.conf puma-manager.conf /etc/init
$ sudo touch /etc/puma.conf

打开 /etc/puma.conf 并添加应用路径:

/root/name_of_your_app/current

打开 /etc/init/puma.conf ,找到类似的东西

exec bundle exec puma -C /root/project/shared/puma.rb

并替换您的文件 puma.rb 的路径

谢谢

【讨论】:

    【解决方案3】:

    实际上有一种非常简单的方法可以诊断和解决这个问题:

    1. 找到您的 rvm 可执行文件。

    which rvm
    

    在我的情况下是:

    /usr/share/rvm/bin/rvm
    

    ...但你的可能不同!所以你必须首先找出你的可执行文件在哪里。

    2. 找出您的服务器正在运行的 Ruby 版本。

    ruby --version
    

    对我来说是 2.6.2。您只需要那个版本号。没有别的了。

    3. 尝试类似 Konstantin 推荐的方法,但改为:

    [Unit]
    Description=Puma HTTP Server
    After=network.target
    
    [Service]
    Type=simple
    User=root
    Group=root
    WorkingDirectory= /var/www/your/current
    
    ExecStart=/usr/share/rvm/bin/rvm 2.6.2 do bundle exec pumactl -S /var/www/your/shared/tmp/pids/puma.state -F /var/www/your/shared/puma.rb start
    ExecStop=/usr/share/rvm/bin/rvm 2.6.2 do bundle exec pumactl -S /var/www/your/shared/tmp/pids/puma.state -F /var/www/your/shared/puma.rb stop
    
    # Restart=always
    Restart=on-failure
    
    [Install]
    WantedBy=multi-user.target
    

    4. 那么这是一个简单的问题:

    systemctl daemon-reload
    systemctl enable puma.service
    systemctl start puma.service
    systemctl status puma.service
    

    那就这样吧!下次启动服务器时,puma 应该可以正常启动。

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2016-09-13
      • 2011-04-21
      • 2023-03-17
      • 2016-11-14
      • 2020-07-17
      • 2013-05-31
      • 2015-12-29
      相关资源
      最近更新 更多