分享 Passenger/Nginx/Ubuntu 快速部署 Rails 3.1

hisea · 发布于 2012年01月02日 · 最后由 adousj 回复于 2014年07月17日 · 18930 次阅读
96

重新配了一个服务器,分享一下部署过程。 很多东西都不是从源码安装,寻求最短的部署时间。

原文地址: http://hisea.me/p/rails31-ubuntu-passenger-nginx-quick-deploy

安装所需的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-dev zlib1g-dev libssl-dev build-essential curl git-core libc6-dev g++ gcc

添加一个rails用户

sudo adduser railsu
sudo usermod -G passenger,www-data,sudo railsu
su - railsu

安装 rvm

bash < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer)

加载rvm (只需第一次安装时加载)

source .bashrc

安装ruby

rvm install 1.9.2

rvm 高阶应用可以参考这里的指南

安装 passenger/nginx

rvm use 1.9.2 default
gem install passenger
rvmsudo passenger-install-nginx-module

所有都选默认,包括nginx安装目录业选择默认 /opt/nginx/

安装nginx启动脚本

wget https://gist.github.com/hisea/1548664/raw/53f6d7ccb9dfc82a50c95e9f6e2e60dc59e4c2fb/nginx

sudo cp nginx /etc/init.d/
sudo chmod +x /etc/init.d/nginx
sudo update-rc.d nginx defaults

配置nginx

配置文件在 /opt/nginx/config/nginx.conf

server {
   listen 80;
   server_name www.yourhost.com;
   root /home/railsu/project/public;   # <--- 这里是你项目的public目录
   passenger_enabled on;
}

搞定你的数据库

安装node.js

用来precompile rails assets

sudo apt-get install python-software-properties
sudo add-apt-repository ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get install nodejs

precompile assets

cd ~/project
rake assets:precompile

启动

sudo /etc/init.d/nginx start
共收到 80 条回复
540

相关参数更有价值哟~

96

#1楼 @iceskysl 什么相关参数呀

43

https://github.com/raecoo/rails-stack 用这个就更简单了, 一条命令安装, 完事儿后就差具体配置了, 如果有现成的文件, 直接丢到相关位置, 重启服务即可.

558

@hisea @raecoo 把具体流程写出来更有价值。 @huacnlee 难道ruby-china连markdown的###都不支持?!

De6df3

#4楼 @camel 话题里面没有 Markdown 支持的,就是为了防止随意使用 h(n)

449

#2楼 @hisea 感謝你的帖子,至少對我來說很有價值

96

支持

594

写得很好。 但我有些问题,railsu这个用户的用途具体是什么?

  1. 首先我看出你把code放在railsu中了。root /home/railsu/project/public
  2. 请问/home/railsu/project/public 的用户和组是谁?railsu?www-data?
  3. 请问你是不是把rvm装到railsu下了?
  4. 请问你的nginx进程的用户是谁?railsu?www-data?

谢谢!

331

站位,以后用的到..

96

#2楼 @hisea #5楼 @huacnlee ROR开发时默认用的是WEBrick, 当实际部署的时候是不是很少用默认的这个web服务器啊,看大家都用apache之类的?

96

#10楼 @carl 是的,webrick是个开发用的服务器

96

#8楼 @ery railsu就是一个用户,rvm是要装到一个用户里的,sudo或者是root会吧rvm搞晕。另外很多杂项事务,也是单独的用户比较好,很少系统用root干所有事情的。home/railsu/project/public的就是railsu的目录。nginx的进程是root.

594

#12楼 @hisea 请问“nginx启动脚本”是你自己写的吗?

96

#13楼 @ery 是根据nginx官方脚本修改的,把里面的配置文件和bin都指向Passenger编译的默认位置。

96

#13楼 @ery 如果感兴趣的话,官方脚本可以在这里找到http://wiki.nginx.org/Nginx-init-ubuntu

594

#15楼 @hisea 基于你的这篇文章,我已经在虚拟机中成功的实现了部署。 我的情况有些不同,首先我没使用MongoDB, 其次,我是在同一台机器上,部署两个项目。 两个项目用的都是ruby1.9.2, 但是两个项目分别使用不同的gemset。 再次感谢你的分享!

96

#16楼 @ery 不客气啊,很高兴看到能对你有所帮助。

1

#16楼 @ery 有了 bundle 之后,可以抛弃 gemset 了。

594

#18楼 @Rei 你的意思是,是用 bundle install --deployment 替换 rvm 的gemset吗?

