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

hisea · 2012年01月02日 · 最后由 dccmmtop 回复于 2018年05月10日 · 25265 次阅读

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

原文地址: 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

相关参数更有价值哟~

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

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

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

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

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

写得很好。 但我有些问题,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?

谢谢!

站位,以后用的到..

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

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

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

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

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

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

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

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

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

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

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

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

http://gembundler.com/deploying.html

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

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

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

根据你上面的配置

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 停止 请问是什么原因呢?

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

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

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

#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

@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???

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

@ywencn

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

只要这样就行了?

@hisea

配置 nginx

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

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

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

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

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

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

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

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

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

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

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

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

匿名 #44 2012年03月22日

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

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

mark 一下

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

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

#48 楼 @hisea

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

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

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

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

visudo

然后加一行

railsu ALL=(ALL) ALL

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

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

#55 楼 @hisea 要更新啊 3Q

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

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

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 就没有问题,还自动帮我添加了上面的两行,请问知道的帮忙解释一下,谢谢!!!

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

很实用。

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

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

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

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

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

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

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

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

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

#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

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

我是火星文

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

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

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

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

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

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

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

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

时隔六年,这篇文章对我仍然很有用!🤔

ery 部署 Rails/Passenger/Nginx/Mysql/RVM/Ubuntu 提及了此话题。 04月03日 10:56
sanvi gridfs 使用问题 提及了此话题。 04月03日 10:56
346617552 请教在 vps 上搭建的问题 提及了此话题。 04月03日 10:56
stephen [该话题已被删除] 提及了此话题。 04月03日 10:58
需要 登录 后方可回复, 如果你还没有账号请 注册新账号