密码 digitalocean 已经发送到我的邮箱中了,所以我可以用 root 的身份登人到新加坡的这个服务器之中。 不用 root 来进行部署。
NO.1 创建用户 peter
adduser peter --ingroup sudo
然后切换到 peter 这个用户
su peter
cd
后续所有操作都以 peter 的身份来做。
安装 ruby
NO.2 安装 ruby 语言
这一部分跟本地开发环境下没有太太的区别,在 Rails 10日谈课程 中有一集是专门介绍过的。
sudo apt-get update
sudo apt-get install git-core curl zlib1g-dev build-essential \
libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 \
libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common
cd
git clone git://github.com/sstephenson/rbenv.git .rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init -)"' >> ~/.bashrc
exec $SHELL
git clone git://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc
exec $SHELL
rbenv install 2.1.2
rbenv global 2.1.2
NO.3 安装 mysql 数据库
sudo apt-get install mysql-server mysql-client libmysqlclient-dev
安装服务器
这一步就跟本地开发环境不一样了。
NO.4 安装 nginx 和 passenger
nginx 是一个高速的 web 服务器, passenger 是跑 rails 应用需要的“应用服务器”,总之它们都是服务器。
安装需要的密钥:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
让 apt-get 支持 https
sudo apt-get install apt-transport-https ca-certificates
sudo add-apt-repository 'deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main'
sudo apt-get update
安装 nginx 和 passenger,注意这样安装,就不用执行 passenger-install-nginx-module
了,以前的运行这个命令的时候经常
会出现由于内存不够导致执行失败,很烦人的。
sudo apt-get install nginx-extras passenger
现在浏览器中访问 happypeter.org 就可以看到 nginx 的默认页面了,如果你看不到,证明 nginx 没有装好。
部署
NO.5 安装 javascript 的运行环境,这个是跑 rails 应用必须的。
sudo apt-get install nodejs
NO.6 通过 scp 或者更为常见的用 git clone 命令用 github.com 上把代码 clone 到服务器上。
NO.7 安装 bundler,并用它来把项目需要的依赖包都安装好
gem install bundler
rbenv rehash
cd meetup/
bundle
NO.8 填写需要的配置
cd config
vim database.yml # 填写数据库的密码
vim ... # 一般还会有一些其他的配置,不过咱们 meetup 这个项目里就没有了
NO.9 创建数据库
bundle exec rake db:create db:migrate RAILS_ENV=production
尤其是要注意后面的 RAILS_ENV
。
NO.10 把 js/css 等 asset 文件做预处理
bundle exec rake assets:precompile RAILS_ENV=production
# precompile 这一句如果不加 RAILS_ENV 设置还是会有问题的,font-awesome 字体文件加载不了
这样的结果是在,public/ 之下出现了很多代哈希值的文件名,粗略的可以认为这样的措施就是为了提高网站访问速度。
NO.11 修改 nginx 和 passenger 配置
打开 nginx 的配置文件:
sudo vim /etc/nginx/nginx.conf
找到下面的两行,取消注释
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /usr/bin/ruby;
并把第二行改为
passenger_ruby /home/peter/.rbenv/shims/ruby;
然后要来为 meetup 项目,专门创建一个服务器配置文件。
cd /etc/nginx/sites-enabled
rm default
sudo vim meetup.conf
meetup.conf 中的内容如下
server {
listen 80 default;
server_name happypeter.org;
passenger_enabled on;
gzip on;
root /home/peter/meetup/public;
}
nginx 的配置修改后,不要忘了重启 nginx 服务器
sudo service nginx restart
NO.12 浏览器中访问 happypeter.org 看到 502 错误。这是怎么回事呢?稍微早一点的 rails 版本是没有这个问题的。google 一下 “nginx passenger 502”
查看一下
sudo tail -f /var/log/nginx/error.log
重新访问 happypeter.org ,可以看到错误原因:
*** Exception RuntimeError in Rack application object
(Missing `secret_key_base` for 'production' environment, set this value in `config/secrets.yml`)
解决方法是用 vim 打开 config/secrets.yml 文件,到 production 一项下面
- secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
+ secret_key_base: 852854f482963d747f4cbe8ce028f9400d76fb247f648029cb5643d90560367a34347aa491a3b1a96dce0ebddce8093fc296fed2bfabf1c79de5bcfb3a405238
要设置的随机数可以通过 rake secret
命令来获得。需要运行
touch tmp/restart.txt
来重新加载设置。