本文中我将描述在 DigitalOcean 上配置 Rails 生产环境的过程,希望对有相同需求的人一定的帮助
0x01. 创建服务器
如果你刚刚购买了 DigitalOcean 的服务,先添加一台机器,小应用的话 $5/Y 的即可,操作系统选择Ubuntu 14.04,基本纯前端操作,这里就不在赘述。
0x02. 添加用户
开始我们会使用 root 账号登录服务器,但是出于安全考虑,一般我们的 web 应用不能使用 root 用户运行,所以我们先需要添加一个专门的部署用户。名字随便起,这里就是 rails-deploy。
adduser rails-deploy
设置密码
passwd rails-deploy
将用户加入 sudo 群组
adduser rails-deploy sudo
退出 ssh 登录,使用新用户登录。
0x03. 安装 Ruby
为了安装和本地开发环境相同的 Ruby 这里选择从源码编译安装,先安装一些必要的库:
sudo apt-get install build-essential libssl-dev libyaml-dev libreadline-dev openssl curl git-core zlib1g-dev bison libxml2-dev libxslt1-dev libcurl4-openssl-dev nodejs
然后创建目录并下载ruby源码:
mkdir ~/ruby
cd ~/ruby
wget http://cache.ruby-lang.org/pub/ruby/2.1/ruby-2.1.2.tar.gz
tar -xzf ruby-2.1.2.tar.gz
cd ruby-2.1.2
开始编译
./configure
make
sudo make install
查看安装结果
ruby -v
$ ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-linux]
最后删除源码
rm -rf ~/ruby
0x04. 安装 Passenger 和 Nginx
Passenger 是一个比较好的 Rails 服务器,我们选择用它来运行 rails 并使用 Nginx 做反向代理。
我们选择使用 apt 来安装 Passenger,先安装 PGP key
bash
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 561F9B9CAC40B2F7
创建 apt 源文件
sudo vim /etc/apt/sources.list.d/passenger.list
加入下面这行,并保存退出
deb https://oss-binaries.phusionpassenger.com/apt/passenger trusty main
修改此文件所属用户和权限
sudo chown root: /etc/apt/sources.list.d/passenger.list
sudo chmod 600 /etc/apt/sources.list.d/passenger.list
更新 apt 缓存
sudo apt-get update
安装 Nginx
sudo apt-get install nginx-extras passenger
此操作将有可能会覆盖我们新安装的 ruby ,可做如下操作修复:
sudo rm /usr/bin/ruby
sudo ln -s /usr/local/bin/ruby /usr/bin/ruby
0x05. 设置 Web 服务器
打开 nginx 配置文件:
sudo vim /etc/nginx/nginx.conf
在 http 块找到下面两行
# passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
# passenger_ruby /usr/bin/ruby;
取消这两行的注释并修改第二行路径,如下
passenger_root /usr/lib/ruby/vendor_ruby/phusion_passenger/locations.ini;
passenger_ruby /usr/local/bin/ruby;
0x06. Clone 代码
安装 Rails
bash
sudo gem install --no-rdoc --no-ri rails
clone 项目代码
cd ~
git clone https://github.com/YOURNAME/REPO.git current
cd project/
bundle install
安装数据库(根据你的项目需求)
bash
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 7F0CEB10 echo "deb http://repo.mongodb.org/apt/ubuntu "$(lsb_release -sc)"/mongodb-org/3.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.0.list sudo apt-get update sudo apt-get install -y mongodb-org
0x07. 配置数据库
从安全的角度考虑,应该是为每个web 应用创建一个用户并且给予最小权限的,但是在这个过程中遇到的mongoid 的bug:
- SegmentFault
最终没有成功,希望有经验的朋友可以给予帮助。
所幸,momgo提供直连,在配置里面只限定本地连接基本上还是可以保证数据安全的,所以目前就采用直连的方式。
0x07. 启动服务器
rake assets:precompile # 编译静态文件
# passenger start -e production
# 上面这个命令可选执行,主要是为了测试是否配置成功
0x08. 修改 Nginx 配置
删除原有的默认网站配置:
sudo rm /etc/nginx/sites-enabled/default
sudo vim /etc/nginx/sites-enabled/example.com.conf
加入如下代码:
server {
listen 80 default;
server_name example.com;
root /home/rails-deploy/project;
passenger_enabled on;
rails_env production;
}
然后重启nginx
sudo service nginx restart
写在最后:按照道理来讲,这样的配置应该已经好了,开始很奇怪我的80端口访问报错 403,然后查了nginx 的日志发现报了下面的错误:
[error] 2269#0: *1 directory index of "/home/rails-deploy/project/" is forbidden, client: xxx.xxx.xxx.xxx, server: example.cn, request: "GET / HTTP/1.1", host: "example.cn"
在这里拖了整整两天之后,我看到了这里的一段讨论,然后就默默的打算放弃了。决定转战其他的ruby 服务器。
这里的问题貌似是passenger的问题,之前在 StackOverflow上看到这个问题但没解决。
顺便说一下就是我遇到的情况和上面Ruby china 上的那位一样,在项目目录下面放个index.html就可以访问了,也就是说项目目录的权限是没有问题的。
==== update ====
此刻我内心无比激动啊,这个问题终于解决了,原来是网站跟目录配置的问题应该root到项目的public目录下面。
不过又遇到了另一个问题,他说我的 gem 没安装,需要运行bundle install,可能是安装过程中权限问题,用sudo bundle install 就好了 : http://stackoverflow.com/questions/22663498/rails-phusion-passenger-er...
总之算是跑起来了,谢天谢地啊!