使用 nginx 的意义
kaven276 edited this page Jun 30, 2016
·
4 revisions
首先看下三大 web 服务器(不包含基于node.js的)的比较 http://www.blogjava.net/daniel-tu/archive/2008/12/29/248883.html
https://www.nginx.com/blog/building-great-app-just-beginning-deliver-scale/
- nginx 比基于 node.js 的 http 服务效率更高
- reverse proxy 可以支持灵活的 cache 配置
- gzip
- 解放 noradle-http 的 http 协议处理开销
- 这样 oracle pl/sql servlet 只需要实现业务功能,省去压缩、缓存管理的负担
- nginx 作为统一的发布端口后台可以集成大量不同类型技术开发的后台服务
- CGI/SCGI/FCGI/WCGI
- reverse http proxy, support websocket
- 网站的静态文件部分可以直接使用 nginx 提供,并结合各种 cache/cdn 方案,达到性能最大化,可靠性更佳
- noradle 可以和其他技术(python,java,php...)一起挂接到 nginx 下,使用同一个域名、同一个端口服务
- 产生一定的 mashup 效果,具体的,通过 ajax 相同域名调用其他技术开发的 url
- 通过 fastcgi 协议,可以使用某种语言开发的 authorizer 控制用其他语言开发的 servlet 是否运行访问
- 基本功能 nginx 就有,不需要 nginx
- advanced load balancing 因为是由 noradle-dispatcher 完成 load balancing ,而不是 nginx,所以无需 nginx-plus
- session persistence
- 通过配置 nginx 传递指定 cookie 名字的值给 noradle-http 来实现
- 使用 signed-cookie 替代 session
- advanced cache control
- noradle-http 自带
- noradle-oracle-server 自带,在 db 内保存 cache
- 动态调整负载均衡
- noradle-dispatcher 架构本来就可以更佳动态的按照 client 分配并发数资源
- apache 从 2.2 开始才支持 event MPM,可以只用一个线程 hold 所有的 idle keep-alived connection,减少线程需求量,但是不保证线程安全,不保证稳定
- apache 从 2.4 开始才支持 mod-fastcgi
nodejs 接入可以通过 AOP stack 提供很多 不易在 nginx 实现(缺少像nodejs express/koa 那样的 AOP 栈), 也不易在 oracle 实现的的功能(只专注于数据处理)
- 上传文件到 nodejs 所在文件系统,plsql 应用代码可以控制保存的位置,名称
- plsql 代码可以精密控制响应是否走 gzip 压缩,而 nginx 只能按照固定的规则
- plsql 可以指示 nodejs 做原始结果集的 JSON 转换,这项工作既不方便在数据库内完成,nginx 也不支持(fastcgi不支持filter模式)
- 进一步,nginx 无法支持数据待定模板,这种高级工作必须在可编程的服务上完成
- nodejs 提供服务端会话数据库保持机制
不过,上述问题 nginx 直接接入 noradle-dispatcher 也能克服或者绕路过去
- noradle 直接支持 fastcgi 上传文件到数据库
- 普通 post 内容
- html表单文件上传,可能同时上传多个文件,采用 multipart 格式分隔
- 响应的压缩可能也不是非常需要可编码决定的灵活度要求
- noradle 输出的原始响应不转换 JSON 也不错
- 更低的网络流量
- 更少的服务端数据流处理量
- 完全可以在客户端做转换,而且对于javascript环境,不经 JSON,直接形成内存 javascript 数据
- 服务端模板都可以用客户端模板代替
- 有利于将服务端负载转移出来,降低中心压力,特别是对海量客户并发的情况
- 模板是静态化的,通过CDN提供,可以被缓存,不像融合在最终结果中每次都被重复发送
- 服务端会话其实不太需要
- 通常会话中记录的信息完全可以通过cookie实现
- 需要防伪的cookie可以通过服务端签名保证非伪造
- 无服务端会话才能支持集群服务