passenger
passenger
是一个能快速搭建web环境的工具,它能快速的将
nginx
和
passenger
部署到你的服务器中,是部署
ruby
环境就如同php环境那样简单快速,让人愉悦。下面我将使用这个工具将一个几乎空白的web服务器打造成一个高效的ruby服务器
centos7
centos7
是最新的centos版本带来了一系列新特性,包括对Docker的支持和性能的提高,
centos 6和 centos 7性能对比
安装ruby环境
首先下载
rvm
(ruby虚拟机)
curl -L get.rvm.io | bash -s stable
安装
rvm
source /etc/profile.d/rvm.sh
安装
ruby
(请选择官网上最新的版本,使用
ruby
就要一直坚定的使用其最新版本)
rvm install 2.2.1
安装完成后只要运行
ruby -v
有显示版本号就证明已经安装成功了
安装Passenger 和 Nginx
首先使用
gem
安装
passenger
gem install passenger
由于
nginx
不支持动态的模块载入,所以要使用
passenger
来进行编译安装由
passenger
修改过的
nginx
接下来安装
nginx
+
passenger
passenger-install-nginx-module
运行了这个命令后,按照提示一步步安装
1.Yes: download, compile and install Nginx for me. (recommended)
The easiest way to get started. A stock Nginx 1.0.10 with Passenger
support, but with no other additional third party modules, will be
installed for you to a directory of your choice.
2.No: I want to customize my Nginx installation. (for advanced users)
Choose this if you want to compile Nginx with more third party modules
besides Passenger, or if you need to pass additional options to Nginx's
'configure' script. This installer will 1) ask you for the location of
the Nginx source code, 2) run the 'configure' script according to your
instructions, and 3) run 'make install'.
Whichever you choose, if you already have an existing Nginx configuration file,
then it will be preserved.
Enter your choice (1 or 2) or press Ctrl-C to abort:
当遇到这个选择时,建议选择1,1代表自动完整安装并配置nginx,2是代表根据自己需求定制nginx.
安装完成后系统会提示,
nginx
安装的目录,在
centos7
下默认是安装在
/opt/nginx
下,配置文件是默认在
/opt/nginx/conf/nginx.conf
打开
nginx.conf
我们可以看到,
passenger
已经在
nginx
的配置文件上做了一点小配置
passenger_root /usr/local/rvm/gems/ruby-2.2.1/gems/passenger-5.0.10;
passenger_ruby /usr/local/rvm/gems/ruby-2.2.1/wrappers/ruby;
安装rails并初始化一个rails项目
使用
gem
安装
rails
gem install rails
初始化一个
rails
项目
rails new sample_app
第一次初始化
rails
时一般会报出缺少
gem
的警告,此时只需要将
rails
的镜像改为淘宝镜像,详见
http://ruby.taobao.org,然后执行
bundle install
当执行完毕后,一个
rails
项目的初始化就完成了
配置nginx
打开配置文件
vim /opt/nginx/conf/nginx.conf
这里给出一份最简单能运行的
nginx.conf
(注意:rails项目的目录是/opt/www)
{
worker_processes 1;
events {
worker_connections 1024;
}
http {
passenger_root /usr/local/rvm/gems/ruby-2.2.1/gems/passenger-5.0.10;
passenger_ruby /usr/local/rvm/gems/ruby-2.2.1/wrappers/ruby;
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8080;
server_name 127.0.0.1;
root /var/www/sample_app/public/;
passenger_enabled on;
}
}
运行
sbin/nginx -t
如果没有报错,那说明配置成功了。那么已经万事大吉了吗?并没有!!
配置Centos7防火墙
Centos7
后已经废弃了原来的
iptables
,改而使用
firewall
,默认情况下
centos7
系统不允许任何外来访问,就算你把
firewall
关了也没用,所以必须配置firewall
- -- --- --
这个命令表示,允许外部访问8080端口,重载一下
firewall
的配置,就外部就能访问服务器的8080端口了
配置Rails的生产环境
配置完
Centos7
的防火墙后,访问
rails
程序时就会报出一个403的forbidden错误,仔细查看日志后,发现了问题了的原因
App 6361 stderr: [ 2015-06-16 11:27:24.1412 6376/0x00000001d35760(Worker 1) utils.rb:85 ]: *** Exception RuntimeError in Rack application object (Missing `secret_token` and `secret_key_base` for 'production' environment, set these values in `config/secrets.yml`) (process 6376, thread 0x00000001d35760(Worker 1)):
这个错误表示
Rails
生产环境下的密钥没有配置。在
nginx
上跑
rails
一般只有在生产环境下才会使用,因而
passenger
默认下就是
rails
环境设置为生产环境,而
rails
初始化时默认没有对生产环境进行密钥配置。这时就需要我们自己去配置
rails
的密钥了
在
rails
的
Gemfile
中加入
gem 'dotenv-rails'
然后运行
bundle install
安装完这个
gem
后就可以配置我们的生产环境密钥了
首先在
sample_app
目录下建立一个
.env
文件
然后运行
rake secret
这个命令会随机生成一个安全密钥,将这个密钥复制下来,然后在
.env
中添加
SECRET_KEY_BASE = 你的密钥
最后修改sample_app目录下的config/secrets.yml
development:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
test:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
这样一来密钥配置就完成了,重启
nginx
就能成功访问到
rails
项目了