主题:【讨论】nginx 还是 apache? -- 铁手

大河奔流 导读 复 35 阅 31116

/ 3 首页 上页 下页 末页

O 【讨论】nginx 还是 apache? 15 铁手 字1615 2012-03-13 20:15:05
O 几个建议 1 meokey 字684 2012-09-25 22:53:21
O nginx + php-fpm 1 mmpower 字323 2012-03-19 14:36:06
O 先看一下服务器崩溃的原因 aaronliu 字152 2012-03-19 14:35:40
..O 建议 aaronliu 字272 2012-04-01 02:18:15
O 我来试试分析一下,抛砖引玉吧 3 布老虎 字908 2012-03-18 11:30:06
O 关于这个服务器配置的一点建议 1 炼气小修士 字1308 2012-03-16 16:10:09
O 老铁应该号召大家捐款, 然后去amazon搞个 3 xda111 字133 2012-03-15 23:31:16
O 要透气 whamlu 字70 2012-03-15 10:58:54
O 拙见 1 freebsd 字527 2012-03-15 08:51:40
..O 你什么时候做的压力测试,大并发的定义是什么 1 季侯 字290 2012-03-15 09:59:22
...O 两位对新的 event MPM有没有看法 铁手 字261 2012-03-15 17:56:08
....O 值得一试。 copypst 字177 2012-03-16 15:36:31
....O apache event mpm出来的太晚了 季侯 字461 2012-03-16 06:15:29
O 我的建议有两个 1 liuyanzhen 字369 2012-03-15 06:56:21
2012-03-13 20:15:05
主题:3685846
铁手
铁手`352`/bbsIMG/upload/face/352.gif`70`45489`39472`493309`正四品上:正议大夫|忠武将军`2003-05-03 11:59:57`0
1 【讨论】nginx 还是 apache? 15

最近网站有一段时间很慢,有时候导致服务器崩溃,所以在琢磨是不是用 nginx。

nginx据说很好,特别是用的内存资源很少,在同样的内存容量条件下,可以支持比 apache 多的多的并发访问。我对nginx不熟,对新的apache了解也不够多,这里想请问一下行家,两者之间该怎么选择?

对nginx的最大担心就是它的开发稳定性。之前对lighttp也有过兴趣,那个时候也是新宠,冒的很快,但是不久就出现内存泄露的问题,现在来看,元气还没有恢复,使用的人数似乎不多。虽然现在nginx的风头很健,但是不知道会不会出现 lighttp 类似的问题。相对而言,apache 的开发从历史来看也好,从它的规模来看也好,断档或者飘忽的情况不太会发生。

我目前的最大关注点是内存问题。从网站的情况来看,目前的内存在大多数情况下是够用的,但是也有挡不住的时候。nginx 能不能解决这个问题?或者新的 apache 的 event MPM 能不能缓解问题?worker 呢?我为了保险,目前是用 prefork 。

简单测试过 nginx。碰到一个问题,用 php-cgi 来作为 fastcgi 的后台时,大量的并发访问,没放倒 nginx,但是让 php 崩溃了,而崩溃后的 php,也没有简单的办法重启。从网上搜来的建议,是要自己写一个 cron job每隔几分钟去检查一下,必要的话,就重启。觉得多了一些麻烦。nginx 的一个好处,是配置文件看上去很让人赏心悦目。apache 的,简直就是一大乱屋子,知道地方还好,不知道找半天。不过现在看上去也有改观。

用nginx基本上就肯定要用fastcgi,php 的话,用php-cgi还是用 php-fpm?不熟悉。用apache的话,可以使用fastcgi,也可以使用 modphp。用fastcgi对 apc 有什么影响?看了不少网上的东西,有些地方还是不明白。apc是在一个php-cgi中可以共享,还是每一次访问都会导致失效?也就是说,如果在apache中,用modphp时,apc 缓存可以一直有效,那么在fcgi时候,是不是有限数量的apc同时有效,但是互不相通?而不是一直无效?

请大家帮忙建议哪种情况下,用哪种配置比较好?


  • 本帖 19 回复
2012-03-13 20:15:05
2012-09-25 22:53:21
3796231 复 3685846
meokey
meokey`18703`/bbsIMG/face/0000.gif`70`2806`5120`53988`正七品上:朝请郎|致果校尉`2007-07-25 06:52:47`0
2 几个建议 1

