阿里云发布Ruby on Rails(上)

      写给刚刚开始学习Ruby on Rails的朋友们,希望能对第一次在云服务器上发布自己项目的朋友有一点点帮助,节约一些时间。

      对于只是纯粹学习Ruby on Rails的朋友,还是挺推荐Heroku,发布非常简单,可以很容易的来验证学习、练手成果。但是,毕竟国外的网站,访问速度比较受限。

      如果想把自己的Rails项目发布、分享给自己的朋友们或种子用户。租用国内的云服务器还是比较方便。本文就以阿里云服务器为例,走一遍Rails发布的过程。

      需要用到的应用:

      - Ruby on Rails

      - Nginx

      - Unicorn

      - Postgresql

      - Capistrano

      本文共分两篇来完成,这是第一篇,重点在前期准备和服务器端的环境配置,共两个部分9个步骤。

      注:文中用#开头的斜体文字都是说明性文字,不需要作为命令输入;

            代码中"yourapp"只是一个示例,您可以替换成您网站应用的名字(非中文);

明确目标:


1、有一台阿里云服务器;

2、用Ruby on Rails做了一个网站,要发布出去;

3、后续版本更新发布用一行简单的代码搞定,比如:

cap production deploy


操作系统环境:


云服务器操作系统:Ubuntu 14.04 64位

本地系统:Mac OS 10.11.6

Part 1 : 服务器准备


这一部分涉及3个方面内容:

- 下载一个好用的终端工具:iTerm

- 连接云服务器;

- 服务器打补丁,创建新用户;


Step 1  终端工具:iTerm

iTerm2是一个替代OS X系统自带终端的一个软件,受很多Mac系统的开发者喜爱,本文利用iTerm2完成命令操作,重点不在介绍iTerm,如果有兴趣可以看一下这篇博文:《你应该知道的 iTerm2 使用方法--MAC终端工具》

Step 2  连接云服务器

打开iTerm2,输入命令:

ssh root@[ip address]

然后输入服务器的root密码,连接到云服务器。

Step 3  服务器基本配置

    关于服务器安全相关的一些配置,例如使用公钥登陆、防火墙设置等,本文不做深入的探究。网上相关资源挺多,有兴趣的朋友可以自己多了解一下。

    给服务器打补丁,并创建新用户(不能总用root来做操作)。

1) 输入下面的命令,安装服务器补丁

aptitude update

aptitude safe-upgrade

2)创建一个新的用户,起一个你喜欢的名字,这里用chris做示例

adduser chris

把新创建的用户加入到sudo组,就可以使用sudo命令了

usermod-a-G sudo chris

重启一下服务器,让安装的补丁生效

sudo reboot

Part 2 : 服务器配置


这一部分涉及6个方面的内容:

- 安装必要的软件包(如postgres,nginx等);

- 创建一个用来发布应用的用户;

- 安装Ruby;

- 安装和配置Postgresql(数据库服务);

- 安装和配置Nginx(Web服务);

- 安装和配置Unicorn (Ruby应用服务);


Step 1 在服务器上安装必要的软件包

1)安装必要的软件包

aptitude与 apt-get 一样,是功能极其强大的包管理工具。我们利用aptitude来安装必要的软件包:

- git-core  curl  build-essential  python-software-properties

- nodejs

- postgresql  postgresql-server-dev-9.3

- Other Libraries:zlib1g-dev  libssl-dev  libreadline-dev  libxml2-dev  libxslt1-dev  libcurl4-openssl-dev

- Nginx using a ppa

软件包很多,下面贴出命令代码,请在iTerm中输入:

# 安装必要的软件包(在Part1 step3中新创建的用户下执行下面的命令)

sudo aptitude -y install git-core curl build-essential zlib1g-dev libssl-dev libreadline-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev nodejs postgresql postgresql-server-dev-9.3 python-software-properties

2)安装 Nginx

# 安装 nginx ppa

sudo add-apt-repository ppa:nginx/stable

#更新

sudo aptitude update

#安装Nginx

sudo aptitude-y install nginx

Step 2 创建一个用来发布应用的用户

#创建专门的发布用户,对于在一个服务器环境下,部署配置和发布多个不用的应用比较方便。

1 ) 创建用户

sudo adduser deploy

2)更改用户组,给予发布用户sudo的命令权限

usermod-a-G sudo deploy

3 )创建用来发布应用的目录,更改对应的权限

sudo mkdir-p/opt/www/yourapp

sudo chown-R deploy/opt/www/yourapp

sudo chgrp-R deploy/opt/www/yourapp

sudo chmod-R775/opt/www/yourapp

Step 3 在服务器上安装Ruby

1)首先,切换到刚创建的deploy用户(在对应的发布用户下来配置对应的部署环境

sudo su-deploy

2)rbenv是一个非常方便的Ruby版本管理工具,用来管理多个版本的 ruby 在用户目录的安装和使用。首先我们来安装rbenv:

git clone https://github.com/sstephenson/rbenv.git~/.rbenv

3)配置一下bashrc文件:

#利用nano来打开bashrc,当然也可以使用vim等其它编辑工具

nano~/.bashrc

在bashrc文件中加入如下两行:

export PATH="$HOME/.rbenv/bin:$PATH"

eval"$(rbenv init -)"

bashrc文件编辑参考,前两行为添加的配置

让配置文件生效

exec $SHELL

4)安装Ruby

#install ruby-build

git clone git://github.com/sstephenson/ruby-build.git~/.rbenv/plugins/ruby-build

#列出可以安装的Ruby 版本

rbenv install-l

