Nginx + Apache + Tomcat架构方式,为什么需要Apache?Apache的作用?

Nathans 发布于 2014/11/06 10:15
阅读 9K+
收藏 5

Nginx:一款能承受高并发的HTTP服务器,异步的,多个连接(万级别)可以对应一个进程,进行响应。基于事件驱动模型。

Nginx优点:负载均衡、反向代理、处理静态文件优势。

Apache:相对于Nginx来说,同步多进程模型,一个连接对一个进程方式处理请求。在速度上和消耗来说,Apache不能承受高并发,会导致宕机。

Apache优点:相对于Tomcat服务器来说处理静态文件是它的优势,速度快。Apache是静态解析,适合静态HTML、图片等。相对于Nginx来说,Nginx配置简洁,简单配置负载均衡,而Apache配置复杂。Nginx处理静态文件的性能也优于Apache,Apache提供的组件比Nginx多,

Tomcat:动态解析容器,处理动态请求,是编译JSP\Servlet的容器。

Tomcat优势:处理动态请求,以线程的方式处理请求。

Nginx有动态分离机制,静态请求直接就可以通过Nginx处理,动态请求才转发请求到后台交由Tomcat进行处理。

但为什么还需要使用Apache呢?好处在哪?


加载中
1
开源中国董事会主席
开源中国董事会主席

没好处

如果多台后端服务器的话。动静分离了 我会 N + T

如果没有动静分离的话,我回 N + N + T

Nathans
Nathans
回复 @开源中国董事会主席 : 或许吧,但我觉得可以不用A。
开源中国-首席生育师
开源中国-首席生育师
我操,主席。
开源中国董事会主席
开源中国董事会主席
回复 @Damn : 加设 A机是入口那么N就只做反向代理,转发到B机和C机(假设后端只有两台),B机、C机上 N 就只处理项目中的静态文件、T 处理 Servlet。你说的还有 A 可能是历史问题
xyxo
xyxo
回复 @Damn : 确定大多数如此?新上架的项目还依然如此吗? 有没有可能是原有项目技术架构的一种过渡状态呢?
下一页
1
CheckStyle
CheckStyle
很简单啊,很多所谓的架构师,对这些东西懵懵懂懂的,老习惯就是Apache+Tomcat,觉得AJP就是王道。现在又听说Nginx很叼,于是乎就在前面加一个Nginx
0
酷酷的就
Nathans
Nathans
Java
0
jobell
jobell

nginx 应该是用来做负载的。apache用来处理静态文件外加mod_jk 做tomcat的集群。
nginx的负载应该是采用ip_hash模式,要不然session无法处理。

Nathans
Nathans
nginx和apache同样可以处理静态文件,但nginx处理静态请求的速度高于apache。 同时,Nginx可以做负载均和和请求分发,同时还能承受高并发,同样也可以和Tomcat做集群啊。
0
Grrrr
Grrrr

第一种可能:apache用来做静态服务器,而nginx只是做了一下负载均衡。

第二种可能:nginx做了静态服务器,负载均衡。apache来做一个中间层,用来检测请求,并做一些校验,和攻击防护,比加CSRF校验,防slow HTTP denial.这些只需要在apache加一个module即可,而真正的后台Tomcat只需要关注逻辑处理即可。

Nathans
Nathans
回复 @Grrrr : 多交流,才会进步么。
Nathans
Nathans
回复 @Grrrr : 纯属探讨而已。不是我用了这个脑残的设计,是人家就是这样架的,所以产生疑问。
Grrrr
Grrrr
回复 @Damn : 首先你不用反驳我,因为我根本不会用这种脑残的架构,我只是看到这个帖子的标题问‘为什么需要用apache’,才回你这个帖子的。我把我认为用apache的可能性说出来。我的回答是建立在你用了这个脑残的设计上的。
Nathans
Nathans
第二种可能反驳:你是让nginx做静态服务器?此时做动静分离吗?如果不做动静分离,只让nginx承受前段高并发,静态请求交由Apache做效验和攻击防护等,这只是静态请求,可以写一个module交由nginx,nginx 的fileter同样可以实现。如果做动静分离,apache没有任何作用
Nathans
Nathans
第一种可能反驳:nginx的处理静态请求的性能优于apache,因为单进程处理(万级别)请求,而apache是同步多进程。nginx同样可以实现静态缓存。
0
鬼目
鬼目

引用来自“Grrrr”的评论

第一种可能:apache用来做静态服务器,而nginx只是做了一下负载均衡。

第二种可能:nginx做了静态服务器,负载均衡。apache来做一个中间层,用来检测请求,并做一些校验,和攻击防护,比加CSRF校验,防slow HTTP denial.这些只需要在apache加一个module即可,而真正的后台Tomcat只需要关注逻辑处理即可。

我们最初也是N + T,N做负载和静态,T做业务。

后来在N和T中间加了A,做中间层,处理静态和一些Cache工作,N只做负载和分发。

------------

当初也考虑过N+N+T,主要是N的优势在于并发和吞吐量,所以中间的N用A代替了。

其实大部分系统一开始都是A+T,后来量上来了,就在前面加上N了。

鬼目
鬼目
回复 @Damn : 原因很简单,程序员们N用的不如A熟。
Nathans
Nathans
你说的这点,以前大多数确实是A+T,后来因为高并发,Apache在高并发时,无法提供响应。所以加入了Nginx,但Nginx处理静态优于Apache,Cache同样可以在Nginx上实现啊? 你们这样选型有什么考虑还是优势?
0
淡定的wo
淡定的wo
nginx是可以提供静态和缓存功能的。有apache的原因多半是历史遗留问题。怕出问题不想移除apache。可能仅仅在前端加了nginx做负载均衡。
0
孤单时会想你
孤单时会想你
apache纯属多余。。。 
Nathans
Nathans
能说出原因吗?
0
开源中国社区酱油哥
开源中国社区酱油哥

引用来自“CheckStyle”的评论

很简单啊,很多所谓的架构师,对这些东西懵懵懂懂的,老习惯就是Apache+Tomcat,觉得AJP就是王道。现在又听说Nginx很叼,于是乎就在前面加一个Nginx
 这个答案不错
0
川儿
川儿

初级架构师简单谈下看法:

Apache和Nginx本身定位都是web服务器,负责分发web请求到应用服务器,功能上大部分是重复的。Apache是老牌web服务器,很多应用都跑了很长时间了,再迁移到Nginx上是有较大成本的。全新项目建议Nginx一步到位!

同时用Apache和Nginx,不是不可以,但要处理好用户请求。使用两个web服务器相当与用户的请求被封装了两次,很多原生态的应用再解析请求时是按一次封装来处理的。举个最简单的例子,IP解析,同时使用Apache和Nginx,假设Apache处理在前,Nginx解析出来的IP地址都是Apache服务器的IP,真实用户IP就统计不到了。

iorichina
iorichina
IP解析这个例子不对,apache可以设置真实ip到header里,你可以查下这方面的mod
返回顶部
顶部