Capistrano+Nginx+Unicorn 自动部署Rails

配置你的服务器

你需要在你的服务器上安装Ruby的环境,你可以使用RVM或者是rbenv.

上传到github

这步需要将你的应用上传到github,在你的github上创建新的repository,然后在你本机代码位置执行下面的命令,初始化git仓库。

git init
git add .
git commit -m"<message>"
git remote add origin [email protected]:<username>/<git repo>.git
git push origin master

安装Capistrano

在你的Gemfile里添加下面的一行。

?


1

gem‘capistrano‘

然后执行

?


1

bundle

在你的项目目录里执行

?


1

capify .

执行结果

?


1

2

3

4

examination-paper ? capify .                                                                                                                      git:master*

[add] writing‘./Capfile‘

[add] writing‘./config/deploy.rb‘

[done] capified!

创建了两个文件,你的Rails应用的配置文件写在config/deploy.rb里。下面是一个示例。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

require"bundler/capistrano"

# Define your server here

server"<server>",:web,:app,:db, primary:true

# Set application settings

set:application,"<app_name>"

set:user,"<deployment_user>"# As defined on your server

set:deploy_to,"/home/#{user}/apps/#{application}"# Directoryinwhich the deployment will take place

set:deploy_via,:remote_cache

set:use_sudo,false

set:scm,"git"

set:repository,"[email protected]:<git_user>/#{application}.git"

set:branch,"master"

default_run_options[:pty] =true

ssh_options[:forward_agent] =true

after"deploy","deploy:cleanup"# keep only the last 5 releases

namespace:deploydo

%w[start stop restart].eachdo|command|

desc"#{command} unicorn server"

task command, roles::app, except: {no_release:true}do

run"/etc/init.d/unicorn_#{application} #{command}"# Using unicorn as the app server

end

end

task:setup_config, roles::appdo

sudo"ln -nfs #{current_path}/config/nginx.conf /etc/nginx/sites-enabled/#{application}"

sudo"ln -nfs #{current_path}/config/unicorn_ini.sh /etc/init.d/unicorn_#{application}"

run"mkdir -p #{shared_path}/config"

putFile.read("config/database.yml"),"#{shared_path}/config/database.yml"

puts"Now edit the config files in #{shared_path}."

end

after"deploy:setup","deploy:setup_config"

task:symlink_config, roles::appdo

run"ln -nfs #{shared_path}/config/database.yml #{release_path}/config/database.yml"

end

after"deploy:finalize_update","deploy:symlink_config"

desc"Make sure local git is in sync with remote."

task:check_revision, roles::webdo

unless`git rev-parseHEAD` == `git rev-parse origin/master`

puts"WARNING: HEAD is not the same as origin/master"

puts"Run `git push` to sync changes."

exit

end

end

before"deploy","deploy:check_revision"

end

deploy.rb 文件,使用unicorn 作为server,配置文件nginx.conf和unicorn.rb 例子如下:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

upstream unicorn {

server unix:/tmp/unicorn.<app_name>.sock fail_timeout=0;

}

server {

listen 80 default deferred;

server_name <your_servername>;

if($host =‘<your_servername>‘) {

rewrite ^/(.*)$ http://<your_servername>/$1 permanent;

}

root/home/deployer/apps/<app_name>/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 X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_set_header Host $http_host;

proxy_redirect off;

proxy_pass http://unicorn;

}

error_page 500 502 503 504/500.html;

client_max_body_size 4G;

keepalive_timeout 10;

}

unicorn.rb

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

# Define your root directory

root ="/home/deployer/apps/gifroll/current"

# Define worker directory for Unicorn

working_directory root

# Location of PID file

pid"#{root}/tmp/pids/unicorn.pid"

# Define Log paths

stderr_path"#{root}/log/unicorn.log"

stdout_path"#{root}/log/unicorn.log"

# Listen on a UNIX data socket

listen"/tmp/unicorn.gifroll.sock"

# 16 worker processes for production environment

worker_processes16

# Load rails before forking workers for better worker spawn time

preload_apptrue

# Restart workes hangin‘ out for more than 240 secs

timeout240

最后

在config目录里,创建unicorn_init.sh ,添加下面的内容

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

#!/bin/sh

### BEGIN INIT INFO

# Provides:          unicorn

# Required-Start:    $remote_fs $syslog

# Required-Stop:     $remote_fs $syslog

# Default-Start:     2 3 4 5

# Default-Stop:      0 1 6

# Short-Description: Manage unicorn server

# Description:       Start, stop, restart unicorn server for a specific application.

### END INIT INFO

set-e

# Feel free to change any of the following variables for your app:

TIMEOUT=${TIMEOUT-60}

APP_ROOT=/home/deployer/apps/<app_name>/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=<user>

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"&&exit0

run"$CMD"

;;

stop)

sig QUIT &&exit0

echo>&2"Not running"

;;

force-stop)

sig TERM &&exit0

echo>&2"Not running"

;;

restart|reload)

sig HUP &&echoreloaded OK &&exit0

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

run"$CMD"

;;

upgrade)

ifsig USR2 &&sleep2 && sig 0 && oldsig QUIT

then

n=$TIMEOUT

whiletest-s $OLD_PIN &&test$n -ge0

