Ruby on rails 部署Rails+;反应+;美洲狮+;Nginx到Heroku失败

Ruby on rails 部署Rails+;反应+;美洲狮+;Nginx到Heroku失败,ruby-on-rails,nginx,heroku,puma,Ruby On Rails,Nginx,Heroku,Puma,我想将RoR+React SPA作为一个项目部署到heroku。作为一个典型的生产环境,使用Nginx作为web服务器,用户Puma作为应用服务器 我试着遵循的readme 但部署后,heroku弹出一个错误 Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch 下面是我的配置 heroku构建包 heroku/nodejs # index 1 heroku/

我想将RoR+React SPA作为一个项目部署到heroku。作为一个典型的生产环境,使用Nginx作为web服务器,用户Puma作为应用服务器

我试着遵循的
readme

但部署后,heroku弹出一个错误

Error R10 (Boot timeout) -> Web process failed to bind to $PORT within 60 seconds of launch
下面是我的配置

heroku构建包

heroku/nodejs # index 1
heroku/ruby   # index 2
https://github.com/heroku/heroku-buildpack-nginx.git # index 3
程序文件

release: bundle exec rails db:migrate
web: bin/start-nginx bundle exec puma -C config/puma.rb
config/puma.rb

max_threads_count = ENV.fetch("RAILS_MAX_THREADS") { 5 }
min_threads_count = ENV.fetch("RAILS_MIN_THREADS") { max_threads_count }
threads min_threads_count, max_threads_count

environment ENV.fetch("RAILS_ENV") { "development" }
plugin :tmp_restart

bind ENV.fetch('PUMA_SOCK') { 'unix:///tmp/nginx.socket' }

on_worker_fork do
  FileUtils.touch('/tmp/app-initialized')
end
config/nignx.conf.erb=>我删除了这个文件不重要的配置,因为它太长了

http {
    upstream app_server {
        server unix:/tmp/nginx.socket fail_timeout=0;
    }

    server {
        listen <%= ENV["PORT"] %>;
        server_name _;
        keepalive_timeout 5;

        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_redirect off;
            proxy_pass http://app_server;
        }
    }
}
http{
上游应用程序服务器{
服务器unix:/tmp/nginx.socket失败\u超时=0;
}
服务器{
听
服务器名称;
保持激活超时5;
地点/{
proxy\u set\u header X-Forwarded-For$proxy\u add\u X\u Forwarded\u For;
代理设置头主机$http\U主机;
代理_重定向关闭;
代理通行证http://app_server;
}
}
}

编辑:我认为
程序文件
也应该启动Nginx:

 web: bin/start-nginx bundle exec puma -C config/puma.rb
记住,对于nginx构建包,您应该在
nginx.conf
中禁用demon模式:

daemon off;
daemon off;
error_log /dev/stdout info;
http {
  access_log /dev/stdout;
  ...
}
EDIT2:如果该行不起作用,请尝试直接运行Nginx(这是一种未经测试的黑客行为):

还要确保nginx日志被路由到stdout,并将其放入
nginx.conf

daemon off;
daemon off;
error_log /dev/stdout info;
http {
  access_log /dev/stdout;
  ...
}
原件

正如构建包的文档所述:

基本上,对于不是为高效、无阻塞I/O而设计的Web服务器,我们将受益于使用NGINX处理所有I/O操作

然而,Puma是一种高效、无阻塞的I/O服务器。你应该能够直接在Heroku dyno上使用它

Nginx可以提供Puma服务器的最大优势是处理静态文件,而您的配置不执行静态文件

如果您没有将Nginx用于静态文件,您可能会决定跳过Nginx代理添加的额外延迟。此外,Heroku的安全功能应该(但可能不会)涵盖Nginx目前能提供给您的所有基础


如果您需要提高静态文件的速度-一些Ruby服务器(如或)提供快速静态文件服务,允许您跳过Nginx层并减少延迟。

好吧,在我最初的意图中,我必须将react构建到
public
文件夹中。然后,nginx将处理对
public
文件夹的请求;nginx将把
/api
传递给puma。但它也不起作用。与上述错误相同。我不明白为什么我遵循heroku buildpack nginx.git,但heroku抛出错误。如果我能解决这个问题,我可以将所有静态请求传递给nginx,并将
/api
传递给puma@new2cpp我认为你需要启动nginx服务器和app服务器。查看我的更新。非常感谢您的更新。我认为这是我的错,复制但缺少
bin/start nginx
。我的演示项目是。仍然有错误
错误R10(启动超时)
@new2cpp-我不确定错误发生在哪里。既然您修复了
Procfile
(可能编辑问题),它应该可以工作了。。。再说一次,我有偏见,我是Idio的作者,我使用
web:Idio-p$PORT-t16-w-1-www./public
(您可以在静态文件服务上运行基准测试)。我可能太信任Heroku的路由器和安全层了。非常感谢你的帮助。到目前为止,变更服务器还不是一个选项,因为在生产中,nginx与puma配合得很好。在heroku的演出有点难。关于错误,它首先显示数十个
buildpack=nginx at=app initialization
,然后
error R10(引导超时)->Web进程在启动后60秒内未能绑定到$PORT
。我读了一些heroku的介绍,似乎heroku鼓励一个dyno服务一个服务。因此,在heroku中,前端和后端通常分为两个不同的动态。也许这就是我的问题对大多数人来说不是问题的原因,你解决了这个问题吗?我有一个可能遵循这个方向的项目,我没能把所有的东西都放在一个heroku项目上。最后,我使用ajax/api/spa方式将其拆分为两个diff heroku项目,一个用于前端,另一个用于后端。