使用Nginx,Puma和Capistrano在Ubuntu上部署Rails应用

原文出处:

https://www.digitalocean.com/community/tutorials/deploying-a-rails-app-on-ubuntu-14-04-with-capistrano-nginx-and-puma

部署的过程在上文中已经讲得很详细了,本文的目的是为了记录自己在部署过程中遇到的一些问题,以及补充教程中不足的地方。

1.部署遇到的问题

  1. 所有配置完成之后,执行 cap product deploy:initial时出现了 Don't know how to build task 'start' 错误,可以在Capfile中 require capistran/puma的下面添加 install_plugin Capistrano::Puma解决,这是因为capistran3-puma需要添加这一行来加载puma默认的task。
  2. 在部署的过程中,如果出现了 PG::ConnectionBad - could not connect to server: Connection refused, 那么可以sudo service posgresql restart 来解决问题
  3. 在安装postgresql的时候出现了 Can't find the 'libpq-fe.h header 的错误,是因为在服务端安装postgresql的时候没安装 libpq-dev 导致的,所以:
sudo apt-get install libpq-dev
# 注意:是libpq而不是libpg,这个地方很容易看错
  1. 如果在服务端没有安装 Javascript Runtime 的话会报这样一个错误 Uglifier gem needs JavaScript runtime,nodejs是一个选择
sudo apt-get install nodejs
  1. 部署的过程中,在执行rake db:migrate的时候会提示一个错误 database xxx not exist ,这是因为在第一次部署的时候需要登录到vps上去手动创建数据库,记得带上环境变量
RAILS_ENV=production bundle exec rake db:create
  1. 但是在手动创建数据库时,如果你使用的是postgresql的话,可能会提示你 role xxx(你此时的linux user name) does not exist,你需要创建一个跟你linux用户名一样的postgre role,不然是无法创建数据库的
# 先使用持有管理员权限的postgre默认role: postgres登录
sudo -i -u postgres
# 创建新的role deploy
createuser --createdb --superuser deploy
# 然后就可以 ```rake db:create``` 或者 ```createdb xxx``` 来创建数据库了
  1. 在部署完成之后,使用server public ip来访问应用时出现了这样一个问题 an-unhandled-lowlevel-error-occurred-the-application-logs-may-have-details 首先想到的就是看log,但是从production.log,nginx.error.log到puma.error.log都没有找到有用的信息,后来发现原来教程中deploy.rb中的puma.access.log和puma.error.log的位置反了,所以应该去puma.access.log中看,最后发现是缺少production的secret_key_base环境变量,所以:
# 现在vps上生成key
RAILS_ENV=production bundle exec rake secret
# 然后复制生成的key,在deploy.rb中增加如下配置
set :default_env, {
  'SECRET_KEY_BASE' => 'key'
}
# 还需要注意一点,注意查看自己的.gitignore文件中有没有secrets.yml
  1. 部署完成后,如果出现了原本在开发环境中的资源在生产环境报404的话(如app/assets/images中的图片,app/assets/fonts中的字体文件等),那么在 config/environment/production.rb 中:
config.public_file_server.enabled = true

你可能感兴趣的:(使用Nginx,Puma和Capistrano在Ubuntu上部署Rails应用)