Rails 如果只用 Thin 会有什么问题?

v2m · 2013年01月14日 · 最后由 shaogbi 回复于 2014年07月29日 · 6729 次阅读

当我在正式的发布环境中,只是简单的用 rails s thin 来开启我的程序,没有 nginx 或者 apache 等前端服务器(还是 rails 会给我一个默认的前端服务器?) 这样做的话,我的程序会有什么问题么?

同问 其实我也一直不知道 Apache Nginx 神马的在 Rack Server 前面都是干什么的

我看了看网上说法是,apache 之类的算是一个前端服务器,负责接受用户的请求,然后分发给 rails 进程处理 thin 之类的是个后端服务器,就是负责开启 rails 进程来处理了 应该要这么理解么?

  • 后端服务器对 https, 静态文件,send file 等服务效率没有 nginx 高
  • 可以开很多个后端做负载均衡
  • 重启后端的时候,前端服务器可以挂上"网站正在升级"之类的页面
  • 前端服务器还有不少有用的功能,例如匹配不同的域名,把请求派放到不同的后端服务器,或者限制单 ip 单位时间请求次数,或者简单的 ddos 防御... 而这些功能和模块效率往往比在 ruby 里实现的高

@luikore 就是说如果我仅仅只是 thin 的话,那么实际上只有一个后端,就是必须是一个请求处理完毕了才能继续处理下一个 如果我使用了前端服务器的话,那么就可以开启多个后端,同时响应多个用户的请求? 如果只用 thin 的话,是不是当有很多用户同时请求的时候,就会有一些人会超时这样?

#4 楼 @v2m 你要是这样用话,前面放一个 varnish 最好

我这的生产环境用的是 nginx+thin,感觉各方面都不错,建议尝试

@kingwkb 不是要这么用,只是想问问这么用的问题在哪,还有我对这些服务器的理解是不是有问题。

#7 楼 @v2m 访问量不大的话完全没有问题

还有个安全问题。要监听 80 端口需要 root 权限,如果 rails server 启动后没切换到低权限的用户,万一碰到代码注入什么的,直接都 root 权限了。

@kingwkb 这个不大是指什么情况呢?如果大的话,会有什么问题呢?

#10 楼 @v2m 大不大这个不好说,跟你的程序,硬件等等都有关系,你就看系统的资源使用情况,cpu,io,内存等等,高的话就算大了,不高都没事,哪个高了就优化哪个,不用担心,优化方案也有很多,最简单的直接上更好的硬件

#4 楼 @v2m 是的 thin 是多进程的,你不用负载均衡的 server,顶多就一个监听 80 端口,这样量大了肯定会超时,加 nginx,配置 upstream,nginx 就能帮你分发请求到多个 thin 的进程去了。

@kenshin54 就是说,如果只用了 thin,那么就相当于没有(无法?)利用到 thin 的多线程功能,其实也就相当于一个服务再跑,所有的请求都是同步阻塞的是吧

#14 楼 @v2m 提到多线程有几点,

  • thin 默认是以 EventMachine 来处理并发请求的,实际上是一个进程
  • thin 可以通过--thread 开启多线程,如果你是 rails 项目,那要先确定是否开启 threadsafe,如果不开,那开了多线程也没用,Rack::Lock 会加锁

@kenshin54 我知道 thin 实际上是异步的,就是如果我仅仅只用 rails s thin 命令的话,开起来 thread safe,那么,实际上,所有的请求(用户发给服务器的请求),都是同步阻塞的在处理,是么?

@kenshin54 有没有什么工具来测试服务器并发请求,有没有阻塞的工具的?

#16 楼 @v2m 刚刚开会去了 好像用 rails server 启动不会开启 thin 的多线程模式(不确定),要用thin start -e production --threaded 这种方式启动才行,不会是阻塞的

最简单用 ab 就能测啦

需要 登录 后方可回复, 如果你还没有账号请 注册新账号