我使用capistrano(rails 4,ruby 2.1.2,thin 1.6.2,capistrano 2.1.5)将一个rails应用程序部署到nginx,瘦身。我通过瘦启动命令开始瘦身。并在此文件thin.log上查看一些错误。有谁能告诉我如何解决这个问题?
非常感谢!
thin.yml
pid: /home/deploy/myapp/pids/thin.pid
port: 3000
timeout: 30
wait: 30
log: log/thin.log
max_conns: 1024
require: []
environment: production
max_persistent_conns: 512
threaded: true
no-epoll: true
daemonize: true
socket: /home/deploy/myapp/sockets/thin.sock
chdir: /home/deploy/myapp/current
address: 0.0.0.0
的/ etc / nginx的/位点-availabel /默认
upstream myapp{
server 127.0.0.1:3000;
server 127.0.0.1:3001;
server 127.0.0.1:3002;
}
server {
listen 80;
server_name _;
character utf-8;
access_log /home/deploy/myapp/log/access.log;
error_log /home/deploy/myapp/log/error.log;
root /home/deploy/myapp/current/public;
location / {
proxy_pass http://127.0.0.1:3000;
}
}
thin.log
Writing PID to /home/deploy/myapp/pids/thin.pid
Using rack adapter
Thin web server (v1.6.2 codename Doc Brown)
Maximum connections set to 1024
Listening on /home/deploy/myapp/sockets/thin.sock, CTRL+C to stop
Exiting!
/home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:528:in `start_unix_server': no unix-domain acceptor (RuntimeError)
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:528:in `start_server'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:548:in `start_unix_domain_server'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/backends/unix_server.rb:19:in `connect'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/backends/base.rb:63:in `block in start'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `call'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run_machine'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/eventmachine-1.0.3/lib/eventmachine.rb:187:in `run'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/backends/base.rb:73:in `start'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/server.rb:162:in `start'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/controllers/controller.rb:87:in `start'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/runner.rb:199:in `run_command'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/lib/thin/runner.rb:155:in `run!'
from /home/deploy/.rvm/gems/ruby-2.1.2/gems/thin-1.6.2/bin/thin:6:in `<top (required)>'
from /home/deploy/.rvm/gems/ruby-2.1.2/bin/thin:23:in `load'
from /home/deploy/.rvm/gems/ruby-2.1.2/bin/thin:23:in `<main>'
from /home/deploy/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `eval'
from /home/deploy/.rvm/gems/ruby-2.1.2/bin/ruby_executable_hooks:15:in `<main>'
答案 0 :(得分:5)
我在VPS上遇到了几乎相同的问题。我不明白的是你的Thin配置结合了端口和套接字。我不知道这是不是一个好方法。
但无论如何,这就是我的建议:
您只需告诉Thin使用/home/deploy/myapp/sockets/thin.sock
套接字即可。好吧,我们很好。我已经使用了另一个目录作为套接字(比如/tmp
或你的应用程序的tmp
目录),但我不是专家,那就是你的电话。
然后,如果您希望Thin和Nginx进行通信,则必须告诉Nginx,Thin正在侦听此特定套接字上的传入请求。在这里,在upstream
块中,告诉Nginx,Thin正在侦听localhost:3000上的传入请求。再次,当您在Thin conf中同时使用端口和套接字时,我不确定这是否是一个问题(但至少,对于我来说,这些设置中的一个对我来说是无用的,就Thin-Nginx通信而言被关注到)。如果在同一台机器上使用Nginx和Thin,我认为套接字是更好的方法,因为它们使通信依赖于文件系统而不是HTTP请求,这应该更有效。要告诉Nginx Thin正在侦听套接字,你必须使用像这样的upstream
块:
upstream myapp {
server unix:/home/deploy/myapp/sockets/thin.sock;
}
从您的Thin配置文件判断,此项目只有一个Thin运行实例,因此您只需要一个server
行。如果您在Thin yml配置中使用了说2个瘦实例(servers: 2
),那么你在nginx端做了类似的事情:
upstream myapp {
server unix:/home/deploy/myapp/sockets/thin.0.sock;
server unix:/home/deploy/myapp/sockets/thin.1.sock;
}
至于“没有unix-domain acceptor(RuntimeError)”错误,它可能来自套接字目录上的权限问题,至少就是我遇到这个问题时的情况现在(不知道为什么,我的sockets
目录已经消失,当我再次创建它时,它必须具有正确的权限以避免此错误)。所以我要说看看这个;)
答案 1 :(得分:3)
对我来说,这个错误是由于缺少套接字目录引起的(在你的情况下,这将是/home/deploy/myapp/sockets
)。
答案 2 :(得分:2)
这是我的nginx看起来像瘦的样子。也许它可以提供帮助。
upstream thin_server {
server 0.0.0.0:8080 fail_timeout=0;
}
server {
listen 80 default;
root /home/example/public;
server_name example.com www.example.com;
index index.htm index.html;
location / {
try_files $uri/index.html $uri.html $uri @app;
}
location ~* ^.+\.(jpg|jpeg|gif|png|ico|css|zip|tgz|gz|rar|bz2|doc|xls|exe|pdf|ppt|txt|tar|mid|midi|wav|bmp|rtf|js|mp3|flv|mpeg|avi)$ {
try_files $uri @app;
}
location @app {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_redirect off;
proxy_pass http://thin_server;
}
error_page 500 502 503 504 /500.html;
client_max_body_size 4G;
keepalive_timeout 10;
}