Ошибка при запуске сервера Puma с воркерами

Я новичок в Rails и Puma, поэтому проблема может быть слишком глупой с простыми решениями, также, пожалуйста, помогите мне, если вы думаете, что я делаю что-то неправильно.

Я пытаюсь запустить сервер Puma для своих рельсов с помощью рабочего. Если я установлю рабочих на 0 с помощью

puma -w0

сервер запускается отлично, но если я устанавливаю worker на 1 или более, он дает следующую ошибку:

E:\RoR_tryouts\ws_13.11.13\todo>puma -w3
[2120] *** SIGUSR2 not implemented, signal based restart unavailable!
[2120] *** SIGUSR1 not implemented, signal based restart unavailable!
[2120] Puma starting in cluster mode...
[2120] * Version 2.7.1, codename: Earl of Sandwich Partition
[2120] * Min threads: 0, max threads: 16
[2120] * Environment: development
[2120] * Process workers: 3
[2120] * Phased restart available
[2120] * Listening on tcp://0.0.0.0:9292

C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/puma-2.7.1/lib/puma/cluster.rb:229:in `trap': unsupported signal SIGCHLD (ArgumentError)
        from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/puma-2.7.1/lib/puma/cluster.rb:229:in `run'
        from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/puma-2.7.1/lib/puma/cli.rb:442:in `run'
        from C:/Ruby/Ruby193/lib/ruby/gems/1.9.1/gems/puma-2.7.1/bin/puma:10:in `<top (required)>'
        from C:/Ruby/Ruby193/bin/puma:23:in `load'
        from C:/Ruby/Ruby193/bin/puma:23:in `<main>'

Характеристики:

  • Windows 7
  • Ruby 1.9.3p448 (27 июня 2013 г.) [i386-mingw32] MRI Rail 4.0.0 Puma
  • Версия 2.7.1, кодовое название: Earl of Sandwich Partition

person hadzy    schedule 27.12.2013    source источник


Ответы (2)


Цитата из README Puma:

Из-за того, что разные платформы не реализуют определенные вещи, при использовании Puma на разных платформах возникают следующие различия:

  • JRuby, Windows: серверные сокеты не работают при перезапуске, их необходимо закрыть и снова открыть. Эти платформы не имеют возможности передавать дескрипторы в новый процесс, доступный для ruby.
  • JRuby, Windows: кластерный режим не поддерживается из-за отсутствия fork(2)
  • Windows: режим демона не поддерживается из-за отсутствия fork(2)

Как ясно сказано, кластерный режим (т. е. запуск одного экземпляра puma с несколькими рабочими процессами) и режим демона (отключение от оболочки после запуска) не поддерживаются в Windows.

Вы должны либо использовать другую ОС (например, Linux), либо использовать Puma в однопользовательском режиме. Вы можете вручную запустить несколько экземпляров Puma на разных портах и ​​сбалансировать нагрузку между ними даже в Windows. Для этого вам просто нужен внешний балансировщик нагрузки, и это не так просто, как собственный режим кластера, встроенный в Puma.

person Holger Just    schedule 27.12.2013
comment
yosh, спасибо за помощь..., а также есть ли другой сервер, который может обеспечить параллелизм...? - person hadzy; 30.12.2013
comment
Если этот ответ ответил на ваш вопрос, рассмотрите возможность принять ответ. . - person Holger Just; 03.01.2014
comment
Это не сработает и при смене ОС. Это означает, что режим кластера не будет работать в Windows ИЛИ JRuby. См. также этот ресурс: github.com/puma/puma/issues/374 - person loybert; 25.03.2014
comment
@loybert OP использует не jruby, а MRI 1.9.3. Таким образом, его единственная проблема — Windows. - person Holger Just; 25.03.2014

да, у меня была такая же проблема, и я нашел решение по адресу https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server в теме «Рабочие». Если вы используете Windows или JRuby, опустите строку "workers Integer(ENV['WEB_CONCURRENCY'] || 2)" в файле config/puma.rb. это решило это для меня. Прочитайте ссылку выше для получения дополнительной информации.

person David Adafia    schedule 06.05.2016
comment
Это сработало и предоставило правильный источник и решение проблемы. - person Chad Mx; 05.09.2016
comment
лучше, чем удалить, заменить его этим: workers Integer(ENV['WEB_CONCURRENCY'] || 2) unless Gem.win_platform? - person AlexChaffee; 02.02.2017
comment
Спасибо. Я сделал подобное, так как хочу этого только в производственной среде. if Rails.env == производственные рабочие Integer(ENV['WEB_CONCURRENCY'] || 2) end - person Dennis; 09.09.2018