- 浏览: 4825301 次
- 性别:
- 来自: 上海
博客专栏
-
robbin谈管理
浏览量:137386
文章分类
最新评论
-
xly1981:
领导者是团队的灵魂。深入一线的过程,包括代码review,能帮 ...
robbin谈管理:改造团队的经验(2) -
jiehuangwei:
像这种总结比较性的ppt文档可以多发啊
Web并发模型粗浅探讨 -
linux1308:
看完学习到了很多东西,感谢推荐!
推荐一篇很好的RoR部署方案性能评测 -
zweite:
直接对搜索的结果进行缓存是不是会更快一点呢
漫谈应用缓存的命中率问题 -
kaogua:
现在已经是ruby2.0了, 不知道这个的效率是怎么样的, 是 ...
Ruby作为服务器端应用已经成熟了
传统的Web服务器在处理文件下载的时候,总是先读入文件内容到应用程序内存,然后再把内存当中的内容发送给客户端浏览器。这种方式在应付当今大负载网站,音频视频网站力不从心。sendfile是现代操作系统支持的一种高性能网络IO方式,操作系统内核的sendfile调用可以将文件内容直接推送到网卡的buffer当中,从而避免了Web服务器读写文件的开销,实现了“零拷贝”模式。
作为最流行的轻量级Web服务器的翘楚,lighttpd提供了良好的sendfile支持,JavaEye网站服务器使用的就是lighttpd。在Linux操作系统上面,只需要在lighttpd.conf配置文件如下配置,lighttpd就会使用sendfile方式处理静态资源的下载,效率非常高:
但是在某些情况下,我们却无法直接让lighttpd处理文件的下载,比方说JavaEye网站需要统计帖子附件的下载次数,博客相册的点击次数,比方说需要对下载的文件进行权限的控制,特别是对于一些多用户系统,你不能让用户上传的私密文件被其他用户随便下载到,例如JavaEye圈子的共享文件不能够对圈子外的用户开放下载。因此,文件下载目录千万不能放到public目录下,不能让用户直接通过浏览器的URL地址访问到。在这种情况下,文件下载必须由服务器端应用程序来处理。
在RoR应用当中,我们可以在controller中使用send_file方法来控制文件的下载。send_file方法将下载的文件以4KB为单位写到一个输出流去。如果我们使用mongrel应用服务器的话,mongrel会在内存当中创建一个StringIO对象,把整个下载文件完整的读入内存,然后再向客户端或者前端的Web服务器写出。如果我们使用fcgi来运行RoR的话,fcgi会直接把输出流的内容向前端的Web服务器写出。
毫无疑问,我们可以看到这种下载处理方式有很大的性能缺陷:
1、当使用mongrel的时候,如果下载文件很大,会导致mongrel内存暴涨!
mongrel创建一个StringIO对象缓存整个输出内容,我们假设用户下载的是一个100MB的文件,该用户又很喜欢用多线程下载工具,他开了10个线程并发下载,那么mongrel的内存占用会暴涨1GB以上。而且最可怕的是,即使当用户下载结束以后,mongrel的内存都不会迅速回落,而是一直保持如此高的内存占用。这个缺陷非常容易被别有用心的黑客利用,攻击网站。这也是JavaEye网站为什么始终不用mongrel的原因之一。
2、当使用fcgi的时候,如果前端Web服务器没有足够大buffer,会导致fcgi进程被挂住
fcgi自己不开output buffer,而是实时写出输出内容,如果前端Web服务器用的是lighttpd,那么你很幸运,lighttpd会照单全收,一个字节都不拉下;如果前端Web服务器用的是nginx/apache,那么你很不幸,nginx/apache默认只开8K的buffer,收不下的那就对不起了,您慢点嘞,fcgi进程就被挂住了,只要客户端浏览器下载不结束,fcgi进程就被一直占用。
3、即使使用lighttpd+fcgi,也会对服务器造成不小的性能开销
lighttpd+fcgi是最理想的Rails部署环境,JavaEye网站使用的就是lighttpd+fcgi。当ruby程序执行send_file开始下载的时候,fcgi会以4KB为单位读入文件内容,然后立刻写出到lighttpd去,而lighttpd照单全收。因此当下载文件被完整的通过fcgi被flush到lighttpd的内存里面去以后,即使你杀掉fcgi进程,都丝毫不会影响文件下载。
也许你会问,lighttpd都吃下来文件内容,内存会不会暴涨?会的,我们假设同样的用户场景,某用户启动10个线程下载100MB的文件,fcgi进程内存不会发生变化,但是lighttpd会暴涨1GB。但所幸的是lighttpd的内存管理的不错,一旦用户取消下载,或者下载完毕,lighttpd立刻释放掉1GB的内存。
但是无论怎么说,ruby还是需要完整的读取下载文件,而lighttpd也需要开辟足够大的内存,处理整个文件的下载过程,对服务器开销还是很大的。我们的问题是,能不能让带权限控制的文件下载像lighttpd下载静态资源文件那样快,开销那样小呢?答案就是X-sendfile!
使用X-sendfile方式,服务器端应用程序不需要读取下载文件了,只需要设置response的header信息就足够了,此外还要附加一个信息“X-LIGHTTPD-send-file”信息给lighttpd,告诉lighttpd,文件下载我就不管了,你自己看着办吧:
X-LIGHTTPD-send-file告诉lighttpd,去硬盘的哪个路径找要下载的文件,最后一行啥都不输出了,下载不用ruby来管了。
而lighttpd收到X-LIGHTTPD-send-file信息以后,就会找到硬盘该文件,以静态资源文件的下载方式处理,丝毫不消耗lighttpd的内存。还是以某用户启动10个线程下载100MB文件为例,10个fcgi进程发送了response信息就处理完毕了,而lighttpd知道下载的是硬盘的静态文件,会以sendfile方式下载,文件内容就会被操作系统内核直接送到网卡的buffer里面,既不消耗ruby进程,也不消耗lighttpd,皆大欢喜。
在lighttpd-1.4.18版本里面,fastcgi方式已经内置X-sendfile支持,仅仅需要你在配置文件打开就可以了:
JavaEye网站在使用了X-sendfile功能之后,lighttpd的内存占用有明显的下降。未使用X-sendfile之前,lighttpd有时候内存占用会到200MB以上(有用户多线程下载附件),在使用X-sendfile之后,lighttpd的内存占用还从未突破20MB。
最后要提醒大家几个问题:
1、lighttpd-1.4.x不认X-sendfile这个header,只认X-LIGHTTPD-send-file
按照lighttpd网站自己的文档,以及各种各样流行的X-sendfile文档,设置的header都是X-sendfile,但是经过我们n次失败的摸索,才发现原来必须使用X-LIGHTTPD-send-file,这一点请不要被文档迷惑,目前好像也只有我们提出这个解决办法,互联网上面尚未看到其他人提出过,看来我们又首开先河了。用RoR就是这点好,你动不动就得自己先去当尝螃蟹的那个人。
2、lighttpd-1.5.0版本的X-sendfile设置有所改变
lighttpd-1.5.0版本还未发布正式版本,据说1.5.0已经认识X-sendfile这个header了,这个大家有兴趣自己测试吧。
不知道为什么,我用的是rails 2.0.2,根据robbin的写法修改了rails的BUG,但是虽然在下载时正确显示了文件的大小,但下载下来还是1KB,如果去掉BUG的修正,下载时显示的就是1KB,显示BUG修正起作用啦,不知robbin能否指导一下,先谢谢啦!
rails新版本已经修复了bug,不再需要补丁了。
没有,如果不使用您提供的Bug fix,在下载时显示文件的信息就不对,无论什么文件都显示大小为1K,如果使用了Bug fix,下载前显示对了,但下载结果是1K,我也查了response.rb文件的内容,显示如下:
# Don't set the Content-Length for block-based bodies as that would mean reading it all into memory. Not nice
# for, say, a 2GB streaming file.
def set_content_length!
self.headers["Content-Length"] = body.size unless body.respond_to?(:call)
end
好象还没有修正BUG,我使用的Rails版本为2.0.2,lighttpd的版本是1.4.19,真让人郁闷!
不知道为什么,我用的是rails 2.0.2,根据robbin的写法修改了rails的BUG,但是虽然在下载时正确显示了文件的大小,但下载下来还是1KB,如果去掉BUG的修正,下载时显示的就是1KB,显示BUG修正起作用啦,不知robbin能否指导一下,先谢谢啦!
rails新版本已经修复了bug,不再需要补丁了。
另外,比如friendly url。/attachments/uuid_of_file,backend用来指明真实的/internal/hash/file。想请教一下 robbin,若没有其他附加功能(下载点击次数/权限),你会如何最有效的确定具体的hash呢(不再从数据库获取)?
/attachments/uuid_of_file,像这样的URL,我们就是直接根据uuid查数据库,取得file,然后X-sendfile出去。我觉得这个地方根据唯一索引查单条记录,数据库没什么开销,Ruby端执行也没啥开销。
这个不一定是 lighttpd 问题,隐约看到 lighttpd 对阻塞的 stat() 进行了优化。
另外还有 X-LIGHTTPD-send-tempfile 的方式,对下载一些需要保密隐私的文件很有帮助。
还有就是,在 lighttpd 的 blog 上曾经有个测试,当要发送的文件大于16k的时候,性能才会有提高。
我们目前还没有在用2.0,从ticket上看这个fix还是今天刚放上来的,真是巧阿
作为最流行的轻量级Web服务器的翘楚,lighttpd提供了良好的sendfile支持,JavaEye网站服务器使用的就是lighttpd。在Linux操作系统上面,只需要在lighttpd.conf配置文件如下配置,lighttpd就会使用sendfile方式处理静态资源的下载,效率非常高:
引用
server.network-backend = "linux-sendfile"
但是在某些情况下,我们却无法直接让lighttpd处理文件的下载,比方说JavaEye网站需要统计帖子附件的下载次数,博客相册的点击次数,比方说需要对下载的文件进行权限的控制,特别是对于一些多用户系统,你不能让用户上传的私密文件被其他用户随便下载到,例如JavaEye圈子的共享文件不能够对圈子外的用户开放下载。因此,文件下载目录千万不能放到public目录下,不能让用户直接通过浏览器的URL地址访问到。在这种情况下,文件下载必须由服务器端应用程序来处理。
在RoR应用当中,我们可以在controller中使用send_file方法来控制文件的下载。send_file方法将下载的文件以4KB为单位写到一个输出流去。如果我们使用mongrel应用服务器的话,mongrel会在内存当中创建一个StringIO对象,把整个下载文件完整的读入内存,然后再向客户端或者前端的Web服务器写出。如果我们使用fcgi来运行RoR的话,fcgi会直接把输出流的内容向前端的Web服务器写出。
毫无疑问,我们可以看到这种下载处理方式有很大的性能缺陷:
1、当使用mongrel的时候,如果下载文件很大,会导致mongrel内存暴涨!
mongrel创建一个StringIO对象缓存整个输出内容,我们假设用户下载的是一个100MB的文件,该用户又很喜欢用多线程下载工具,他开了10个线程并发下载,那么mongrel的内存占用会暴涨1GB以上。而且最可怕的是,即使当用户下载结束以后,mongrel的内存都不会迅速回落,而是一直保持如此高的内存占用。这个缺陷非常容易被别有用心的黑客利用,攻击网站。这也是JavaEye网站为什么始终不用mongrel的原因之一。
2、当使用fcgi的时候,如果前端Web服务器没有足够大buffer,会导致fcgi进程被挂住
fcgi自己不开output buffer,而是实时写出输出内容,如果前端Web服务器用的是lighttpd,那么你很幸运,lighttpd会照单全收,一个字节都不拉下;如果前端Web服务器用的是nginx/apache,那么你很不幸,nginx/apache默认只开8K的buffer,收不下的那就对不起了,您慢点嘞,fcgi进程就被挂住了,只要客户端浏览器下载不结束,fcgi进程就被一直占用。
3、即使使用lighttpd+fcgi,也会对服务器造成不小的性能开销
lighttpd+fcgi是最理想的Rails部署环境,JavaEye网站使用的就是lighttpd+fcgi。当ruby程序执行send_file开始下载的时候,fcgi会以4KB为单位读入文件内容,然后立刻写出到lighttpd去,而lighttpd照单全收。因此当下载文件被完整的通过fcgi被flush到lighttpd的内存里面去以后,即使你杀掉fcgi进程,都丝毫不会影响文件下载。
也许你会问,lighttpd都吃下来文件内容,内存会不会暴涨?会的,我们假设同样的用户场景,某用户启动10个线程下载100MB的文件,fcgi进程内存不会发生变化,但是lighttpd会暴涨1GB。但所幸的是lighttpd的内存管理的不错,一旦用户取消下载,或者下载完毕,lighttpd立刻释放掉1GB的内存。
但是无论怎么说,ruby还是需要完整的读取下载文件,而lighttpd也需要开辟足够大的内存,处理整个文件的下载过程,对服务器开销还是很大的。我们的问题是,能不能让带权限控制的文件下载像lighttpd下载静态资源文件那样快,开销那样小呢?答案就是X-sendfile!
使用X-sendfile方式,服务器端应用程序不需要读取下载文件了,只需要设置response的header信息就足够了,此外还要附加一个信息“X-LIGHTTPD-send-file”信息给lighttpd,告诉lighttpd,文件下载我就不管了,你自己看着办吧:
response.headers['Content-Type'] = @attachment.content_type response.headers['Content-Disposition'] = "attachment; filename=\"#{URI.encode(@attachment.filename)}\"" response.headers['Content-Length'] = @attachment.size response.headers["X-LIGHTTPD-send-file"] = @attachment.public_filename render :nothing => true
X-LIGHTTPD-send-file告诉lighttpd,去硬盘的哪个路径找要下载的文件,最后一行啥都不输出了,下载不用ruby来管了。
而lighttpd收到X-LIGHTTPD-send-file信息以后,就会找到硬盘该文件,以静态资源文件的下载方式处理,丝毫不消耗lighttpd的内存。还是以某用户启动10个线程下载100MB文件为例,10个fcgi进程发送了response信息就处理完毕了,而lighttpd知道下载的是硬盘的静态文件,会以sendfile方式下载,文件内容就会被操作系统内核直接送到网卡的buffer里面,既不消耗ruby进程,也不消耗lighttpd,皆大欢喜。
在lighttpd-1.4.18版本里面,fastcgi方式已经内置X-sendfile支持,仅仅需要你在配置文件打开就可以了:
引用
"allow-x-send-file"="enable"
JavaEye网站在使用了X-sendfile功能之后,lighttpd的内存占用有明显的下降。未使用X-sendfile之前,lighttpd有时候内存占用会到200MB以上(有用户多线程下载附件),在使用X-sendfile之后,lighttpd的内存占用还从未突破20MB。
最后要提醒大家几个问题:
1、lighttpd-1.4.x不认X-sendfile这个header,只认X-LIGHTTPD-send-file
按照lighttpd网站自己的文档,以及各种各样流行的X-sendfile文档,设置的header都是X-sendfile,但是经过我们n次失败的摸索,才发现原来必须使用X-LIGHTTPD-send-file,这一点请不要被文档迷惑,目前好像也只有我们提出这个解决办法,互联网上面尚未看到其他人提出过,看来我们又首开先河了。用RoR就是这点好,你动不动就得自己先去当尝螃蟹的那个人。
2、lighttpd-1.5.0版本的X-sendfile设置有所改变
lighttpd-1.5.0版本还未发布正式版本,据说1.5.0已经认识X-sendfile这个header了,这个大家有兴趣自己测试吧。
评论
15 楼
frogxj
2008-12-12
问题解决了,主要是在response.headers["X-LIGHTTPD-send-file"] = @attachment.public_filename这一行,public_filename只给出了文件的相对路径,而lighttpd4.19好像不会把相对路径加上应用的主目录而得到文件的全部路径而出现错误。另外,rails2.0.2确实修正了Bug,谢谢robbin!
14 楼
frogxj
2008-12-11
robbin 写道
frogxj 写道
不知道为什么,我用的是rails 2.0.2,根据robbin的写法修改了rails的BUG,但是虽然在下载时正确显示了文件的大小,但下载下来还是1KB,如果去掉BUG的修正,下载时显示的就是1KB,显示BUG修正起作用啦,不知robbin能否指导一下,先谢谢啦!
rails新版本已经修复了bug,不再需要补丁了。
没有,如果不使用您提供的Bug fix,在下载时显示文件的信息就不对,无论什么文件都显示大小为1K,如果使用了Bug fix,下载前显示对了,但下载结果是1K,我也查了response.rb文件的内容,显示如下:
# Don't set the Content-Length for block-based bodies as that would mean reading it all into memory. Not nice
# for, say, a 2GB streaming file.
def set_content_length!
self.headers["Content-Length"] = body.size unless body.respond_to?(:call)
end
好象还没有修正BUG,我使用的Rails版本为2.0.2,lighttpd的版本是1.4.19,真让人郁闷!
13 楼
robbin
2008-12-10
frogxj 写道
不知道为什么,我用的是rails 2.0.2,根据robbin的写法修改了rails的BUG,但是虽然在下载时正确显示了文件的大小,但下载下来还是1KB,如果去掉BUG的修正,下载时显示的就是1KB,显示BUG修正起作用啦,不知robbin能否指导一下,先谢谢啦!
rails新版本已经修复了bug,不再需要补丁了。
12 楼
frogxj
2008-12-10
不知道为什么,我用的是rails 2.0.2,根据robbin的写法修改了rails的BUG,但是虽然在下载时正确显示了文件的大小,但下载下来还是1KB,如果去掉BUG的修正,下载时显示的就是1KB,显示BUG修正起作用啦,不知robbin能否指导一下,先谢谢啦!
11 楼
robbin
2008-01-16
引用
另外,比如friendly url。/attachments/uuid_of_file,backend用来指明真实的/internal/hash/file。想请教一下 robbin,若没有其他附加功能(下载点击次数/权限),你会如何最有效的确定具体的hash呢(不再从数据库获取)?
/attachments/uuid_of_file,像这样的URL,我们就是直接根据uuid查数据库,取得file,然后X-sendfile出去。我觉得这个地方根据唯一索引查单条记录,数据库没什么开销,Ruby端执行也没啥开销。
10 楼
sorphi
2008-01-16
X-Accel-Redirect比X-sendfile的命名更加体现这一技术的实质:backend处理完毕之后在header中设置internal path以便frontend进行internal redirect. 利用内核的sendfile特性进行accelerate只是一个水到渠成的应用。
我在nginx+php(fastcgi)中,nginx并不一定需要设置internal,只需要php script正确设置了X-Accel-Redirect头即可。当然,我的场景是对internal path并不需要保护。
apache在没有第三方mod时,其RewriteMap也能简陋得达到这一效果(外部重写程序),但是明显没有X-Accel-Redirect灵活。
X-Accel-Redirect的用途很多,象robbin说的
另外,比如friendly url。/attachments/uuid_of_file,backend用来指明真实的/internal/hash/file。想请教一下robbin,若没有其他附加功能(下载点击次数/权限),你会如何最有效的确定具体的hash呢(不再从数据库获取)?
我在nginx+php(fastcgi)中,nginx并不一定需要设置internal,只需要php script正确设置了X-Accel-Redirect头即可。当然,我的场景是对internal path并不需要保护。
apache在没有第三方mod时,其RewriteMap也能简陋得达到这一效果(外部重写程序),但是明显没有X-Accel-Redirect灵活。
X-Accel-Redirect的用途很多,象robbin说的
robbin 写道
但是在某些情况下,我们却无法直接让lighttpd处理文件的下载,比方说JavaEye网站需要统计帖子附件的下载次数,博客相册的点击次数,比方说需要对下载的文件进行权限的控制,特别是对于一些多用户系统,你不能让用户上传的私密文件被其他用户随便下载到,例如JavaEye圈子的共享文件不能够对圈子外的用户开放下载。因此,文件下载目录千万不能放到public目录下,不能让用户直接通过浏览器的URL地址访问到。在这种情况下,文件下载必须由服务器端应用程序来处理。
另外,比如friendly url。/attachments/uuid_of_file,backend用来指明真实的/internal/hash/file。想请教一下robbin,若没有其他附加功能(下载点击次数/权限),你会如何最有效的确定具体的hash呢(不再从数据库获取)?
9 楼
whisper
2008-01-14
internal不是问题吧
用到X-Accel-Redirect的地方又不是很多
用到X-Accel-Redirect的地方又不是很多
8 楼
catoc
2008-01-14
引用
而lighttpd在处理X-sendfile的时候也明显大脑进水,它不会根据硬盘文件的实际长度来确定Content-Length,而是顽固的相信 Rails告诉他的Content-Length就是1KB,最后我们会悲哀的发现下载文件只有1KB,而且是下载文件的第一个字符。
这个不一定是 lighttpd 问题,隐约看到 lighttpd 对阻塞的 stat() 进行了优化。
另外还有 X-LIGHTTPD-send-tempfile 的方式,对下载一些需要保密隐私的文件很有帮助。
还有就是,在 lighttpd 的 blog 上曾经有个测试,当要发送的文件大于16k的时候,性能才会有提高。
7 楼
QuakeWang
2008-01-13
myxex 写道
http://dev.rubyonrails.org/ticket/7643
Edge 版本中似乎已修正X-sendfile的bug。
Edge 版本中似乎已修正X-sendfile的bug。
我们目前还没有在用2.0,从ticket上看这个fix还是今天刚放上来的,真是巧阿
6 楼
myxex
2008-01-13
http://dev.rubyonrails.org/ticket/7643
Edge 版本中似乎已修正X-sendfile的bug。
Edge 版本中似乎已修正X-sendfile的bug。
5 楼
swachian
2008-01-13
不错,最近正在学习部署这方面的东西。
4 楼
sw2wolf
2008-01-13
非常感谢!
3 楼
grayblur
2008-01-13
受教了。。。就等着robbin大哥的文章了
2 楼
Jonney
2008-01-13
又一篇强文!
1 楼
robbin
2008-01-12
补充几句:
1、lighttpd-1.4.18仅支持fastcgi情况下的X-sendfile,而1.5.0版本则支持各种情况包括fastcgi, scgi, http proxy, ajp等协议下的X-sendfile
2、apache不支持X-sendfile,可以通过第三方mod添加支持,但据说不太好用
3、nginx有类似lighttpd的X-sendfile,叫做X-Accel-Redirect,但是使用的限制比较大,必须实现在nginx上面配置到某个目录下的文件才具备这样的功能,而不像lighttpd,任意目录文件不需要配置都可以支持,因而很受人批评。
当然,我还是推荐大家使用lighttpd+fcgi,这是性能最佳Rails方案,我会另外写文章剖析Rails部署方案的优劣。
1、lighttpd-1.4.18仅支持fastcgi情况下的X-sendfile,而1.5.0版本则支持各种情况包括fastcgi, scgi, http proxy, ajp等协议下的X-sendfile
2、apache不支持X-sendfile,可以通过第三方mod添加支持,但据说不太好用
3、nginx有类似lighttpd的X-sendfile,叫做X-Accel-Redirect,但是使用的限制比较大,必须实现在nginx上面配置到某个目录下的文件才具备这样的功能,而不像lighttpd,任意目录文件不需要配置都可以支持,因而很受人批评。
当然,我还是推荐大家使用lighttpd+fcgi,这是性能最佳Rails方案,我会另外写文章剖析Rails部署方案的优劣。
发表评论
-
《松本行弘的程序世界》推荐序
2011-07-21 13:47 15295在流行的编程语言中,ruby是一个比较另类的存在,这是因为大多 ... -
从Rails聊聊小公司的研发团队建设
2011-03-23 10:49 37229首先分享一点数据吧: JavaEye的PV到了140万了,一 ... -
Ruby作为服务器端应用已经成熟了
2009-11-17 14:55 15966JavaEye网站在过去的Ruby on rails实践当中, ... -
基于资源的HTTP Cache的实现介绍
2009-09-05 00:27 17073我们都知道浏览器会缓 ... -
请注意Rails2.3自带的memcache-client有性能问题
2009-03-23 18:05 14507Rails2.3版本发布了,这个版本内部的改动非常大,相关介绍 ... -
监视Rails进程内存泄漏的技巧
2008-12-30 21:56 10971Rails应用比较容易遇到的两类性能问题:一类是Rails执行 ... -
ruby MBARI大补丁性能评测报告
2008-12-23 12:19 5073JavaEye之前的新闻ruby内存泄漏的罪魁祸首 - 幽灵指 ... -
在top监视窗口显示Rails当前正在执行的请求URL
2008-12-01 14:15 9861这是一个从PragDave的博客上面学来的技巧,很实用,很co ... -
对Ruby VM的GC的思考
2008-09-02 23:41 8984Ruby虽然是动态脚本语言 ... -
推荐一篇很好的RoR部署方案性能评测
2008-07-08 11:55 9672今年年初的时候,我写了一篇RoR部署方案深度剖析的文章,分析了 ... -
Ruby和Rails的缺点
2008-06-25 21:08 17408有人说,robbin你说了那么多RoR的优点,你啥时候说说Ro ... -
Skynet --- ruby的类Google Map/Reduce框架
2008-06-02 00:39 8302Skynet是一个很响亮的名 ... -
rmmseg-cpp - 简洁高效的ruby中文分词程序
2008-05-27 00:47 11241我在前一篇文章向大家 ... -
使用libmmseg实现Ruby的中文分词功能
2008-05-24 21:43 11335用Ruby on Rails开发web2.0网站的人都知道,r ... -
mod_rails尝鲜
2008-04-13 14:32 8085Passenger(俗称mod_rails)是 ... -
Lighttpd和RoR安装配置的疑难解答
2008-03-07 11:09 14866之前写过一篇在Linux平 ... -
JavaEye网站的RoR性能优化经验谈
2008-01-20 16:11 18466JavaEye网站从2006年9月11 ... -
RoR部署方案深度剖析
2008-01-14 03:10 14805RoR的部署方案可谓五花八门,有Apache/Fastcgi方 ... -
Ruby为什么会受程序员的欢迎?
2008-01-07 20:08 15753孟岩最近写了一篇博客 ... -
Ruby on Rails 2.0的新特性介绍
2007-12-10 21:32 15632万众瞩目的Ruby on Rails 2.0已经发布了,Rai ...
相关推荐
8. **缓存控制**:通过mod_magnet模块,可以实现静态资源的缓存,提升网站性能。 9. **服务器限制**:如最大连接数、超时时间等,用于控制服务器资源的使用。 在安装并解压提供的"lighttpd"压缩包后,你需要根据...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
这一步通常需要编写SQL脚本或利用ETL(Extract, Transform, Load)工具,如SSIS(SQL Server Integration Services),将ASP.NET数据库中的数据迁移到新的ROR数据库中。在处理过程中需要注意数据类型转换,因为不同...
### ROR 文件的上传与下载:深入解析与实践 在Ruby on Rails(简称ROR)框架下,处理文件的上传与下载是一项常见的需求,尤其是在构建包含媒体内容的应用程序时。本文将基于给定的文件信息,详细阐述如何在Rails...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
在本篇"ror培训第4天 -model1"中,我们聚焦于Model中的Active Record,这是一个强大的对象关系映射(ORM)工具,使得开发者可以使用Ruby语言来操作数据库,而无需直接编写SQL语句。 Active Record的迁移...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
RoR(Ruby on Rails)是...每个环节的优化都能显著提升网站的运行效率,使RoR应用能够更好地应对高负载和大规模用户的需求。通过学习和实践这些经验,开发者可以更好地应对RoR性能挑战,创建出更健壮、高效的Web应用。
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
ROR--2015--Spring 您好,欢迎来到 The IronYard 的 Ruby on Rails! 您现在正在阅读的内容称为README文件。 软件项目通常在项目的主目录中有一个这样的文件来解释项目是什么以及如何使用它。 README也经常出现在...
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,亲测可用。使用rpm -ivh [rpm完整包名] 进行安装
Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来,支持多种数据库,有不少自己独特的功能,例如提供wiki、新闻台等,还可以集成其他版本管理...
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装
官方离线安装包,测试可用。使用rpm -ivh [rpm完整包名] 进行安装