【问题标题】:Puma not creating socket at defined location when started with `rails server`使用“rails server”启动时,Puma 未在定义的位置创建套接字
【发布时间】:2016-11-20 08:24:36
【问题描述】:

我正在使用 nginx、puma 和 capistrano 部署我的 Rails 应用程序。它由名为 deploy 的用户部署,部署位置在主目录下 (/home/deploy)

我已将 Puma 配置为在 shared 文件夹下创建一个套接字,Capistrano 将其所有发布符号链接到该文件夹​​。相应地,nginx 也被配置为查看该套接字(请参阅下面的配置文件)

但是,当我启动 Rails / Puma 网络服务器时 -

cd /home/deploy/my_app/current
SECRET_KEY_BASE=.... DATABASE_PASSWORD=... rails s -e production

我注意到没有创建套接字文件。当我在浏览器中访问该站点然后查看 Nginx 错误日志时,它还抱怨该套接字不存在。

2016/07/17 14:26:19 [crit] 26055#26055: *12 connect() to unix:/home/deploy/my_app/shared/tmp/sockets/puma.sock failed (2: No such file or directory) while connecting to upstream, client: XX.YY.XX.YY, server: localhost, request: "GET http://testp4.pospr.waw.pl/testproxy.php HTTP/1.1", upstream: "http://unix:/home/deploy/my_app/shared/tmp/sockets/puma.sock:/500.html", host: "testp4.pospr.waw.pl"

如何让 puma 创建那个套接字?

谢谢!

彪马配置

# config/puma.rb

...

# `shared_dir` is the symlinked `shared/` directory created
# by Capistrano - `/home/deploy/my_app/shared`

# Set up socket location
bind "unix://#{shared_dir}/tmp/sockets/puma.sock"

# Logging
stdout_redirect "#{shared_dir}/log/puma.stdout.log", "#{shared_dir}/log/puma.stderr.log", true

# Set master PID and state locations
pidfile "#{shared_dir}/tmp/pids/puma.pid"
state_path "#{shared_dir}/tmp/pids/puma.state"
activate_control_app

...

Nginx 站点配置

# /etc/nginx/sites-available/default

upstream app {
    # Path to Puma SOCK file
    server unix:/home/deploy/my_app/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
    listen 80;
    server_name localhost;

    root /home/deploy/my_app/public;

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

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

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

【问题讨论】:

    标签: ruby-on-rails sockets nginx capistrano puma


    【解决方案1】:

    我遇到了类似的问题,原因是 shared_dir 的值不正确。如果您想在部署中使用它,您需要更新以下内容:

    set :puma_bind,-> { "unix://#{shared_path}/tmp/sockets/puma.sock" }
    set :puma_state, -> { "#{shared_path}/tmp/pids/puma.state" }
    set :puma_pid, -> { "#{shared_path}/tmp/pids/puma.pid" }
    

    注意:在此更改后,您可能会遇到手动运行cap production puma:start/stop/restart 的问题,您需要删除-> {

    【讨论】:

      【解决方案2】:

      您确定您正在使用该配置运行 Puma 吗?我不认为rails server 是在生产环境中启动 Puma 的正确方法。

      我会改用这个:

      RACK_ENV=production bundle exec puma -C config/puma.rb
      

      一旦您手动完成这项工作,然后使用--daemon 标志保持服务器在后台运行。

      另外,shared_dir 在您的config/puma.rb 中定义在哪里?也许您省略了文件的一部分,但如果没有,请确保插入正确的值。

      【讨论】:

      • 你完全正确。我需要直接使用puma 命令启动它。出于某种原因,我认为需要 puma gem 会使 rails 默认使用 puma 作为主服务器,因此rails server 会调用 puma。我猜是菜鸟的错误 - 谢谢!
      猜你喜欢
      • 1970-01-01
      • 2014-02-08
      • 2019-07-27
      • 2016-11-19
      • 2019-05-15
      • 1970-01-01
      • 2016-07-19
      • 2022-09-27
      • 2020-10-09
      相关资源
      最近更新 更多