新手问题 求助 Puma + Nginx 跑 Rails 出错

steve · 发布于 2014年06月28日 · 最后由 fangxing204 回复于 2016年05月25日 · 3457 次阅读
11355

大家好,我按照这个文档 http://ruby-journal.com/how-to-setup-rails-app-with-puma-and-nginx/ 配置puma和nginx跑rails 4.1.1

访问页面出错:An error occurred. Sorry, the page you are looking for is currently unavailable. Please try again later.

nginx的error.log出现如下错误: [crit] 17027#0: *1 connect() to unix:///home/steve/web/tmp/web.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://unix:///home/steve/web/tmp/web.sock:/", host: "localhost"

搜了很久没搞定,大家有什么解决办法吗?

共收到 29 条回复
958

(13: Permission denied)

11355

@zfjoy520 启动nginx和puma都是用root用户,不知为何会Permission denied

9800

nginx顶部 的user?

9242

nginx.conf 配置里是不是没有加用户?

示例

user staff;
11355

@pynix @mystery 多谢2位,user 加上root就好了。

11355

@pynix @mystery ,页面可以访问了,但是assets里的静态资源访问都是404

9800

使用root用户运行web服务器是很危险的。

需要把 / 指向 public目录,然后asset:precompile

11355

@pynix 是在nginx.conf的location里加上这样的吗

location / {
    root   /home/steve/web/public;
}
9242

#8楼 @steve 是这样的

11355

@mystery @pynix 在nginx的error.log文件里没有发起对public/assets里的文件名是md5的静态文件请求,而是请求public/assets/users.js public/assets/application.js等静态文件,是还需要什么配置吗?

9800

应该是的。

11355

@pynix 求助,为什么不请求rake assets:precompile命令生成的文件呢?

9800

你有没有使用asset helper?

11355

@pynix 不好意思,assets helper是?

9800

#14楼 @steve javascript_tag stylesheet_tag ==

12706

说下我的解决方法吧

先是 nginx 和 puma 配置文件

戳 gists 浏览或下载

然后是 config/environments/production.rb

18 行 false 改为 true

# Disable Rails's static asset server (Apache or nginx will already do this).
config.serve_static_assets = true

然后是预编译 assets

RAILS_ENV=production rake assets:precompile

最后启动

bundle exec -C config/puma.rb -e production

我总结的经验,不知对不对

  • 右键查看源码,如果 assets 是 /stylesheet/application.css 这样的,说明启动环境不对,启动 puma 时 -e production 了?

  • 如果 assets 路径是对的,/assets/application-xxxxxxxxx.css,而文件确实存在,但是仍然访问不了,可以看 production.log,一般会显示路由找不到,说明文件经过了路由,而不是直接由 nginx 返回。上面 18 行改为 true 就是解决这个

后记

这是本菜最近自学时找到的解决办法,在我的电脑上是可以的,不知能不能帮到你~

这是我前天摸索出来方法之后写的文章: 真难!终于搞定了 nginx + puma 部署 rails 4

11355

@pynix 用了,html源码里还有几个重复的

<script src="/assets/application-253bbf63f38893fd31a156cad9124b61.js"></script>
18楼 已删除
11355

@alixiaomiao 建议设置成false

# Disable Rails's static asset server (Apache or nginx will already do this).
config.serve_static_assets = true

因为设置成true是让rails来处理静态资源吧

9800

#17楼 @steve 没有代码没有log很难诊断,你是在服务器上部署吗?

12706

#19楼 @steve 不设置为true asset就无法获取

11355

@pynix 在本机上跑呢。现在看access.log文件里有

"GET /assets/application-240f06338b04ca2bcd1ba1a6e222db0a.js HTTP/1.1" 200 469087 "http://localhost/"

,响应是200,看来precompile的js文件是可以访问了。但同时error.log文件里

[error] 11306#0: *1 open() "/home/steve/web/public/assets/application.js" failed (2: No such file or directory), client: 127.0.0.1, server: localhost, request: "GET /assets/application.js?body=1 HTTP/1.1", host: "localhost", referrer: "http://localhost/"

,还请求了未编译的js文件,还是本地路径的,这是什么情况?

9800

"GET /assets/application.js?body=1 HTTP/1.1", host: "localhost"

从这个来看你的rails是development模式。。。。

11355

@pynix 不是development模式,puma.rb文件

environment 'production'
APP_ROOT = '/home/steve/web'
pidfile "#{APP_ROOT}/tmp/pids/puma.pid"
state_path "#{APP_ROOT}/tmp/pids/puma.state"
bind 'unix:///home/steve/web/tmp/web.sock'
workers 0
threads 8,32
preload_app!
9800

#24楼 @steve 那就不清楚了。。。。

449

#24楼 @steve 单凭这个无法判断你的 puma 是 production 环境,因为 puma 的配置还有点坑。建议你在 database.yml 中,为 development 指定一个不存在的数据库,然后重启服务器,看看到底是哪个环境。

11355

@Victor puma启动有这个,

Puma starting in single mode...
* Version 2.8.2 (ruby 2.1.2-p95), codename: Sir Edmund Percival Hillary
* Min threads: 8, max threads: 32
* Environment: production

应该能说明是production吧

96

#27楼 @steve 你启动时用的指令是什么? rails s puma -e production?

Ddd737

类似 问题 unix:///var/www/railsServer/shared/tmp/sockets/puma.sock failed (111: Connection refused) while connecting to upstream 通过 rm tmp/sockets/* 然后重启解决

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册