sinatra 不同于rails,是一个轻量级的ruby 框架,非常轻巧灵活。


基本用法如官网所述:

#!/usr/bin/envrubyrequire'sinatra'get'/frank-says'do'Putthisinyourpipe&smokeit!'end


默认会监听在127.0.0.1:4567 ,可以稍加配置,如下:

#!/usr/bin/envrubyrequire'sinatra'configuredoset:bind,'0.0.0.0'set:port,'1234'endget'/frank-says'do'Putthisinyourpipe&smokeit!'end


处理404 和 50x

#!/usr/bin/envrubyrequire'sinatra'configuredoset:bind,'0.0.0.0'set:port,'1234'endget'/frank-says'do'Putthisinyourpipe&smokeit!'endnot_founddostatus404"pagenotfound"enderrordo'Sorrytherewasaerror-'+env['sinatra.error'].messageendend



变量分为自定义变量和内置变量,使用变量的办法如下

#!/usr/bin/envrubyrequire'sinatra'configuredoset:bind,'0.0.0.0'set:port,'1234'endget'/frank'doname="Frank""hello#{name}"endget'/frank-says'do"youripaddressis#{request.ip}"end



其他一些有用的内置变量如下:

request.body#被客户端设定的请求体(见下)request.scheme#"http"request.script_name#"/example"request.path_info#"/foo"request.port#80request.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?#falserequest["SOME_HEADER"]#SOME_HEADERheader的值request.referrer#客户端的referrer或者'/'request.user_agent#useragent(被: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/envrubyrequire'sinatra'Process::UID.change_privilege(48)ifProcess.uid==0configuredoset:bind,'0.0.0.0'set:port,'1234'endget'/frank-says'do"youripaddressis#{request.ip}"end


采用ruby xxx.rb 的方式启动sinatra程序,缺点是必须在前台运行。

如果需要在后台运行,可以采用supervisor,创建配置文件/etc/supervisor/conf.d/sinatra.conf,内容如下,仅供参考:

[program:sinatra]command=/usr/bin/rubysinatra.rbprocess_name=%(program_name)snumprocs=1directory=/data/rubyumask=022priority=999autostart=trueuser=apacheredirect_stderr=truestdout_logfile=/var/log/sinatra/access.logstderr_logfile=/var/log/sinatra/error.log


CentOS7 安装ruby + sinatra 环境

yuminstallrubyruby-develrubygemsrubygem-rackgeminstallsinatrathin

ubuntu 16.04 安装ruby + sinatra 环境

apt-getinstallruby-sinatraruby-sinatra-contribthin


ps:官方推荐安装thin,因为它比默认的webrick性能更好,sinatra默认优先使用thin


update 2017-03-20

jruby效率高于ruby,如果使用jruby,由于thin是c扩展,jruby不支持,可以考虑在jruby中使用puma

,代码如下:

#!/usr/bin/envrubyrequire'sinatra'require'puma'#switchtoapacheuserifrunasrootProcess::UID.change_privilege(48)ifProcess.uid==0configuredoset:bind,'0.0.0.0'set:port,'4566'set:logging,'log/sinatra.log'set:server,:pumaendget'/'do"youripaddressis#{request.ip}"end