#这里选择2.3.1版本作为示例,当然您可以选择自己需要的版本来安装,利用rbenv来管理不同版本

rbenv install2.3.1

#设置全局版本

rbenv global2.3.1

#生效

rbenv rehash

#查看Ruby版本来验证一下

ruby -v

#安装 bundler gem

gem install bundler--no-ri--no-rdoc

#rehash

rbenv rehash

至此,我们在服务器上完成了Ruby的安装。

Step 4 在服务器上配置postgres

#切换postgres用户

sudo su - postgres

#连接postgres

psql

#为应用创建一个数据库,owner设定为应用的发布账户

create database yourapp_production owner deploy

#退出psql和postgres用户

\q

exit

#切换到deploy用户

sudo su-deploy

# 测试数据库连接

psql -d yourapp_production

#测试成功,退出

\q

exit

至此,我们完成了postgres数据库服务器的基本配置。

Step 5 在服务器上配置Nginx

1 ) 删除Nginx默认页面,并创建一个新的

sudo rm/etc/nginx/sites-enabled/default

sudo nano/etc/nginx/sites-available/yourapp

2)下面是Nginx 配置文件的一个基本设置

upstream unicorn_yourapp {

    server unix:/tmp/unicorn.yourapp.sock fail_timeout=0;

}

server {

    listen 80 default deferred;

    server_name  [your domain or ip address];

    root/opt/www/yourapp/current/public;

    location~^/assets/{gzip_static on;

    expires max;

    add_header Cache-Control public;

}

try_files $uri/index.html $uri @unicorn;

location @unicorn {

    proxy_set_header Host $http_host;

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

    proxy_redirect off;

    proxy_pass http://unicorn_yourapp;

}

error_page 500 502 503 504 /500.html;

client_max_body_size 4G;

keepalive_timeout10;

}

注:yourapp替换成您的网站项目名字(非中文);

      [your domain or ip address] 替换成您的域名或者服务器外网IP.

3 )让您的新网站生效

sudo ln-s/etc/nginx/sites-available/yourapp/etc/nginx/sites-enabled/yourapp

#启动Nginx

sudo service nginx start

至此,我们完成了服务器端Nginx的配置工作;

Step 6 在服务器上配置Unicorn

1) 创建Unicorn配置文件

sudo nano/etc/init.d/unicorn_yourapp

2) 配置文件设置参考

#!/bin/sh

set-e

TIMEOUT=${TIMEOUT-60}

APP_ROOT=/opt/www/yourapp/current

PID=$APP_ROOT/tmp/pids/unicorn.pid

CMD="cd$APP_ROOT; bundle exec unicorn -D -c$APP_ROOT/config/unicorn.rb -E production"

AS_USER=deploy

set-u

OLD_PIN="$PID.oldbin"

sig () {

test-s "$PID" && kill -$1 `cat $PID`

}

oldsig () {

test-s$OLD_PIN&&kill-$1`cat$OLD_PIN`

}

run () {

if ["$(id -un)"="$AS_USER"]; then

   eval $1

else

  su-c"$1"-$AS_USER

  fi

}

  case "$1" in

start)

    sig 0 && echo >&2 "Already running" && exit 0

    run"$CMD"

    ;;

stop)

    sig QUIT && exit 0

    echo >&2 "Not running"

    ;;

force-stop)

  sig TERM && exit 0

  echo >&2 "Not running"

  ;;

restart|reload)

  sig HUP && echo reloaded OK && exit 0

  echo >&2 "Couldn't reload, starting '$CMD' instead"

  run"$CMD"

  ;;

upgrade)

if sig USR2 && sleep2 && sig 0 && oldsig QUIT

then

  n=$TIMEOUT

  while test-s $OLD_PIN && test $n -ge 0

  do

 printf '.' && sleep 1 && n=$(( $n-1 ))

done

echo

if test $n -lt 0 && test -s $ OLD_PIN

then

  echo >&2 "$OLD_PIN still exists after $TIMEOUT seconds"

  exit 1

fi

exit 0

fi

echo >&2 "Couldn't upgrade, starting '$CMD' instead"

run "$CMD"

;;

reopen-logs)

  sig USR1

;;

*)

echo >&2 "Usage: $0 "

exit 1

;;

esac

看起来有点长。。复制粘贴到您的配置文件,把“yourapp”替换成您网站项目的名字(非中文)即可。

#设置权限

sudo chmod755/etc/init.d/unicorn_yourapp

#设置启动脚本

sudo update-rc.d unicorn_yourapp defaults

至此,我们就完成了服务器端Unicorn的配置。


以上,在我们的云服务器上安装了必要的软件包,完成了服务器的基本配置。这样我们就基本搭建出一个可以方便的部署Ruby on Rails应用的云服务器环境。

在下一篇中,我们将重点聊一下应用发布的步骤。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容

  • 下载ubuntu 14.4server版安装, 装完干净的系统后,我们首先需要更新 $ sudo apt-get ...
    星野君阅读 2,277评论 0 2
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,585评论 18 139
  • Git安装 a)git –-version如果没有安装的话,提示安装,不要选择xcode b)验证安装是否成功 查...
    IT达摩阅读 1,534评论 1 3
  • 最近看了一本日本的小说《影绘》。我从字面上来理解的时候觉得肯定和摄影或者绘画有关的一本书,然后翻来看以后是...
    遇见军艳阅读 540评论 0 0
  • 我身在 当时你 幻想的 未来里 这个狂热和冲动 早已冷却的如今 你顽固 的神情 消失在 镜子里 只留下 时光消逝的...
    黎落清音阅读 149评论 4 0