我正在使用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
...
# /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;
}
答案 0 :(得分:9)
您确定使用该配置运行Puma吗?我不认为rails server
是在生产环境中启动Puma的正确方法。
我会改用它:
RACK_ENV=production bundle exec puma -C config/puma.rb
手动完成后,请使用--daemon
标志让服务器在后台运行。
此外,您shared_dir
中的config/puma.rb
定义在哪里?也许您省略了文件的一部分,但如果没有,请确保插入正确的值。
答案 1 :(得分:0)
我遇到了类似的问题,原因在于 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
,您需要删除 -> {
。