sinatra 不同於rails,是一個輕量級的ruby 框架,非常輕巧靈活。
基本用法如官網所述:
#!/usr/bin/env ruby require 'sinatra' get '/frank-says' do 'Put this in your pipe & smoke it!' end
默認會監聽在127.0.0.1:4567 ,可以稍加配置,如下:
#!/usr/bin/env ruby require 'sinatra' configure do set :bind, '0.0.0.0' set :port, '1234' end get '/frank-says' do 'Put this in your pipe & smoke it!' end
處理404 和 50x
#!/usr/bin/env ruby require 'sinatra' configure do set :bind, '0.0.0.0' set :port, '1234' end get '/frank-says' do 'Put this in your pipe & smoke it!' end not_found do status 404 "page not found" end error do 'Sorry there was a error - ' + env['sinatra.error'].messageend end
變量分爲自定義變量和內置變量,使用變量的辦法如下
#!/usr/bin/env ruby require 'sinatra' configure do set :bind, '0.0.0.0' set :port, '1234' end get '/frank' do name = "Frank" "hello #{name}" end get '/frank-says' do "your ip address is #{request.ip}" end
其他一些有用的內置變量如下:
request.body # 被客戶端設定的請求體(見下) request.scheme # "http" request.script_name # "/example" request.path_info # "/foo" request.port # 80 request.request_method # "GET" request.query_string # "" request.content_length # request.body的長度 request.media_type # request.body的媒體類型 request.host # "example.com" request.get? # true (其他動詞也具有類似方法) request.form_data? # false request["SOME_HEADER"] # SOME_HEADER header的值 request.referrer # 客戶端的referrer 或者 '/' request.user_agent # user agent (被 :agent 條件使用) request.cookies # 瀏覽器 cookies 哈希 request.xhr? # 這是否是ajax請求? request.url # "http://example.com/example/foo" request.path # "/example/foo" request.ip # 客戶端IP地址 request.secure? # false(如果是ssl則爲true) request.forwarded? # true (如果是運行在反向代理之後) request.env # Rack中使用的未處理的env哈希
爲了避免root運行的安全問題,可以切換一下身份(apache,uid 48)
#!/usr/bin/env ruby require 'sinatra' Process::UID.change_privilege(48) if Process.uid == 0 configure do set :bind, '0.0.0.0' set :port, '1234' end get '/frank-says' do "your ip address is #{request.ip}" end
採用ruby xxx.rb 的方式啓動sinatra程序,缺點是必須在前臺運行。
如果需要在後臺運行,可以採用supervisor,創建配置文件/etc/supervisor/conf.d/sinatra.conf,內容如下,僅供參考:
[program:sinatra] command=/usr/bin/ruby sinatra.rb process_name=%(program_name)s numprocs=1 directory=/data/ruby umask=022 priority=999 autostart=true user=apache redirect_stderr=true stdout_logfile=/var/log/sinatra/access.log stderr_logfile=/var/log/sinatra/error.log
附
CentOS7 安裝ruby + sinatra 環境
yum install ruby ruby-devel rubygems rubygem-rack gem install sinatra thin
ubuntu 16.04 安裝ruby + sinatra 環境
apt-get install ruby-sinatra ruby-sinatra-contrib thin
ps:官方推薦安裝thin,因爲它比默認的webrick性能更好,sinatra默認優先使用thin
update 2017-03-20
jruby效率高於ruby,如果使用jruby,由於thin是c擴展,jruby不支持,可以考慮在jruby中使用puma
,代碼如下:
#!/usr/bin/env ruby require 'sinatra' require 'puma' #switch to apache user if run as root Process::UID.change_privilege(48) if Process.uid == 0 configure do set :bind, '0.0.0.0' set :port, '4566' set :logging, 'log/sinatra.log' set :server, :puma end get '/' do "your ip address is #{request.ip}" end