do

printf‘.‘&&sleep1 && n=$(( $n - 1 ))

done

echo

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

then

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

exit1

fi

exit0

fi

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

run"$CMD"

;;

reopen-logs)

sig USR1

;;

*)

echo>&2"Usage: $0 <start|stop|restart|upgrade|force-stop|reopen-logs>"

exit1

;;

esac

我们如何部署我们的应用呢?

把你最新的改动push到github,然后执行下面的命令

?


1

cap deploy:setup

这个命令会在你的服务器
 
/<user>/apps/<app_name> 创建两个文件夹,然后把nginx和unicorn的配置文件链接到合适的位置。

你需要给服务器访问git 代码库的权限。

?


1

ssh-add

执行下面的命令部署

?


1

cap deploy:cold

cold部署会执行迁移并且重启web服务.

时间: 2024-10-07 08:28:01

Capistrano+Nginx+Unicorn 自动部署Rails的相关文章

nginx unicorn 来运行rails

一.安装nginx sudo apt-get install nginx 安装完成后查看一下:nginx -v 说明安装成功. ubuntu系统里的安装目录是在/etc/nginx/下,启动程序文件在/usr/sbin/nginx 二.新建项目 rails new app --skip-bundle 完成后修改Gemfile文件:vim Gemfile 把source 修改成taobao或者ruby-china的源. 在这个文件里加入:gem 'unicorn' 然后运行:bundle inst

PassengerNginxdebian快速部署Rails

Passenger/Nginx/Debian快速部署Rails PassengerNginxdebian快速部署Rails 安装所需的linux包 sudo apt-get install build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libxml2-dev libxslt-dev autoconf libc6-d

nginx + unicorn 部署rails项目

nginx + unicorn  部署 rails 项目,顾名思义要先安装nginx和unicorn 一 安装 安装nginx: sudo apt-get install nginx 安装unicorn: gem install unicorn 二 配置 1 在你项目的config文件夹下添加一个unicorn.rb文件,添加代码(样列:http://unicorn.bogomips.org/examples/unicorn.conf.rb) 我的如下: 1 module Rails 2 cla

使用Nginx + unicorn搭建ruby on rails的生产环境

有三台机器,操作系统都是CentOS 6.3 64位:其中172.16.9.100,安装Nginx服务器:另外的两台172.16.9.101和172.16.9.102安装unicorn,作为RoR的应用服务器.在这里先保证ruby及rails已经在101和102两台机器上配置好,这是前提.如何安装Nginx及RoR的环境就不在这里说了,很多文章都介绍得很详细. 这里假设项目在/var/www/demo_project文件夹中 在101上使用 gem install unicorn 命令安装uni

自动部署Nginx和nfs并架设Nginx集群脚本

本人经过多次尝试,简单完成了自动部署Nginx和nfs脚本,并且能够自动部署web反向代理集群,下面详细的阐述一下本人的思路.(以下脚本本人处于初学阶段,写的并不是很完善,所以需要后期进行整理和修正,请高手能够多多指教.) 本脚本需要注意的是: 1.这是针对centOS6.8,32位操作系统写的脚本文件,如果想在cenOS7中运行,就需要有些改动 2.这个脚本需要先安装代理服务器部分,再安装反向代理服务器,因为涉及到共享文件夹挂载的问题,所以需要有先后顺序: 3.今后本人会对此脚本进行更新和完善

Day11.开发脚本自动部署及监控

1.编写脚本自动部署反向代理.web.nfs:要求:I.部署nginx反向代理三个web服务,调度算法使用加权轮询: II.所有web服务使用共享存储nfs,保证所有web都对其有读写权限,保证数据一致性: 2.编写监控脚本,监控nginx,nfs存活状态,内存使用率检测,异常则发送报警邮件 准备发送邮件的工具: 监控脚本的编写: 继续编写刚才的脚本编写,加入邮件功能 3.编写计划任务,定时运行监控脚本,完成监控操作

开发脚本自动部署及监控

1.编写脚本自动部署反向代理.web.nfs: #!/bin/bash yum install epel-release -y yum install nginx -y ps aux |grep nginx |grep -v 'grep' if [ $? -ne 0 ] then systemctl start nginx fi sed -ri '/^http/a upstream xzhweb\{' /etc/nginx/nginx.conf sed -ri '/^upstream/a ser

Webhook实践 —— PHP自动部署

Webhook实践 -- PHP自动部署 1.部署Gogs 参考博客:使用 Gogs 搭建自己的 Git 服务器 2.添加git的ssh公钥 因为是用git用户部署的Gogs,接下来在服务器上配置用git账号配置ssh公钥 首先在主机上生成秘钥: [[email protected] ~]$ ssh-keygen -t dsa -P "" -f ~/.ssh/id_dsa Generating public/private dsa key pair. Created directory

脚本自动部署构架集群和监控状态

脚本自动部署构架集群和监控状态 shell脚本编写自动部署.初始配置.并启动nginx反向代理服务 1 #!/bin/bash 2 systemctl disable firewalld 3 systemctl stop firewalld 4 setenforce 0 5 #### 6 yum install epel-release -y 7 yum -y install zlib zlib-devel openssl openssl--devel pcre pcre-devel 8 yum