本文参照Ruby China
的教程,在阿里云ubuntu 16.04上部署自己的rails应用,逐步列出遇到的问题及其解决方案
创建账号
以root账户登录服务器,运行:
$ useradd -m -s /bin/bash deploy
$ adduser deploy sudo
$ passwd deploy
退出root账户,以deploy登录。
使用 RVM 安装 Ruby
更新 apt,并安装 curl:
$ sudo apt-get update
$ sudo apt-get install curl
安装RVM
$ gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
$ \curl -sSL https://get.rvm.io | bash -s stable
$ source ~/.bashrc
$ source ~/.bash_profile
安装 Ruby
$ rvm use --install --default 2.4.1
安装Passenger
Passenger 是一个 app server,支持基于 Rack 框架的 Ruby app(包括 Rails),作为模块变异到Nginx,不需要自己启动。
安装 Passenger 最简单的方法是通过 apt 安装,首先导入 Passenger 的密钥([官方文档](
https://www.phusionpassenger.com/library/install/nginx/install/oss/trusty)):
$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
安装 apt 插件以支持 https 传输:
sudo apt-get install apt-transport-https ca-certificates
添加 apt 源(对应 Ubuntu 16.04 LTS):
$ sudo sh -c 'echo deb https://oss-binaries.phusionpassenger.com/apt/passenger xenial main > /etc/apt/sources.list.d/passenger.list'
$ sudo apt-get update
安装 Passenger 的包:
$ sudo apt-get install nginx-extras passenger
修改 nginx 配置,编辑 /etc/nginx/nginx.conf
,找到这一行的注释:
# include /etc/nginx/passenger.conf;
应用部署
创建文件夹:
$ sudo mkdir -p /var/www/dodolee.club
$ sudo chown deploy:deploy /var/www/dodolee.club
clone 项目文件:
$ /var/www/dodolee.club
$ git clone https://github.com/LuoYeGuFei/dodolee_blog.git current
当前项目使用mysql,安装mysql:
$ sudo apt-get install mysql-server
mysql 相关配置可能出现的问题:
Access denied for user ‘root’@’localhost’,要解决这个问题,只需要在
/etc/mysql/mysql.conf.d/mysqld.cnf
中找到[mysqld]
模块,插入skip-grant-tables
。无法通过
/tmp/mysql.sock
连接:$ ln -s /run/mysqld/mysqld.sock /tmp/mysql.sock
远程无法连接mysql:阿里云添加安全规则,允许访问3306端口
执行 migrate
$ bundle install
$ RAILS_ENV=production rake db:create db:migrate
执行 assets precompile:
$ rails assets:precompile
Nginx 配置
删除原有的默认网站配置:
$ rm /etc/nginx/sites-enabled/default
新建网站配置:
$ touch /etc/nginx/sites-enabled/example.com.conf
编辑 /etc/nginx/sites-enabled/example.com.conf
,写入以下内容:
server {
listen 80 default;
server_name example.com; # 这里填写你真实域名
root /var/www/example.com/current/public;
passenger_enabled on;
}
重启 nginx:
$ sudo service nginx restart
网站依旧无法访问
config/database.yml
中定义的ENV['DATABASE_PASSWORD']
不存在,可以在~/.bash_profile
中export,然后source一下;- Missing
secret_key_base
for ‘production’ environment, set this value inconfig/secrets.yml
: 执行rails secret RAILS_ENV=production
, 将生成的key作为secret_key_base
export; - 无法通过IP访问:添加80/80端口的安全规则;
- 修改主机名后出现错误“sudo: unable to resolve host lyz”:
sudo vi /etc/hosts , 127.0.0.1 lyz
。