1. nginx稳定性肯定没有问题,性能和安全也不会有问题,这都是经过大型网站实践的。nginx本身handle西西河的流量肯定没有问题,如果有问题,90%是脚本或者配置的问题。nginx搞不定的流量,apache在同样硬件配置下肯定也搞不定。如果内存是关键因素,而且移植困难不大,改成nginx

2. 老铁提到内存不足。我觉得可以把网页加密的功能去掉了。这个功能的用处实在不大,防君子不防小人,但非常占用cpu和内存,而且对于写手机用户端有极大的障碍。这个功能去掉了,我看老铁可以省掉一笔买内存的钱。而且用手机端上网现在是趋势了,关键原因是方便,有个几分钟时间都可以掏出手机看看,不用特地坐在书桌边打开电脑了。老铁不能忽视这个流量啊

3. php崩溃的问题好像不少人都遇到过,临时解决方法就是写(抄)个监视脚本,有人说可以改用php-fpm


2012-09-25 22:53:21
2012-03-19 14:36:06
3693493 复 3685846
mmpowermmpower`11653`/bbsIMG/face/0000.gif`70`0`2`44`正九品上:儒林郎|仁勇校尉`2006-05-05 00:06:57`0
2 nginx + php-fpm 1

since we replaced apache (worker mpm)/modphp with nginx/php-fpm the site is much more responsive; memory footprint is also smaller and overall improved a lot in scalability and stablity.

for apc you should still be able to use shm for caching stuff. eAccelerator and xcache do the same thing but in general perform better.


铁手 接纳。
2012-03-19 14:36:06
2012-03-19 14:35:40
3693492 复 3685846
aaronliuaaronliu`82387`/bbsIMG/face/0000.gif`70`0`0`8`从九品上:文林郎|陪戎校尉`2012-03-18 11:03:30`0
2 先看一下服务器崩溃的原因

西西河已经运行非常久的时间了,铁手在主贴中提到“服务器崩溃”,我觉得还是先要查一查程序上有没有问题。看看系统的整体瓶颈在哪。可不可以加上memcache作缓存。


  • 本帖 1 回复
铁手 接纳。
2012-03-19 14:35:40
2012-04-01 02:18:15
3701881 复 3693492
aaronliuaaronliu`82387`/bbsIMG/face/0000.gif`70`0`0`8`从九品上:文林郎|陪戎校尉`2012-03-18 11:03:30`0
3 建议

列一下我平时用的.

1/ htop看一下cpu的情况.

2/ vmstat看一下资源情况.

3/ mysql的showslowquery打开.

这些估计也是大家都这样用的.

铁手, 你应该列出来更多的信息. 比方瓶颈在哪, PHP/MYSQL/NETWORK, 没有更多的信息, 没办法帮你想主意.另外,应该在代码中打些log. 便于知道"曾经发生了什么."


铁手 接纳。
2012-04-01 02:18:15
2012-03-18 11:30:06
3692278 复 3685846
布老虎布老虎`2473`/bbsIMG/face/0000.gif`70`12`1180`15134`从四品下:中大夫|明威将军`2004-03-11 21:25:48`0
2 我来试试分析一下,抛砖引玉吧 3

首先一个像西西河这样需要查询数据库的网站,bottleneck永远在数据库这边, NGinx这种所谓的支持大并发(每秒几万次甚至几十万次请求),只适用于门户网站之类的静态网页,比如新浪新闻之类,谁上网看到的都是这些东西。总之NGinx就是把所有的内容load进memory里面,然后threading的数量和CPU的数量相等;明摆着这就是个CPU bound的设计,根本考虑file I/O或者database I/O.

一般的动态网页(比如Amazon)这种highly personalized的网站,NGinx不能用,还是得LoadBalancer后面带上一串Tomcat,甚至几级LoadBalancer.道理很简单,一次数据库查询(如果数据库在另一台机器上),你能做到200ms的response time就很不错了,当然memcached会快一点,也要70-80ms左右。每秒几十万次查询?先看看你的数据库能不能顶住吧。

