全球主机交流论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

CeraNetworks网络延迟测速工具IP归属甄别会员请立即修改密码
楼主: qiqi13245
打印 上一主题 下一主题

Lnmp 502原因 不喜勿喷

[复制链接]
31#
发表于 2011-4-21 20:32:31 | 只看该作者
神马都是一把双刃剑。
32#
 楼主| 发表于 2011-4-21 21:02:51 | 只看该作者
原帖由 observer 于 2011-4-21 19:49 发表


1. 是这样,但是其实严格来说apache也是一样的,代理到它的mod_php模块;区别其实在于"代理"方式不同,你真的应该了解一下同步和异步的区别
2. 我也不太明白,不过反正从来就不编译,直接用apt-get安装
3. php-fpm有动态管理的 ...

1.就是这种方式的差异,导致的
2.额。。
3。貌似lnmp都用不上
33#
发表于 2011-4-21 21:34:28 | 只看该作者
嗯,其实502大部分都是php执行时间过长
为什么会过长呢,请看下自己的程序慢在哪里吧
当然,一定数量的php-cgi进程也是必要的
要保证不要502
那么:
php-cgi 数目  >  请求执行时间 * 并发请求
34#
发表于 2011-4-21 21:41:52 | 只看该作者
原帖由 qiqi13245 于 2011-4-21 21:02 发表

1.就是这种方式的差异,导致的
2.额。。
3。貌似lnmp都用不上


唉,你真的真的明白差异在哪里会导致什么吗?

同步并发其实就是多线程,apache其实一开始是这样的,有一个服务过来,就fork一个进程处理之,这种简单的处理协议被称为CGI;但是要知道fork进程是有成本的,操作系统的overhead以及内存分配等等。所以后来apache改进了一下机制,让这些进程本来就fork好了,进来一个req就直接dispatch到已经fork好的php解释器进程上,dispatch所使用的协议就是通常说的FastCGI。apache2的mod_php说穿了就是一个实现了FastCGI的模块,用FastCGI连接了http请求和php解释进程。

但是要知道FastCGI虽然比CGI要强很多,但是本质上还是阻塞式的,也就是说接受一个请求以后,会因为I/O而阻塞,这时候apache就知道,哦,我不能dispatch到某子线程了,因为那个子线程被阻塞了。说实话如果所有访问都是动态的,那么apache其实和nginx差得不多,差异只在于两者所用的连接器的好坏而已。

然而如果有大量静态的页面和动态页面混杂,并且静态页面比例远大于动态页面(这是非常普遍的情况)呢?如果有10个apache2进程,同时有10个人访问了某动态页面,这时候apache会很尴尬地发现全部阻塞了,连图片都返回不了了,那怎么办?于是apache只能等待某个进程处理完动态页面,重新可用时,然后再返回静态内容。这就是同步阻塞式web服务的劣势了。

有鉴于此,nginx才用了一种更加高并发的形式,异步非阻塞。也就是说,我把web请求逻辑和web服务逻辑分离开来。当一个请求到达时,我把它扔给处理逻辑,然后转身继续接受请求,而不再傻乎乎地阻塞,等待处理逻辑处理完毕;等处理逻辑处理完毕以后,直接返回请求逻辑再返回html。这样的好处是显而易见的,极大地提高了并发,尤其是静态页面的并发,但是也不是没有坏处:因为你不知道什么时候请求能完成,完全不可控,就会导致动态页面响应会有不确定性。

有些地方说得可能不太清楚,希望能对你有点启发吧。
35#
 楼主| 发表于 2011-4-21 21:43:01 | 只看该作者
原帖由 observer 于 2011-4-21 21:41 发表


唉,你真的真的明白差异在哪里会导致什么吗?

同步并发其实就是多线程,apache其实一开始是这样的,有一个服务过来,就fork一个进程处理之,这种简单的处理协议被称为CGI;但是要知道fork进程是有成本的,操作系统的overhead以及 ...

跟我在wiki上看得差不多,不瞒你说我都是翻wiki的
36#
 楼主| 发表于 2011-4-21 21:46:39 | 只看该作者
nginx配置中可以看出就是分开的,apache没分开,所以采用lanmp分开动静态,这就是apache的不足,502的原因就是反映问题,而nginx是根据后缀来判断,你可以放一个hello word的html改名成php,如果php存在并且列队已经满了, 就等待,等处理的时候发现时静态,直接过,而当php挂了,就会直接502.不给予处理
自己试验得出的结论

[ 本帖最后由 qiqi13245 于 2011-4-21 21:53 编辑 ]
37#
发表于 2011-4-21 21:51:28 | 只看该作者
原帖由 qiqi13245 于 2011-4-21 21:43 发表

跟我在wiki上看得差不多,不瞒你说我都是翻wiki的


所以其实说apache比nginx更加高并发是不对的,即使比纯php请求,两者应该也在伯仲之间,处理能力不会有太大差别。

wiki还是不错的,不过显然没有直接看文档了解得透彻,apache的文档没怎么看过,不过nginx的文档我是狠狠犁了一遍,大致也就了解apache大概怎么做的了。
38#
 楼主| 发表于 2011-4-21 21:53:33 | 只看该作者
原帖由 observer 于 2011-4-21 21:51 发表


所以其实说apache比nginx更加高并发是不对的,即使比纯php请求,两者应该也在伯仲之间,处理能力不会有太大差别。

wiki还是不错的,不过显然没有直接看文档了解得透彻,apache的文档没怎么看过,不过nginx的文档我是狠狠犁了 ...

但是实际情况复杂,一般来说apache动态会>nginx,nginx小并发的请求时间很短的
apache处理比较大并发时候得心应手
亲身体验

apache类似一种比较庞大的文件,虽然速度比较慢,但是稳定,尤其大并发下,速度不会怎么变(CC除外)
而nginx属于轻便型那种,小并发下很快,越大就会随着增长,而php-cgi我又不会配置动态进程,所以达到一定的时候列队会很长,就会导致502和504

亲身体验,欢迎纠正

[ 本帖最后由 qiqi13245 于 2011-4-21 21:56 编辑 ]
39#
发表于 2011-4-21 21:56:00 | 只看该作者
原帖由 qiqi13245 于 2011-4-21 21:46 发表
nginx配置中可以看出就是分开的,apache没分开,所以采用lanmp分开动静态,这就是apache的不足,502的原因就是反映问题,而nginx是根据后缀来判断,你可以放一个hello word的html改名成html,如果php存在并且列队已经满了, 就等待,等 ...


所以nginx最好还是配合php-fpm这种可以动态管理php进程数的FastCGI解释器来得妥当。

即使没有空余的php进程,php-fpm也可以动态地fork一个出来。不信的话lz试试看php-fpm吧,把max-child设得大一点,就应该不会有任何问题了。
40#
 楼主| 发表于 2011-4-21 21:57:04 | 只看该作者
apache类似一种比较庞大的文件,虽然速度比较慢,但是稳定,尤其大并发下,速度不会怎么变(CC除外)几乎是不变的,除非全僵尸了
而nginx属于轻便型那种,小并发下很快,越大就会随着增长,而php-cgi我又不会配置动态进程,所以达到一定的时候列队会很长,就会导致502和504(应该说是那种成比例)

亲身体验,欢迎纠正
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|全球主机交流论坛

GMT+8, 2026-1-7 15:38 , Processed in 0.070905 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表