passenger
passenger
是一個能快速搭建web環境的工具,它能快速的將nginx
和passenger
部署到你的伺服器中,是部署ruby
環境就如同php環境那樣簡單快速,讓人愉悅。下面我將使用這個工具將一個幾乎空白的web伺服器打造成一個高效的ruby伺服器
centos7
centos7
是最新的centos版本帶來了一系列新特性,包括對Docker的支援和效能的提高,centos 6和 centos 7效能對比
安裝ruby環境
首先下載rvm
(ruby虛擬機器)
shell
curl -L get.rvm.io | bash -s stable
安裝rvm
shell
source /etc/profile.d/rvm.sh
安裝ruby
(請選擇官網上最新的版本,使用ruby
就要一直堅定的使用其最新版本)
shell
rvm install 2.2.1
安裝完成後只要執行ruby -v
有顯示版本號就證明已經安裝成功了
安裝Passenger 和 Nginx
首先使用gem
安裝passenger
shell
gem install passenger
由於nginx
不支援動態的模組載入,所以要使用passenger
來進行編譯安裝由passenger
修改過的nginx
接下來安裝nginx
+passenger
shell
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
shell
gem install rails
初始化一個rails
專案
shell
rails new sample_app
第一次初始化rails
時一般會報出缺少gem
的警告,此時只需要將rails
的映象改為淘寶映象,詳見http://ruby.taobao.org,然後執行
shell
bundle install
當執行完畢後,一個rails
專案的初始化就完成了
配置nginx
開啟配置檔案
vim /opt/nginx/conf/nginx.conf
這裡給出一份最簡單能執行的nginx.conf
(注意:rails專案的目錄是/opt/www)
nginx
{ 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; #web根目錄,一定是rails專案下的public root /var/www/sample_app/public/; #一定要記得將這個選項設定為on passenger_enabled on; } }
執行
shell
sbin/nginx -t
如果沒有報錯,那說明配置成功了。那麼已經萬事大吉了嗎?並沒有!!
配置Centos7防火牆
Centos7
後已經廢棄了原來的iptables
,改而使用firewall
,預設情況下centos7
系統不允許任何外來訪問,就算你把firewall
關了也沒用,所以必須配置firewall
shell
firewall-cmd --zone=public --add-port=8080/tcp --permanent
這個命令表示,允許外部訪問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
中加入
ruby
gem `dotenv-rails`
然後執行
shell
bundle install
安裝完這個gem
後就可以配置我們的生產環境金鑰了
首先在sample_app
目錄下建立一個.env
檔案
然後執行
shell
rake secret
這個命令會隨機生成一個安全金鑰,將這個金鑰複製下來,然後在.env
中新增
ruby
SECRET_KEY_BASE = 你的金鑰
最後修改sample_app目錄下的config/secrets.yml
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
專案了