Heroku - bundler: 加载命令失败:独角兽

4

Ruby 2.3.1

Rails 5.1.2

尝试通过设置多个buildpack(heroku buildpacks:set https://github.com/heroku/heroku-buildpack-multi.git)来将rails应用部署到heroku上,并使用https://github.com/heroku/heroku-buildpack-ruby.githttps://github.com/heroku/heroku-buildpack-nginx.git。当我执行git push heroku master时,成功将代码库上传到heroku。但是当我尝试访问网站时,出现应用程序错误页面。因此,我检查了heroku logs,并看到以下错误:

Starting process with command `bin/start-nginx bundle exec unicorn -c config/unicorn.rb`
2017-08-10T23:41:44.799815+00:00 app[web.1]: bundler: failed to load command: unicorn (/app/vendor/bundle/ruby/2.3.0/bin/unicorn)
2017-08-10T23:41:44.799855+00:00 app[web.1]: ArgumentError: directory for pid=/app/shared/pids/unicorn.pid not writable
2017-08-10T23:41:44.799856+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/gems/unicorn-5.3.0/lib/unicorn/configurator.rb:100:in `block in reload'
2017-08-10T23:41:44.799857+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/gems/unicorn-5.3.0/lib/unicorn/configurator.rb:96:in `each'
2017-08-10T23:41:44.799857+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/gems/unicorn-5.3.0/lib/unicorn/configurator.rb:96:in `reload'
2017-08-10T23:41:44.799858+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/gems/unicorn-5.3.0/lib/unicorn/configurator.rb:77:in `initialize'
2017-08-10T23:41:44.799859+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/gems/unicorn-5.3.0/lib/unicorn/http_server.rb:77:in `new'
2017-08-10T23:41:44.799859+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/gems/unicorn-5.3.0/lib/unicorn/http_server.rb:77:in `initialize'
2017-08-10T23:41:44.799860+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/gems/unicorn-5.3.0/bin/unicorn:126:in `new'
2017-08-10T23:41:44.799860+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/gems/unicorn-5.3.0/bin/unicorn:126:in `<top (required)>'
2017-08-10T23:41:44.799861+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/bin/unicorn:23:in `load'
2017-08-10T23:41:44.799864+00:00 app[web.1]:   /app/vendor/bundle/ruby/2.3.0/bin/unicorn:23:in `<top (required)>'

此外,我一直收到以下信息的循环提示:

2017-08-10T23:41:47.331854+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:41:57.364413+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:42:01.380323+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:42:06.411012+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:42:11.435965+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:42:15.465182+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:42:17.477769+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:42:26.520073+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:42:34.564750+00:00 app[web.1]: buildpack=nginx at=app-initialization
2017-08-10T23:42:35.568403+00:00 app[web.1]: buildpack=nginx at=app-initialization

我猜是因为它试图使用 Procfile 启动:

web: bin/start-nginx bundle exec unicorn -c config/unicorn.rb

unicorn_init.sh:

#!/bin/sh

### BEGIN INIT INFO
# Provides:          unicorn
# Required-Start:    $all
# Required-Stop:     $all
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: starts the unicorn app server
# Description:       starts unicorn using start-stop-daemon
### END INIT INFO

set -e

USAGE="Usage: $0 <start|stop|restart|upgrade|rotate|force-stop>"

# app settings
APP_NAME="app"
APP_ROOT="$APP_NAME/"
ENV="production"

# environment settings
CMD="cd $APP_ROOT && bundle exec unicorn -c config/unicorn.rb -E $ENV -D"
PID="$APP_ROOT/shared/pids/unicorn.pid"
OLD_PID="$PID.oldbin"

# make sure the app exists
cd $APP_ROOT || exit 1

sig () {
  test -s "$PID" && kill -$1 `cat $PID`
}

oldsig () {
  test -s $OLD_PID && kill -$1 `cat $OLD_PID`
}

case $1 in
  start)
    sig 0 && echo >&2 "Already running" && exit 0
    echo "Starting $APP_NAME"
    su - $USER -c "$CMD"
    ;;
  stop)
    echo "Stopping $APP_NAME"
    sig QUIT && exit 0
    echo >&2 "Not running"
    ;;
  force-stop)
    echo "Force stopping $APP_NAME"
    sig TERM && exit 0
    echo >&2 "Not running"
    ;;
  restart|reload|upgrade)
    sig USR2 && echo "reloaded $APP_NAME" && exit 0
    echo >&2 "Couldn't reload, starting '$CMD' instead"
    $CMD
    ;;
  rotate)
    sig USR1 && echo rotated logs OK && exit 0
    echo >&2 "Couldn't rotate logs" && exit 1
    ;;
  *)
    echo >&2 $USAGE
    exit 1
    ;;
