我在设置Nginx以与Puma服务器一起使用Rails 4应用程序时遇到问题.
问题似乎是在我的Nginx配置中,因为我不断收到502 Bad Gateway错误,错误日志指出如下:
*1 connect() to unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock failed (2: No such file or directory) while connecting to upstream, client: XX.XXX.XX.XXX, server: mysitename.com, request: "GET /favicon.ico HTTP/1.1", upstream: "http://unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock:/favicon.ico", host: "mysitename.com"
这是我正在使用的Nginx站点配置:
upstream mysitename { server unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock; } server { listen 80; server_name mysitename.com; root /srv/vhosts/rumysitename/www/mysitename/public; location / { proxy_pass http://mysitename; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location ~* ^/assets/ { # Per RFC2616 - 1 year maximum expiry expires 1y; add_header Cache-Control public; # Some browsers still send conditional-GET requests if there's a # Last-Modified header or an ETag header even if they haven't # reached the expiry date sent in the Expires header. add_header Last-Modified ""; add_header ETag ""; break; } }
毋庸置疑Puma无法连接到那只袜子,因为它不存在:
rails s -e production -b unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock=> Booting Puma => Rails 4.1.0 application starting in production on http://unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock:3000 => Run `rails server -h` for more startup options => Ctrl-C to shutdown server Puma 2.8.2 starting... * Min threads: 0, max threads: 16 * Environment: production * Listening on tcp://unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock:3000 Exiting /srv/vhosts/rumysitename/.rvm/gems/ruby-2.1.0/gems/puma-2.8.2/lib/puma/binder.rb:195:in `initialize': getaddrinfo: Name or service not known (SocketError)
我不是系统管理员,对Nginx没有任何经验,所以请原谅我,如果我错过了一些明显的东西.
似乎启动rails服务器并要求它绑定到unix套接字不起作用.-b
使用rails服务器的选项与该puma
命令的行为不同.基本上它想绑定到IP地址:
rails server --help Usage: rails server [mongrel, thin, etc] [options] -p, --port=port Runs Rails on the specified port. Default: 3000 -b, --binding=ip Binds Rails to the specified ip. Default: 0.0.0.0
你可以直接运行puma:
puma -e production -b unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock
套接字将通过像这样运行puma来创建.它不需要存在.您需要获得在指定位置创建它的权限,但如果不是这样,您将收到不同的错误.
另一种方法是创建一个config/puma.rb
可以包含绑定的文件:
config/puma.rb
:
bind 'unix:///srv/vhosts/rumysitename/www/mysitename/tmp/mysitename.sock'
然后运行puma引用:
puma -C config/puma.rb -e production
你可以在配置文件中放入更多,而不仅仅是袜子.美洲狮示例配置文件是一个很好的起点.