Ruby on Rails 折腾记(2)——在CentOS上用 Apache + passenger 部署rails4应用
今天群里的一位小伙伴求助他在centOS上用Apache跑rails的配置问题,我以我一定的Apache配置经验,想帮助他解决。然后他就给出了他学习的教程,一篇digitalocean(著名SSD vps商)的官方帮助:
https://www.digitalocean.com/community/articles/how-to-setup-a-rails-4-app-with-apache-and-passenger-on-centos-6
打开这篇帮助,我发现它写得很完善,从安装Apache(httpd)开始,到安装rvm、ruby、rails一步步下来,然后安装passenger。passenger是著名rails部署中间件,支持Apache、nginx、***(剩下的忘了),它的作用就是在启动这些http服务软件的时候,帮助我们启动rails应用。
我之前也尝试过使用Apache来监听80端口,然后用反向代理将所有请求转向本地3000端口,成功了。当然rails应用需要自己手动启动,设一个开机自起也行。使用http服务软件而不是修改rails默认的3000端口到80的原因是,一旦rails应用出错退出,这时候可以给访客一个5XX的错误,而不是连接失败。当然,使用passenger一类的中间件后,还可以做到挂掉自动重启的功能。
好了,为了帮助他解决问题,我去找了passenger的文档来看。地址是:
http://www.modrails.com/documentation/Users%20guide%20Apache.html
虽然是全英文的,但是写的很浅显易懂,我挑重点的看,向下浏览的很快,不一会儿,我看到了这个:
http://www.modrails.com/documentation/Users%20guide%20Apache.html#_disabling_without_uninstalling
这虽然是讲,在不卸载passenger的情况下,如何禁用passenger的效果,但是,这就是活生生的配置文件呀!
我把链接发给他,他弄了一会儿,还是没弄好。我想我反正也没尝试过passenger我也搞一个算了。于是我就在我本地的centOS虚拟机上尝试安装配置passenger。我先叙述正确的配置步骤,再叙述我踩过的坑。
以下为我的配置步骤,绝对干货:
1. 安装Apache过程略过。
2. 安装rvm和ruby过程略过。
3. 在cd到/var/www/html下以后,运行 rails new fuckrails(名字可以随便取啦)。十分建议把应用建到/var/www/html下,这是Apache的默认目录,建到其他地方可能带来意想不到的权限问题。
4. 接下来安装passenger,运行:
gem install passenger
5. 安装Apache的两个依赖包:
yum install curl-devel httpd-devel
6. 配置passenger(选择http服务软件):
passenger-install-apache2-module
7. 配置Apache,修改 /etc/httpd/conf/httpd.conf) 如下:
RackEnv development NameVirtualHost *:80 LoadModule passenger_module /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.37/buildout/apache2/mod_passenger.so PassengerRoot /usr/local/rvm/gems/ruby-2.1.0/gems/passenger-4.0.37 PassengerDefaultRuby /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby PassengerMaxPoolSize 10 <VirtualHost *:80> ServerName test.com DocumentRoot /var/www/html/fuckrails/public #RailsBaseURI /var/www/html/fuckrails <Directory /var/www/html/fuckrails/public> # This relaxes Apache security settings. AllowOverride all # MultiViews must be turned off. Options -MultiViews </Directory> </VirtualHost>
8. 重启Apache:
service httpd restart
我以前重启Apache都是执行 httpd(MAC下是apachectl) -k restart,采用service方法以后,就会实时地报出错误,这个非常好。之前那种老方法启动不了就是启动不了,这个还会告诉你配置文件哪一行写错了,怎么错的。
9. 错误检索提示:请先确认在应用里面用 rails s 能跑起来,再来找Apache和passenger的问题。rails在Linux下部署,会出现诸如 sqlite-devel 包没装,没有 js 运行环境等各种各样的问题。
10. 重要提示:请仔细比对自己的配置文件和我上面写的可以成功运行的配置文件的区别,不要放过任何一个细节!
我踩过的坑:
1. passenger官方指导页把 NameVirtualHost *:80 写成了 NameVirtualHosts *:80,多了个 s ,会导致Apache启动报错。
2. LoadModule passenger_module 那一行,由于centOS 6.5 默认开启了SELinux,导致没有权限访问mod_passenger.so文件,chmod了事。
3. 同样由于SELinux,对 PassengerDefaultRuby 项后面的值,permition denied。彻底关闭SELinux了事,配置 /etc/selinux/config 。
4. PassengerDefaultRuby 一项,后面的值是 /usr/local/rvm/gems/ruby-2.1.0/wrappers/ruby ,不是只到 /ruby-2.1.0 就完了。
4. 没加 RackEnv development 导致passenger无法启动rails应用。
5. 我在centOS里面装了node.js,但是passenger不认,最终开启Gemfile里的therubyracer解决,它默认是注释掉的。node在直接rails s的情况下都是工作的。
综合体验下来,rails还是非常人性化的,坑虽然不少,但是等你掉进去以后,都会告诉你怎么死的,然后爬出来就方便了。这让我想起我之前实习时候的团队Leader在谈到MySQL DBA工作时的话:最麻烦的就是找不到问题,如果问题能找到,那肯定能被解决。从这种意义上讲,我越来越喜欢rails了呢。另外我的这位大牛前Leader正在二次创业,祝愿他能成功!
评论:
2016-11-01 15:16
你好我遇到了 这问题 怎么解决啊 能说详细点吗