西西河

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

共:💬36 🌺49 新:
分页树展主题 · 全看 下页
  • 家园 【讨论】nginx 还是 apache?

    最近网站有一段时间很慢,有时候导致服务器崩溃,所以在琢磨是不是用 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同时有效,但是互不相通?而不是一直无效?

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

    • 家园 几个建议

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

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

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

    • 家园 nginx + php-fpm

      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.

    • 家园 先看一下服务器崩溃的原因

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

      • 家园 建议

        列一下我平时用的.

        1/ htop看一下cpu的情况.

        2/ vmstat看一下资源情况.

        3/ mysql的showslowquery打开.

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

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

    • 家园 我来试试分析一下,抛砖引玉吧

      首先一个像西西河这样需要查询数据库的网站,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, 支持每秒上千次并发没问题,这还是有很多数据库查询操作的情况下。

    • 家园 关于这个服务器配置的一点建议

      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等缓存系统的话,必须要先精心设计好缓存的方式,不然弄不好的话,性能可能不会有很大提高。

    • 家园 老铁应该号召大家捐款, 然后去amazon搞个

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

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

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

    • 家园 要透气

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

    • 家园 拙见

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

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

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

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

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

      静态文件apache完败nginx。

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

      给铁手的一些建议

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

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

      • 拙见
        家园 你什么时候做的压力测试,大并发的定义是什么

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

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

        • 家园 两位对新的 event MPM有没有看法

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

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

          • 家园 值得一试。

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

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

          • 家园 apache event mpm出来的太晚了

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

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

    • 家园 我的建议有两个

      1,大家捐点钱

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

      1.1

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

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

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

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

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

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

分页树展主题 · 全看 下页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河