【问题标题】:Unable to run Puma as daemon OptionParser::AmbiguousOption: ambiguous option: -d无法将 Puma 作为守护进程运行 OptionParser::AmbiguousOption: ambiguous option: -d
【发布时间】:2022-05-04 20:11:35
【问题描述】:

我升级到 Puma 5.0.2 并像往常一样启动我的 rails 应用程序:

bundle exec puma -d -e production -b unix:///home/user/app/tmp/puma.sock

现在我得到错误:

OptionParser::AmbiguousOption: ambiguous option: -d

将 puma 作为守护进程运行的正确方法是什么?

【问题讨论】:

    标签: ruby-on-rails ruby puma


    【解决方案1】:

    上下文:快速链接:

    从 Puma 5.0.0 开始,Daemonize 选项已被删除,无需替换(来源:https://github.com/puma/puma/blob/master/History.md

    您可以在他们的文档中参考此部分以了解守护进程:https://github.com/puma/puma/blob/master/docs/deployment.md#should-i-daemonize

    解决方案: 根据您的操作系统发行版为 puma 创建一个 systemd 服务。

    在你的 app 目录的 config/puma 中配置你的环境。

    /etc/systemd/system 中添加一个名为 puma.service 的服务文件(该路径在 SLES15 上适用于我)。

    这是一个适合我的示例(根据您的需要替换 中的文本):

    [Unit]
    Description=Puma HTTP Server
    After=network.target
    StartLimitIntervalSec=0
    
    [Service]
    Type=simple
    User=<UserForPuma>
    WorkingDirectory=<YourAppDir>
    Environment=RAILS_MASTER_KEY=<EncryptionKeyIfUsedByRailsApp>
    ExecStart=/usr/bin/rails s puma -b 'ssl://127.0.0.1:3000?key=<path_to_privatekey.key>&cert=<path_to_certificate.crt>' -e production
    Restart=always
    RestartSec=2
    KillMode=process
    
    [Install]
    WantedBy=multi-user.target
    

    将上面的内容保存为一个名为puma.service的文件在上面提到的目录路径下。 之后只需启用并启动服务:

    # systemctl daemon-reload
    # systemctl --now enable puma.service
    
    Created symlink /etc/systemd/system/multi-user.target.wants/puma.service → /etc/systemd/system/puma.service.
    
    # systemctl status puma
    
    ● puma.service - Puma HTTP Server
       Loaded: loaded (/etc/systemd/system/puma.service; enabled; vendor preset: disabled)
       Active: active (running) since Fri 2020-10-09 12:59:28 CEST; 7s ago
     Main PID: 2854 (ruby.ruby2.5)
        Tasks: 21
       CGroup: /system.slice/puma.service
               ├─2854 puma 5.0.2 (ssl://127.0.0.1:3000?key=<your_key_path.key>&cert=<your_cert_path.crt>) [rails-app-dir]
               ├─2865 puma: cluster worker 0: 2854 [rails-app-dir]
               └─2871 puma: cluster worker 1: 2854 [rails-app-dir]
    

    检查美洲狮状态: ps -ef | grep puma

    现在应该显示正在运行的 puma 进程(主进程和工作进程)。

    这里是一个关于如何创建 systemd 服务的初学者链接: https://medium.com/@benmorel/creating-a-linux-service-with-systemd-611b5c8b91d6

    系统文档:

    对不起,我不是 Windows 人,但我相信想法是一样的。在 Windows 中工作的任何人都可以尝试创建一个 bat 文件并将其作为 Windows 服务在后台运行。 希望对您有所帮助。

    【讨论】:

    • 在 POSIX 系统(Unix / Linux / macOS)上,使用操作系统的 &amp; 选项来妖魔化 Puma 可能更容易。即bundle exec puma -e production &amp;...我相信这就是-d 被弃用的原因,它只是多余的。
    • 我无法让它工作。我的 ExecStart 可能有问题。无论如何,我在一个实例中降级了一个 puma 以保留旧守护进程,并在另一个实例中保留一个升级的 puma,我只需打开一个新终端并关闭正在运行的终端(我在 Google Cloud Platform 上的 Ubuntu 上使用 Rails on Rbenv)
    • @JunDalisay 您在journalctl -xe 中看到任何具体错误吗?请检查您是否使用 puma 二进制文件的绝对路径。如果服务以某种方式运行(ps -ef| grep puma 显示正在运行的进程,但应用程序实际上并没有工作),您也会在 puma.stderr.log 中看到特定的 Puma 相关错误(在 app_dir/log 路径中​​)。不确定您在哪个级别遇到问题。
    【解决方案2】:

    Github 上的这个 gem 看起来是一个不错的起点:

    https://github.com/kigster/puma-daemon
    

    【讨论】:

      猜你喜欢
      • 2019-11-17
      • 2015-06-02
      • 2023-03-02
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多