1

#19楼 @ery 是啊。bundle 和 gemset 解决的是一个问题。

gemset 很容易搞混哪个 set 里面装了什么东西,管理起来很麻烦。

1

http://gembundler.com/deploying.html

bundle 和 cap 共用只要一行(默认用的是 --deployment)

1164
railsu@li85-215:~$ rvm use 1.9.2 default

RVM is not a function, selecting rubies with 'rvm use ...' will not work.
railsu@li85-215:~$ exit
logout
root@li85-215:~# rvm use 1.9.3 default
The program 'rvm' is current
1164

currently not installed. You can install it by typing:apt-get install ruby-rvm 你好.没有办法安装啊.请问是什么问题呢?

1164

根据你上面的配置

sudo /etc/init.d/nginx start
启动nginx会出现无法将它stop的情况
就算执行sudo /etc/init.d/nginx stop显示已经停止
但是在次开启的时候,会出现80端口占用

railsu@li85-215:~$ sudo /opt/nginx/sbin/nginx
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] still could not bind()

需要通过 sudo /opt/nginx/sbin/nginx -s stop 来让 nginx 停止 请问是什么原因呢?

445

@JeskTop 其实已经安装了,你重启一下你的机器

96

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 这个错误说你现在地址的80端口已经被占用了 #24楼 @JeskTop

16

搭车,大家开发的时候用哪个web server? webrick or thin 还是别的啥?

1164

#25楼 @stephen 第一个问题已经解决.重启后就好了.谢谢

#26楼 @hisea 是的.被占用,问题就是被nginx所占用了.使用sudo /etc/init.d/nginx stop后,通过IP地址,依然可以访问网址,说明nginx并未被关掉.需要通过sudo /opt/nginx/sbin/nginx -s stop,nginx才可以停止,通过该命令后,访问就是无法访问.所以sudo /etc/init.d/nginx stop似乎不知道出于什么问题,而没有作用了?

#27楼 @ywencn passenger+nginx

445

@hisea 有点疑问!配置nginx的时候

server {
   listen 80;
   server_name www.yourhost.com;
   root /home/railsu/project/public;   # <--- 这里是你项目的public目录
   passenger_enabled on;
}

这个server_name 是域名还是localhost? 其他配置好了,是不是要进入project的文件夹里启动服务器rails s???

16

#29楼 @stephen 域名,localhost本质上也是个域名。 passenger_enabled on; 会自动帮你启动rails

445

@ywencn

server {
   listen 80;
   server_name localhost;
   root /home/railsu/project/public;   # <--- 这里是你项目的public目录
   passenger_enabled on;
}

只要这样就行了?

445

@hisea

配置nginx

配置文件在/opt/nginx/config/nginx.conf 这里路径是错误的 正确/opt/nginx/conf/nginx.conf

16

#32楼 @stephen 配置文件你可以放到任何你想放的地方

445

哦,他是默认安装的嘛,我是说默认情况, @ywencn 但是我安装这个配置,全部搞好,还是访问不了,

262

@hisea @ywencn 同一个服务器上好几个项目是REE+Rails 2.3.14+Passenger+Apache2,现在加了一个新项目,是Ruby1.9.2+Rails3.2.1的,如何去部署配置这个新的项目?使用Passenger Standalone的效果很不理

96

@geekontheway 跨版本的ruby,rvm是个很好很方便的解决方案。 至于部署上,可以通过apache的proxy来做代理。

262

#36楼 @23c thanks,正是这么做的呃,本来以为是因为服务器上的JS库或者Assets没配置好,现在已经检查出是Proxy的配置少写了个斜杠。-。-!

96

刚才点这个帖子 出现一次 502 bad get way

861

嗯,跟我的步骤差不多了。

96

#32楼 @stephen 你是用passenger编译的么?可能新的版本目录跟原来的不一样了,过程大同小异的

96

#35楼 @geekontheway 多个ruby版本部署可以看看passenger这一个文档,还没来的及弄中文的

96

rvm use 1.9.2 default 应该为: rvm use 1.9.2 --default

96

编译Passenger with Nginx需要ssl库支持: sudo apt-get install libcurl4-openssl-dev

1303

感谢楼主,先收藏了,等需要部署了再行查看

96

Thanks, 先收藏了,等需要部署了再行查看

1738

mark一下

2031

最后安装node.js那步是做什么的?

96

#47楼 @Pitt 新的 coffee script 需要一个 js runtime 来 rake assets:precompile

