Passenger + Nginx + Rails 生产环境配置

本文中我将描述在 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

bashsudo 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

bashsudo gem install --no-rdoc --no-ri rails

clone 项目代码

cd ~
git clone https://github.com/YOURNAME/REPO.git current
cd project/
bundle install

安装数据库(根据你的项目需求)

bashsudo 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...

总之算是跑起来了,谢天谢地啊!

你可能感兴趣的:(nginx,passenger,deploy,ruby-on-rails)