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

steve · 2014年06月28日 · 最后由 baurine 回复于 2017年08月17日 · 7586 次阅读

大家好,我按照这个文档 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"

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

(13: Permission denied)

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

nginx 顶部 的 user?

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

示例

user staff;

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

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

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

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

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

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

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

应该是的。

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

你有没有使用 asset helper?

@pynix 不好意思,assets helper 是?

#14 楼 @steve javascript_tag stylesheet_tag ==

说下我的解决方法吧

先是 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

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

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

@alixiaomiao 建议设置成 false

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

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

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

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

@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 文件,还是本地路径的,这是什么情况?

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

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

@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!

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

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

@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 吧

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

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

遇到一样的问题,通过 cap production puma:restart 解决。而且如果我没有 set :linkd_dirs 是没有问题的,一旦 set :linkd_dirs 后就会在 nginx.error.log 里看和 #30 楼一样的 log,必须每次在 cap production deploy 后再运行一下 cap production puma:restart.

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