我有一个Rails 5应用程序,我计划在Linux上部署,但由于我们需要访问非常特定的Windows专用软件,我需要在Windows Server 2012 R2上部署它。我的软件堆栈(或混合)应该是Nginx / Puma / Rails / PostgreSQL / Redis。除了Puma之外,所有东西都安装在Windows上,而Rails文档说我需要Puma用于ActionCable。
如何让Puma在Windows上运行?我已经看过并尝试过一些可以尝试的片段,我也看过并尝试了不应该做的片段,例如在守护进程模式下运行,因为不支持fork()。有没有人可以通过Rails应用程序获得关于如何让Puma在Windows上工作的可重复的说明?
或者,如果Puma是Windows的非入门者,是否有可重复的替代方法将带有ActionCable的Rails 5应用程序部署到Windows Server主机(例如Windows 2012 R2)?
答案 0 :(得分:1)
根据github页面中的readme file,请注意以下事项:
不支持守护程序模式。如果有这样的行,请注释掉/删除以下内容。
daemonize false
工作人员无法在Windows中工作,因为它不支持进程。我们希望工人成为" 0"。请注意以下几行:
workers 2 # The default is "0"
preload_app!
服务器套接字在重启时无法无缝连接,必须关闭并重新打开。这些平台无法将描述符传递给暴露给ruby的新进程。
不要使用unix socket,而是将服务器绑定到" tcp://"。因此,请注释掉下面的任何一行:
bind 'unix:///var/run/puma.sock'
bind 'unix:///var/run/puma.sock?umask=0111'
而是使用以下内容:
bind "tcp://127.0.0.1:4001"
# You don't have to if you don't need to specify a port
# since the default is "tcp://0.0.0.0:9292"
如果在启动rails服务器后看到任何http解析错误(格式错误的http请求),请尝试this answer。如果它不起作用,那么从config / environments / production.rb或config / environments / production.rb注释掉这一行(取决于你想要运行Puma的环境)
config.force_ssl = true
以下是puma.rb文件的外观:
worker 0 # Not necessary. The default is "0"
threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }.to_i
threads threads_count, threads_count
bind "tcp://127.0.0.1:4001" # Not necessary. Default is "tcp://0.0.0.0:9292"
environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart
最后运行bundle exec puma -C config\puma.rb
,它应该有效。