说到内存,tomcat JVM 内存都在4G到6G左右,足够了。注意Sun的JVM是generational GC的, 所以内存不够肯定是程序问题或者JVM的GC配置问题。

我做过的系统如果用LB的话,基本上带上两三个Tomcat, 支持每秒上千次并发没问题,这还是有很多数据库查询操作的情况下。


2012-03-18 11:30:06
2012-03-16 16:10:09
3689723 复 3685846
炼气小修士炼气小修士`56967`/bbsIMG/face/0000.gif`70`44`2`408`从八品上:承奉郎|御武(侮)校尉`2010-05-28 02:30:00`0
2 关于这个服务器配置的一点建议 1

nginx+php-cgi,是现在比较主流的做法,稳定性是不用质疑的。

php-cgi进程用spawn-fcgi管理,不需要自己检查进程存活,因为php-cgi进程是比较容易死掉的,spawn-fcgi会管理进程的。

apc缓存貌似可以设置存进shm的,共享应该是没问题的。

楼下有推荐amazon的,这个关系不是很大,只是说他有些服务比较方便。

推荐nodejs的同学,,,这个修改成本比较高,nodejs现在也还不成熟。

====

看到楼下的帖子了,想补充一下。

楼下有几点说得很对,nginx静态文件可以达到每秒几万次的RPS,而动态内容则主要取决于后端程序的执行。

但nginx并非是所谓的内容load进内存,它的并发能力是来源于它基于事件响应的异步io。当然也有缓存的插件。

而后面的描述,感觉他把nginx和tomcat之类的app容器混淆了。拿nginx和tomcat集群相提并论。其实,nginx作为web server,它只负责静态文件处理,对于动态网页,它都是转发给处理者的。比如php会通过fastcgi协议传给php-cgi进程,python则可能是使用wsgi传给后端。所以它根本不需要多考虑文件io和数据库io。

nginx做集群也很多,只是它在里面的角色不是tomcat这样的app容器,而一般是LB的前端反向代理,或者作为web server。

nginx优势除了高并发,还有内存使用小,响应快。当然是相对apache而言的。除了sina,taobao也有用的,其实找找还是挺多应用的。

大web系统没有不切分的,除了web server的,db和cache都会切分。

顺便谈下cache,我觉得论坛这类读写频繁的系统,使用memcached等缓存系统的话,必须要先精心设计好缓存的方式,不然弄不好的话,性能可能不会有很大提高。


铁手 接纳。 最后于2012-03-29 01:27:02改,共1次;
2012-03-16 16:10:09
2012-03-15 23:31:16
3688590 复 3685846
xda111xda111`52289`/bbsIMG/face/0000.gif`70`746`675`15224`从四品下:中大夫|明威将军`2010-01-26 20:46:04`0
2 老铁应该号召大家捐款, 然后去amazon搞个 3

ec2, 内存跟不上了点个按钮就升级. 新加坡美国都开一个node, 照顾一下翻墙众.

数据库用RDS, 每天自动备份.

然后老铁可以专心写网页, 运营网站.


2012-03-15 23:31:16
3687846 复 3685846
whamlu
2 要透气

河主,俺啥都不懂,时政版这两天口水太多了,潜水也快被淹死,过来透气的。


2012-03-15 10:58:54
2012-03-15 08:51:40
3687714 复 3685846
freebsdfreebsd`32915`/bbsIMG/face/0000.gif`70`51`352`5420`正六品上:朝议郎|昭武校尉`2009-03-22 03:46:07`0
2 拙见 1

以前做过apache和nginx的对比性能测试,结论如下

大并发情况下,Apache没Nginx理想,但是差距不大.

apache的失败率多于Nginx,但是请求处理时间略低于Nginx;

fastcgi用tcp-socket方式,比unix-socket的失败率低很多。

nginx在内存占用上有明显优势,大概节省了1/4内存占用量

静态文件apache完败nginx。

以上数据,是实测结果,可以做选型参考

给铁手的一些建议

apacheMPM比prefork应该强很多,如果能转最好转一下,带来好处还是蛮多的。

如果有能力拆分前台改用集群还是有必要的,做应用均衡或者做应用切分带来的性能提升都很大,不然光靠优化这样挖掘最后提升太小了。


  • 本帖 1 回复
2012-03-15 08:51:40
2012-03-15 09:59:22
3687773 复 3687714
季侯季侯`4358`/bbsIMG/face/0000.gif`70`5327`1765`39594`正二品:特进|辅国大将军`2004-12-05 05:57:11`0
3 你什么时候做的压力测试,大并发的定义是什么 1