esac

unicorn.rb:

# set path to application
app_dir = "/app"
shared_dir = "#{app_dir}/shared"
working_directory app_dir


# Set unicorn options
worker_processes 2
preload_app true
timeout 30

# Set up socket location
listen "#{shared_dir}/sockets/unicorn.mysiteNginx.sock", :backlog => 64

# Logging
stderr_path "#{shared_dir}/log/unicorn.stderr.log"
stdout_path "#{shared_dir}/log/unicorn.stdout.log"

# Set master PID location
pid "#{shared_dir}/pids/unicorn.pid"

nginx.conf:

upstream unicorn {
  server unix:app/shared/sockets/unicorn.mysiteNginx.sock fail_timeout=0;
}

server {
  listen 80 default deferred;
  server_name www.mysite-webapp.herokuapp.com;
  root /app/public;

  location ^~ /assets/ {
      gzip_static on;
      expires max;
      add_header Cache-Control public;
  }

  # Feed
  location ~* \.(?:rss|atom)$ {
    expires 1h;
    add_header Cache-Control "public";
  }

  # Media: images, icons, video, audio, HTC
  location ~* \.(?:jpg|jpeg|gif|png|ico|cur|gz|svg|svgz|mp4|ogg|ogv|webm|htc)$ {
    expires 1M;
    access_log off;
    add_header Cache-Control "public";
  }

  # CSS and Javascript
  location ~* \.(?:css|js)$ {
    expires 1y;
    access_log off;
    add_header Cache-Control "public";
  }

  try_files $uri/home.html $uri.html $uri @unicorn;
  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://unicorn;
  }

  error_page 500 502 503 504 /500.html;
    client_max_body_size 4G;
    keepalive_timeout 10;
}

任何帮助都将不胜感激!
---更新---
2017-08-11T03:32:29.113451+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/" host=myway-webapp.herokuapp.com request_id=35e12b8e-20b2-4243-bf63-34f1301f5806 fwd="23.240.184.146" dyno= connect= service= status=503 bytes= protocol=http
2017-08-11T03:32:32.706739+00:00 heroku[router]: at=error code=H10 desc="App crashed" method=GET path="/favicon.ico" host=myway-webapp.herokuapp.com request_id=ec761651-c8da-45de-9b3e-8ae4dae6a7f7 fwd="23.240.184.146" dyno= connect= service= status=503 bytes= protocol=http

---ANSWER---

需要在我的Procfile中添加$PORT

web: bin/start-nginx bundle exec unicorn -p $PORT -c config/unicorn.rb

1个回答

1

如何解决参数错误:

最好的猜测是在使用git push heroku将其推送到Heroku时,空的pids文件夹没有被正确克隆。因此,我会首先检查它是否存在,如果不存在,则使用mkdir pids创建它。

如何解决无限循环问题:

忘记在Procfile中添加$PORT


感谢您的帮助。现在我不再收到那些错误消息了,但我仍然每秒钟收到“buildpack=nginx at=app-initialization”消息。我仍然收到应用程序错误页面,但日志中有两条消息。我更新了问题,这样您就可以检查这些消息了。 - w_lpz
2
问题已解决。忘记在 Procfile 中添加 $PORT - w_lpz
1
好的,太棒了!很高兴我能帮到你,也很高兴你解决了问题。 - Crashtor
我也遇到了无限循环的问题,但我的 Procfile 文件中使用了 $PORT :( web: bin/start-nginx daphne -b 0.0.0.0 -p $PORT MoonMachine.MoonMachine.asgi:application - Samuel Jenks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接