2031

#48楼 @hisea

ruby没有一个gem来做这件事吗?

1959

收藏下,用的时候再来看,呵呵。

96

#49楼 @Pitt 我还没听说过这种gem啊,要是有分享一下

296

@hisea 出现这种 railsu is not in the sudoers file. This incident will be reported. 怎么办?

96

visudo

然后加一行

railsu ALL=(ALL) ALL

1364

lz,我怎么记得你以前发过一个同样的帖子

96

#54楼 @hlcfan 嘿嘿,是的,这个帖子就是很久以前的

515

#55楼 @hisea 要更新啊 3Q

96

#56楼 @kewin 更新啥意思。Rails 3.2的?部署跟这个差不多的。

2913

新版的passenger配置,需要这样设置:(切记) server { location /{ ...... passenger_enabled on; #只有放在这里才会启动passenger ...... } }

96

passenger_root /usr/local/rvm/gems/ruby-1.9.3-p286/gems/passenger-3.0.17; passenger_ruby /usr/local/rvm/wrappers/ruby-1.9.3-p286/ruby;

这两就加上之后,在动nginx老是报错,找不到passenger_root,我单独安装了1.3.7,./configure --add-module=,指定了passenger/ext/nginx,也会出现上面的错误。 但是我在passenger-install-nginx-module命令中选择第一个选项,它帮我下载编译安装nginx1.2.3之后,启动这个1.2.3就没有问题,还自动帮我添加了上面的两行,请问知道的帮忙解释一下,谢谢!!!

96

#24楼 @JeskTop nginx -s reload重新加载一下配置文件也可以。

96

很实用。

96

sudo usermod -G passenger,www-data,sudo railsu 是什么意思?

96

#62楼 @freemem 就是吧railsu这个用户放到passenger,www-data,sudo用户组里面

445

@hisea 执行sudo usermod -G passenger,www-data,sudo railsu 出现usermod: group 'passenger' does not exist错误了,是哪一步错了?

96

在说缺少passenger组,如果没有不知是不是passenger最近改了

96

#64楼 @stephen 看看不用这个可以吧

445

@hisea 嗯嗯,我没用到这个,暂时没出现问题,我也是用了最新的passenger才没有的!呵呵!现在写教程,可能要加上软件的版本号了!

5210

海信,我rvm有两个版本,部署两个项目1.8.7和1.9.3,passenger和apache要怎么配啊

96

#68楼 @badboy 两个应用,用不同的ruby版本的passnger需要运行standalone passenger,然后在apache里面配置反向代理。

具体的配置方法可以看这里: http://blog.phusion.nl/2010/09/21/phusion-passenger-running-multiple-ruby-versions/

96

#68楼 @badboy 不好意思,刚发现这一段

UPDATE February 27 2013: this article has been obsolete. Phusion Passenger supports multiple Ruby interpreters as of version 4.0.0. The PassengerRuby config option has been made a per-virtual host option, so you can customize your Ruby interpreter on a per-application basis.

就是如果你用Passenger 4的话,PassengerRuby配置不再是全局的了,可以用在VirtualHost里面,不同的VirtualHost用不同的Ruby

5210

啊哈,好东西,不过我拿thin跑起来,然后apache代理到对应的端口了。。。

我是火星文

3253

很不错的 tutorial。一步一步就可以搞起来。

96

非常有帮助的教程。希望hisea能够给指导下thin、passenger、puma(http://puma.io/,各自的部署。特别是puma,尝试很多次都部署不好。

1881

#75楼 @hisea 是github url改进了 已经找到原来的脚本,建议修改下原文https://gist.github.com/hisea/1548664/raw/53f6d7ccb9dfc82a50c95e9f6e2e60dc59e4c2fb/nginx

96

#76楼 @shanks 好的,谢谢啦,原文已修改

7614

lz有没有研究一下怎么卸载nginx啊, 我passenger装了一次nginx,配置文件被我改坏了,想重新装一次nginx,搞的现在nginx启动不起来了,我直接删除了nginx相关的文件夹,有没有什么方法,可以卸载的干净一些?

7614

#76楼 @shanks 为什么执行 sudo /etc/init.d/nginx stop 失败了呢,log里面也没有什么错误信息啊!

/github/test_sunspot$ sudo /etc/init.d/nginx stop
 * Stopping Nginx Server...                                                                                                                     [fail] 
96

部署了一次服务器,才发现这篇文章这么有用。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册