如果采用worker 的apache mpm那么apache一般也就能有3/4000的并发链接,prefork性能更差;而nginx几万个并发没压力。

之所以性能差距这么大,是因为在linux下nginx采用的是基于epoll的事件驱动模型,而prefork/worker都是采用每个链接一个线程/进程的模式,后者太古老了,已经不能适应c10k/c100k的场景需求。


  • 本帖 1 回复
2012-03-15 09:59:22
2012-03-15 17:56:08
3688119 复 3687773
铁手
铁手`352`/bbsIMG/upload/face/352.gif`70`45489`39472`493309`正四品上:正议大夫|忠武将军`2003-05-03 11:59:57`0
4 两位对新的 event MPM有没有看法

最新的apache httpd 2.4版本,我试着在自己机器上从源代码安装,MPM全选,并且是loadable的情况下,在我的机器里缺省的MPM是event。应该是代表一种趋势,和nginx靠拢?或者可能产生类似的性能?

还有一点值得注意的是,php的最新版本,包括了 php-fpm,也许是鼓励fast cgi的使用。


  • 本帖 2 回复
2012-03-15 17:56:08
2012-03-16 15:36:31
3689692 复 3688119
copypstcopypst`18806`/bbsIMG/face/0000.gif`70`16`96`798`从九品上:文林郎|陪戎校尉`2007-08-02 20:49:50`0
5 值得一试。

总体性能还不如nginx,但你的迁移成本会低很多。可以先起一个新apache eventmpm,用iptables rules redirect

小部分流量测试一下。假设西西河在一台独立的机器上运行,没有load balancer或HA


2012-03-16 15:36:31
2012-03-16 06:15:29
3689154 复 3688119
季侯季侯`4358`/bbsIMG/face/0000.gif`70`5327`1765`39594`正二品:特进|辅国大将军`2004-12-05 05:57:11`0
5 apache event mpm出来的太晚了

apache的event 也是采用epoll的事件驱动模式,原理和nginx的实现类似,性能应该也不会相差太大。貌似从08年就有event mpm了,但是一直处于实验状态,所以不能在正式环境中使用。而这些年,nginx确处于飞速发展中。好像event mpm最近正式发布了。但是时过境迁了,追求兼容性的继续使用prefor/work mpm,追求性能的早就改用nginx了,我觉得市场恐怕不太大。用的人少了,解决问题也就麻烦一点,:-)

如果没有太多的原有特性要兼容还是建议使用nginx,另外要找一下系统的瓶颈是什么,再觉得是否更换。


2012-03-16 06:15:29
2012-03-15 06:56:21
3687614 复 3685846
liuyanzhenliuyanzhen`67698`/bbsIMG/face/0000.gif`70`41`89`991`从九品上:文林郎|陪戎校尉`2010-12-25 16:07:41`0
2 我的建议有两个 1

1,大家捐点钱

首先老铁要说明自己使用的是什么服务器有没有添加内存的可能性,如果没有请参照1.1

1.1

购置新服务器--内存怎么样也能扩到40多G那种。

2,在实现1 选项目标的前提下,

2。1 利用 淘汰下的服务器做架构更改尝试

既然河内由人技术方面出头---

2.2 架构完成后-将数据迁移到新架构,同时新旧两套服务跑。

前端做个类似于服务状态监测的程序,一旦新架构支撑不住,切换到旧的服务环境。


2012-03-15 06:56:21
帖内引用

/ 3 首页 上页 下页 末页