【问题标题】:Rails + Nginx + Unicorn - unicorn.sock file is not created when deployingRails + Nginx + Unicorn - 部署时未创建 unicorn.sock 文件
【发布时间】:2018-09-30 18:02:38
【问题描述】:

我在尝试部署时收到“我们很抱歉,但出了点问题”屏幕。它以前工作正常,但是当我尝试更新它时,我遇到了这个问题。这是我第一次部署任何东西,但我仍然不确定我在做什么,所以我非常感谢一些关于我做错了什么的意见。

我从 unicorn.log

收到以下错误
I, [2018-10-01T19:54:53.470419 #4905]  INFO -- : unlinking existing
socket=/home/deploy/production/appName/tmp/sockets
/bcrypt_unicorn.todo.sock
I, [2018-10-01T19:54:53.470635 #4905]  INFO -- : listening on addr=/home/deploy/production/appName/tmp/sockets/bcrypt_unicorn.todo.sock fd=10
I, [2018-10-01T19:54:53.470737 #4905]  INFO -- : worker=0 spawning...
I, [2018-10-01T19:54:53.471045 #4905]  INFO -- : worker=1 spawning...
I, [2018-10-01T19:54:53.471397 #4905]  INFO -- : master process ready
I, [2018-10-01T19:54:53.476589 #4908]  INFO -- : worker=0 spawned pid=4908
I, [2018-10-01T19:54:53.476714 #4908]  INFO -- : Refreshing Gem list
I, [2018-10-01T19:54:53.477787 #4910]  INFO -- : worker=1 spawned pid=4910
I, [2018-10-01T19:54:53.477910 #4910]  INFO -- : Refreshing Gem list
I, [2018-10-01T19:54:59.740522 #4908]  INFO -- : worker=0 ready
I, [2018-10-01T19:54:59.744825 #4910]  INFO -- : worker=1 ready

以及来自 /var/log/nginx/error.log 的以下错误:

2018/10/01 20:00:41 [crit] 5067#5067: *2 connect() to unix:/home/deploy
/production/appName/tmp/sockets/bcrypto_unicorn.todo.sock failed
(2: No such file or directory) while connecting to upstream, client:
77.75.77.32, server: , request: "GET /genres/gaming HTTP/1.1", upstream:
"http://unix:/home/deploy/production/appName/tmp/sockets
/bcrypto_unicorn.todo.sock:/genres/gaming", host: "appName.com"

我用

重启了 Nginx
sudo service nginx restart

重新加载更新的配置

sudo nginx -s reload

然后停止正在运行的Unicorn进程

ps aux | grep "unicorn master"
kill -9 PID

然后拉取更新的代码进行部署

git status
git stash save -u quick-fix
git pull origin master
git stash apply

然后迁移数据库

RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake assets:precompile

然后终于重启了独角兽

bundle exec unicorn -E production -c config/unicorn.rb -D

我的unicorn.rb文件如下:

app_path = "/home/deploy/production/appName"
working_directory app_path
pid app_path + "/tmp/pids/unicorn.pid"
stderr_path app_path + "/log/unicorn.log"
stdout_path app_path + "/log/production.log"
listen app_path + '/tmp/sockets/bcrypt_unicorn.todo.sock'
worker_processes 2
timeout 65

appName/config/nginx.conf

upstream unicorn {
  server unix:/tmp/sockets/bcrypto_unicorn.todo.sock fail_timeout=0;
}

server{
  listen 80 default deferred;
  root /home/deploy/production/appName/public;

  try_files $uri/index.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 403 404 /404.html;

  error_page 500 502 503 504 /500.html;

  client_max_body_size 4G;
  keepalive_timeout 10;
}

/etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
    # multi_accept on;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;
    # server_tokens off;

    # server_names_hash_bucket_size 64;
    # server_name_in_redirect off;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ##
    # SSL Settings
    ##

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;
    gzip_disable "msie6";

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json    application/javascript text/xml applicati$

    ##
    # Virtual Host Configs
    ##

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

/etc/nginx/sites-enabled/bcrypto

upstream bcrypto_unicorn {
    server unix:/home/deploy/production/appName/tmp/sockets/bcrypto_unicorn.todo.sock fa$
}

server {
    listen 80 default deferred;
    root /home/deploy/production/appName/public;

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

    try_files $uri/index.html $uri @bcrypto_unicorn;

    location @bcrypto_unicorn {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_redirect off;
        proxy_pass http://bcrypto_unicorn;
    }

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

有人可以指出我在这里做错了什么吗?

【问题讨论】:

  • 你能粘贴来自/log/unicorn.log的错误吗?
  • 原帖已更新所有新信息
  • @mxvx 要将问题标记为已解决,您需要选择正确答案。问题中不需要大文本

标签: ruby-on-rails nginx unicorn


【解决方案1】:

首先,检查您的tmp/sockets 文件夹,看看它是否存在。如果没有,请使用以下命令创建文件夹

mkdir /home/deploy/production/appName/tmp/sockets

然后,通过修改您的unicorn.rb,将您的socket 更改为与nginx 相同的路径

listen app_path + '/tmp/sockets/bcrypt_unicorn.todo.sock'

最后重启独角兽

bundle exec unicorn -E production -c config/unicorn.rb -D

【讨论】:

    【解决方案2】:

    问题是 Nginx 在 Unicorn 设置的不同位置寻找套接字。

    Nginx 正在尝试在以下位置找到套接字: /home/deploy/production/appName/tmp/sockets/byc2-master_unicorn.todo.sock Unicorn 配置将其设置为 /tmp/appName_unicorn.todo.sock

    要解决问题,两条路径必须相同。因此,您需要在 /etc/nginx/sites-enabled/bcryptoupstream 指令和 listen定义的指令中放置相同的路径> unicorn.rb

    中的指令

    然后重启Unicorn并重新加载Nginx

    【讨论】:

    • 我仍然收到错误:F,[2018-10-01T16:27:31.522740 #1896] FATAL -- : error added listener addr=/tmp/sockets/byc2-master_unicorn.todo.sock /home/deploy/.rvm/gems/ruby-2.5.0/gems/unicorn-5.4.0/lib/unicorn/socket_helper.rb:137:in `initialize': 没有这样的文件或目录 - connect(2) for /tmp/sockets/byc2-master_unicorn.todo.sock (Errno::ENOENT)
    • 我更新了我原来的帖子。 Unicorn.log 说 byc2-master_unicorn.todo.sock 丢失并且 /nginx/error.log 说 bcrypt_unicorn.todo.sock 丢失。我该如何解决这个问题?
    • @mxvx,请用所做的更改更新问题,以便更清楚地跟进。如果您为您的站点添加 Nginx 配置,特别是您定义套接字的部分,这将非常有帮助
    • @mxvx 您仍然需要更新 unicorn.rb 配置文件。 Nginx 上游必须匹配独角兽套接字的路径。然后重启独角兽并重新加载Nginx
    • @mxvx,unicorn.log 说它正在监听 bcrypt_unicorn.todo.sock 但 nginx 正在搜索 bcrypto_unicorn.todo.sock。有错别字
    猜你喜欢
    • 1970-01-01
    • 2015-03-29
    • 1970-01-01
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 2013-03-05
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多