nginx源代码分析

Nginx可以开启多个进程,每个进程拥有最大上限128个子线程以及一定的可用连接数。如果你希望使用线程可以在配置文件中设置worker_threads这个参数,但这个参数在Nginx官方手册上没有。只有通过阅读源代码才看到。最大客户端连接数等于进程数与连接数的乘积,连接是在主进程中初始化的,一开始所有连接处于空闲状态。 每一个客户端请求进来以后会通过事件处理机制,在Linux是Epoll,在FreeBSD下是KQueue放到空闲的连接里。 如果设置了线程数,那么被填充的连接会在子线程中处理,否则会在主线程中依次处理。 如果解析出是动态脚本请求,会根据fast-cgi的设置访问php-cgi进程,php进程数量的多少依据php-fpm.conf中max_children的设置。 因此Nginx的动态请求能力不仅仅依靠Nginx本身的设置,还要调试php-fpm。 从源代码级别上看nginx由以下几个元素组成: 1. worker(进程) 2. thread(线程) 3. connection(连接) 4. event(事件) 5. module(模块) 6. pool(内存池) 7. cycle(全局设置) 8. log(日志) 大概就这些元素组成的。 整个程序从main()开始算 ngx_max_module = 0; for (i = 0; ngx_modules[i]; i++) { ngx_modules[i]->index = ngx_max_module++; } 这几句比较关键,对加载的模块点一下数,看有多少个。ngx_modules并不是在原代码中被赋值的,你先执行一下./configure命令生成用于编译的make环境。在根目录会多出来一个文件夹objs,找到ngx_modules.c文件,默认情况下nginx会加载大约30个模块,的确不少,如果你不需要那个模块尽量还是去掉好一些。 接下来比较重要的函数是 ngx_init_cycle(),这个函数初始化系统的配置以及网络连接等,如果是多进程方式加载的会继续调用ngx_master_process_cycle(),这是main函数中调用的最关键的两个函数。 ngx_init_cycle()实际上是个复杂的初始化函数,首先是加载各子模块的配置信息、并初始化各组成模块。 任何模块都有两个重要接口组成,一个是create_conf,一个是init_conf。分别是创建配置和初始化配置信息。 模块按照先后顺序依次初始化,大概是这样的: &ngx;_core_module, &ngx;_errlog_module, &ngx;_conf_module, &ngx;_events_module, &ngx;_event_core_module, &ngx;_epoll_module, &ngx;_http_module, &ngx;_http_core_module, &ngx;_http_log_module, 首先是内核模块、错误日志、配置模块、事件模块、时间内核模块、EPOLL模块、http模块、http内核模块、http日志模块,剩下的模块都算不上关键。 epoll是比较关键的核心模块之一,nginx兼容多种IO控制模型,memecached用的是libevent不如nginx彻头彻尾是自己实现的。 在ngx_init_cycle()中对模块初始化完毕后,调用ngx_open_listening_sockets()函数对socket进行了初始化。 在listen上80端口以后,调用模块的另外一个重要接口init_module对各模块进行初始化。 并不是每个模块都对init_module接口进行了定义,在比较重要的模块中仅有 ngx_http_log_module 对这个接口进行了定义。 ngx_init_cycle()返回后,主要的工作都是在ngx_master_process_cycle()函数中继续进行的。 ngx_master_process_cycle()函数中的重要过程有调用ngx_start_worker_processes()生成多个子进程,一般nginx是多进程的。 ngx_start_worker_processes()函数内部调用ngx_worker_process_cycle()函数建立每个进程的实际工 作内容,在这个函数中首先调用ngx_create_thread()初始化各线程。我们知道每个线程都有一个启动处理函数,nginx的线程处理函数为 ngx_worker_thread_cycle(),内部过程中最重要的是对ngx_event_thread_process_posted()函数 的调用,用于实际处理每一次请求。 在初始化线程结束后,首先调用ngx_process_events_and_timers()函数,该函数继续调用 ngx_process_events接口监听事件,一般情况下对应的函数是ngx_epoll_process_events(),如果使用的是其它种 类的IO模型,则应该实现相应的实际函数。这个接口负责把事件投递到ngx_posted_events事件队列里,并在 ngx_event_thread_process_posted()函数中进行处理。 nginx的connection和event是按照链表的方式进行存放的,区别在于connection是单向链表而event是双向链表。 nginx中的connection链表是提前分配的,定义在ngx_event_process_init()函数内,具体代码如下: ....

2009-03-23 · 3 分钟 · admin

Linux基金会本周买下Linux.com域名

Linux基金会本周买下了Linux.com域名,将把它建设为Linux用户和开发者的活跃社区,有分析人士认为,Linux基金会此举是为了吸引更多的商业用户使用Linux操作系统. Linux.com之前只是一个简单的新闻站点,去年的访问量上升了21%.目前Linux基金会正在准备重新发布新网站,预计新网站将在数月之内上线.SourceFourge也表示将继续销售Linux.com的推广广告来支持Linux基金会. Linux基金会还计划把当前的www.linuxfoundation.org网站上内容与社区项目都移植到新网站,并向商业用户提供更多有关使用Linux的信息,以吸引更多的商业用户使用Linux这样的开源操作系统. Linux基金会执行主管吉姆·泽姆林(Jim Zemlin)表示,“能够得到Linux.com这个域名并通过它为用户提供信息与服务,Linux社区感到非常兴奋.我们将向世人展示Linux社区成员是如何通过Linux.com网站进行协作的.”

2009-03-21 · 1 分钟 · admin

web 2.0系统的Cache化

已经有很久了。几位同事不断的跟我谈论着做静态化内容的改造。由于我们系统和用户的增涨过快,大量的web 2.0产品都面临着用户的增涨过快,极大的消耗了服务器资源。当年的三板斧的静态化板斧又冲上来了。但是显然,将一个动态的web 2.0系统做成一个静态化的系统,不是一天两天的事,但我认为大量的人力资源消耗在这件事上显然不值得。这里记下自己尝试着需要记录的为动态加入 Cache功能的要点。 先来看看新浪的blog首页和我的页面: 访问http://blog.sina.com.cn的首页,它返回的Header如下: HTTP/1.1 200 OK Date: Mon, 09 Jul 2007 11:26:19 GMT Server: Apache/1.3.37 (Unix) Cache-Control: max-age=600 Expires: Mon, 09 Jul 2007 11:36:19 GMT Last-Modified: Mon, 09 Jul 2007 11:15:11 GMT ETag: “451ed-4d003-469218bf” Accept-Ranges: bytes Content-Length: 315395 Content-Type: text/html 访问http://blog.sina.com.cn/hdcola,它返回的Header如下: HTTP/1.1 200 OK Date: Mon, 09 Jul 2007 11:28:01 GMT Server: Apache/1.3.37 (Unix) Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 19 Nov 1981 08:52:00 GMT Set-Cookie: SessionID=xxxxxxxxxxxxxxxxxx; path=/ Pragma: no-cache Transfer-Encoding: chunked Content-Type: text/html...

2009-03-21 · 1 分钟 · admin

IBM欲斥资65亿美元收购Sun 同时涉足Linux和Unix

华尔街日报周三发表文章称,消息人士透露,IBM欲斥资65亿美元收购Sun,该交易最早将于本周宣布。但业内人士认为,这一消息并不出乎意料。并列出了IBM收购Sun的9大积极因素。Sun 在金融和通信等关键领域的硬件市场仍然占据很大的份额。Sun对美国市场非常依赖,但现在看来,这一市场的情况不容乐观。 1、IBM提升服务器和存储器市场 随着思科进入服务器市场,这一领 域的利润率也将受到挤压,尤其是当服务器增加了存储器和网络设备的功能后。而被并购后,由于IBM规模更大,因此能够承受较小的利润率。存储器市场也是如 此。 当然,双方还存在一些问题需要调和。IBM已经撤出了商品服务器(commodity server)市场,而Sun仍然涉足这一市场。与此同时,两家公司的服务器所使用的芯片也有所不同,Sun使用的是Sparc处理器,而IBM则是基于Power架构。 2、通过硬件增强软件业务 IBM是一家软件和服务公司,但是它同样需要硬件以销售其他产品。硬件是IBM所提供的软件及服务的入口。如果能够增强硬件业务,就可以在这一市场上更好的防御惠普。 3、横跨Linux和Unix两大市场 Sun 是Unix领域的重要厂商,旗下的Solaris至今仍是非常重要的平台,但是其市场近期却没有太大进展。IBM收购Sun后可以建立两大阵地:Linux和Unix。前者最终会在数据中心市场代替后者。IBM可以同时涉足两个领域,并对用户出售相关的服务以实现平台之间的迁移。除此之外,收购Sun还能对惠普的Unix业务形成一定的压力。 不过这里同样存在一个问题,IBM出售的是AIX Unix服务器,而Sun出售的则是Solaris服务器。 4、Sun可借此解脱 Sun希望从一家传统的硬件公司转型为一家开源软件和服务企业。这一举措恐怕难以奏效。而此时选择放弃则是明智之举。除此之外,此前还有报道称Sun曾被惠普和戴尔拒绝过。 5、回击惠普 《华尔街日报》的文章认为IBM此举是为应对思科进军数据中心业务。事实上,IBM真正的目标在于惠普。通过收购EDS,惠普将矛头直接指向IBM。而IBM则可凭借收购Sun在硬件领域给予惠普以有力的回击。 6、整合开源软件 Sun 的未来是以MySQL为核心推出一系列开源软件。而IBM也在大力拓展开源市场。因此两家公司的合并就在情理之中,而且IBM还可借此将MySQL、 Lotus、OpenSolaris和其他产品整合到一起。另外,Sun的开源软件需要分销渠道,因此它最近刚刚与惠普签署了分销协议。而IBM恰好拥有丰富的分销渠道。 面临问题:双方有许多重叠的软件。例如,在数据库领域IBM有DB2而Sun有MySQL。 7、使Java盈利 一直以来,Java都被认为是Sun最为优秀的资产,但这一平台从未实现盈利。或许IBM有能力帮助Java盈利。 8、丰富云计算服务 Sun在云计算领域有着一些非常有趣的想法其计划也切实可行。Sun还在云计算领域进行了一些有针对性的并购。而IBM则可以通过并购将Sun的这些计划纳入到其庞大的云计算计划中。 9、平衡数据中心市场格局 数据中心的管理人员都希望能够尽量少的出现瓶颈,而思科的产品则希望简化数据中心的管理。在思科进军该领域后,IBM对Sun的并购又可以使市场重新获得平衡。 垄断问题和文化差异 不 过,双方的交易可能会面临反垄断审查。根据美国市场研究公司IDC的数据,2008年全年,IBM和Sun分列服务器市场第一和第四位,份额分别为 31.9%和10.13%,合并后份额则达到42%。惠普和戴尔分列二、三,份额分别为29.5%和11.6%。IBM和Sun的交易能否通过政府审查还是个未知数。除此之外,双方还存在这相当的文化差异。 原文 http://bbs2.chinaunix.net/thread-1400664-1-1.html

2009-03-21 · 1 分钟 · admin

QQ 批量查询显示状态 js!

<script src="http://webpresence.qq.com/getonline?Type=1&669811:1026811:65861413:"></script> 调用 <script>line(online[0],'白天',669811)</script> 效果页面见 http://cd-dns.com/freebsd-hosting 不过现在已经被TX禁了,找个时间在重写一下吧

2009-03-19 · 1 分钟 · admin

PHP 5.2.9 Released!

Security Enhancements and Fixes in PHP 5.2.9: Fixed security issue in imagerotate(), background colour isn’t validated correctly with a non truecolour image. Reported by Hamid Ebadi, APA Laboratory (Fixes CVE-2008-5498). (Scott) Fixed a crash on extract in zip when files or directories entry names contain a relative path. (Pierre) Fixed explode() behavior with empty string to respect negative limit. (Shire) Fixed a segfault when malformed string is passed to json_decode(). (Scott)

2009-03-19 · 1 分钟 · admin

Find 指令用法教學

筆記一下自己常用的 find 指令,適用於 FreeBSD 或者是 Linux 各大 distribution,系統管理這個指令就相當重要了,在搭配 grep,sed,awk,perl 可以快速找到自己要的檔案。我自己本身很常用到 grep,find,awk 這些撰寫 shell script。 底下先來介紹一下 find: 找出 . 底下的 php 檔案 find . -name “*.php” 找出 . 底下非 php 副檔名檔案 find . -not -name “*.php” 刪除 . 底下 php 檔案,有兩種作法 系統詢問之後才刪除 先把 -exec 後面的東西先清掉, 用 -print 來先確認輸出 rm 可以多用 -i 的參數來加以確認 find . -name “*.php” -exec rm -i {} ; 系統直接刪除 find . -delete -name “.php” find . -name “.php” | xargs /bin/rm -rf...

2009-03-19 · 2 分钟 · admin

利用 portmaster 升級 PHP 5.26 -> 5.28

之前在 大神 那边看到一篇 升级 PHP 5.2.8 的一些小细节,就来把我的机器升级一下,发现 php 5.2.7 之后已经把 pcre extension 纳入在裡面,参考 /usr/ports/UPDATING 裡面的 20081211 这个项目,可以利用 portupgrade 或者是 portmaster 来升级,之前都是利用 ruby 写的 portupgrade 来升级系统或者是更新安全性,现在利用 portmaster 这一套也是不错用,portmaster 是用 sh 写出来的,在 gslin 大神这一篇:portupgrade、portmaster、portconf 说到速度方面比 portupgrade 还要好,这我没有实际测试过,自己在实际用了一下,还蛮方便的。 安装 portmaster 跟 portconf 搭配: cd /usr/ports/ports-mgmt/portconf make install clean cd /usr/ports/ports-mgmt/portmaster make install clean 先找出需要升级的套件: pkg_version -v 在利用 portmaster 升级 php5 pkg_delete -f php5-pcre\* portmaster pecl\* portmaster php5\* 如果是利用 portupgrade: pkg_delete -f php5-pcre-* pkgdb -F portupgrade -f php5* portupgrade -f pecl* 之前还没升级的时候,利用 portaudit 检查套件的安全性,发现 php5-gd 在 5....

2009-03-19 · 1 分钟 · admin

软件开发版本及区别

alpha 内部测试版 beta 外部测试版 demo 演示版 Enhance 增强版或者加强版 属于正式版 Free 自由版 Full version 完全版 属于正式版 shareware 共享版 Release 发行版 有时间限制 Upgrade 升级版 Retail 零售版 Cardware 属共享软件的一种,只要给作者回复一封电邮或明信片即可。(有的作者并由此提供注册码等),目前这种形式已不多见。 Plus 属增强版,不过这种大部分是在程序界面及多媒体功能上增强。 Preview 预览版 Corporation & Enterprise 企业版 Standard 标准版 Mini 迷你版也叫精简版只有最基本的功能 Premium — 贵价版 Professional — 专业版 Express — 特别版 Deluxe — 豪华版 Regged — 已注册版 CN — 简体中文版 CHT — 繁体中文版 EN — 英文版 Multilanguage — 多语言版 α版 此版本表示该软件仅仅是一个初步完成品,通常只在软件开发者内部交流,也有很少一部分发布给专业测试人员。一般而言,该版本软件的 bug 较多,普通用户最好不要安装。 β(beta)版 该版本相对于α版已有了很大的改进,消除了严重的错误,但还是存在着一些缺陷,需要经过大规模的发布测试来进一步消除。这一版本通常由软件公司免费发布,用户可从相关的站点下载。通过一些专业爱好者的测试,将结果反馈给开发者,开发者们再进行有针对性的修改。该版本也不适合一般用户安装。...

2009-03-18 · 2 分钟 · admin

MySQL分表优化试验

我们的项目中有好多不等于的情况。今天写这篇文章简单的分析一下怎么个优化法。 这里的分表逻辑是根据t_group表的user_name组的个数来分的。 因为这种情况单独user_name字段上的索引就属于烂索引。起不了啥名明显的效果。 1、试验PROCEDURE. DELIMITER $$ DROP PROCEDURE `t_girl`.`sp_split_table`$$ CREATE PROCEDURE `t_girl`.`sp_split_table`() BEGIN declare done int default 0; declare v_user_name varchar(20) default ''; declare v_table_name varchar(64) default ''; -- Get all users' name. declare cur1 cursor for select user_name from t_group group by user_name; -- Deal with error or warnings. declare continue handler for 1329 set done = 1; -- Open cursor. open cur1; while done <> 1 do fetch cur1 into v_user_name; if not done then -- Get table name....

2009-03-18 · 4 分钟 · admin

转: 关于MySQL的查询缓存

最近发现用户注册老是出错,不确定问题所在,不知道是不是SQL CACHE引起的, 原理 QueryCache(下面简称QC)是根据SQL语句来cache的。一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使用 QC。每个Cache都是以SQL文本作为key来存的。在应用QC之前,SQL文本不会被作任何处理。也就是说,两个SQL语句,只要相差哪怕是一个字符(例如大小写不一样;多一个空格等),那么这两个SQL将使用不同的一个CACHE。 不过SQL文本有可能会被客户端做一些处理。例如在官方的命令行客户端里,在发送SQL给服务器之前,会做如下处理: 过滤所有注释 去掉SQL文本前后的空格,TAB等字符。注意,是文本前面和后面的。中间的不会被去掉。 下面的三条SQL里,因为SELECT大小写的关系,最后一条和其他两条在QC里肯定是用的不一样的存储位置。而第一条和第二条,区别在于后者有个注释,在不同客户端,会有不一样的结果。所以,保险起见,请尽量不要使用动态的注释。在PHP的mysql扩展里,SQL的注释是不会被去掉的。也就是三条 SQL会被存储在三个不同的缓存里,虽然它们的结果都是一样的。 select * FROM people where name='surfchen'; select * FROM people where /*hey~*/name='surfchen'; SELECT * FROM people where name='surfchen'; 目前只有select语句会被cache,其他类似show,use的语句则不会被cache。 因为QC是如此前端,如此简单的一个缓存系统,所以如果一个表被更新,那么和这个表相关的SQL的所有QC都会被失效。假设一个联合查询里涉及到了表A和表B,如果表A或者表B的其中一个被更新(update或者delete),这个查询的QC将会失效。 也就是说,如果一个表被频繁更新,那么就要考虑清楚究竟是否应该对相关的一些SQL进行QC了。一个被频繁更新的表如果被应用了QC,可能会加重数据库的负担,而不是减轻负担。我一般的做法是默认打开QC,而对一些涉及频繁更新的表的SQL语句加上SQL_NO_CACHE关键词来对其禁用CACHE。这样可以尽可能避免不必要的内存操作,尽可能保持内存的连续性。 那些查询很分散的SQL语句,也不应该使用QC。例如用来查询用户和密码的语句——“select pass from user where name='surfchen'”。这样的语句,在一个系统里,很有可能只在一个用户登陆的时候被使用。每个用户的登陆所用到的查询,都是不一样的SQL 文本,QC在这里就几乎不起作用了,因为缓存的数据几乎是不会被用到的,它们只会在内存里占地方。 存储块 在本节里“存储块”和“block”是同一个意思 QC缓存一个查询结果的时候,一般情况下不是一次性地分配足够多的内存来缓存结果的。而是在查询结果获得的过程中,逐块存储。当一个存储块被填满之后,一个新的存储块将会被创建,并分配内存(allocate)。单个存储块的内存分配大小通过query_cache_min_res_unit参数控制,默认为4KB。最后一个存储块,如果不能被全部利用,那么没使用的内存将会被释放。如果被缓存的结果很大,那么会可能会导致分配内存操作太频繁,系统系能也随之下降;而如果被缓存的结果都很小,那么可能会导致内存碎片过多,这些碎片如果太小,就很有可能不能再被分配使用。 除了查询结果需要存储块之外,每个SQL文本也需要一个存储块,而涉及到的表也需要一个存储块(表的存储块是所有线程共享的,每个表只需要一个存储块)。存储块总数量=查询结果数量*2+涉及的数据库表数量。也就是说,第一个缓存生成的时候,至少需要三个存储块:表信息存储块,SQL文本存储块,查询结果存储块。而第二个查询如果用的是同一个表,那么最少只需要两个存储块:SQL文本存储块,查询结果存储块。 通过观察Qcache_queries_in_cache和Qcache_total_blocks可以知道平均每个缓存结果占用的存储块。它们的比例如果接近1:2,则说明当前的query_cache_min_res_unit参数已经足够大了。如果Qcache_total_blocks比 Qcache_queries_in_cache多很多,则需要增加query_cache_min_res_unit的大小。 Qcache_queries_in_cache*query_cache_min_res_unit(sql文本和表信息所在的block占用的内存很小,可以忽略)如果远远大于query_cache_size-Qcache_free_memory,那么可以尝试减小 query_cache_min_res_unit的值。 调整大小 如果Qcache_lowmem_prunes增长迅速,意味着很多缓存因为内存不够而被释放,而不是因为相关表被更新。尝试加大query_cache_size,尽量使Qcache_lowmem_prunes零增长。 启动参数 show variables like 'query_cache%'可以看到这些信息。 query_cache_limit:如果单个查询结果大于这个值,则不Cache query_cache_size:分配给QC的内存。如果设为0,则相当于禁用QC。要注意QC必须使用大约40KB来存储它的结构,如果设定小于 40KB,则相当于禁用QC。QC存储的最小单位是1024 byte,所以如果你设定了一个不是1024的倍数的值,这个值会被四舍五入到最接近当前值的等于1024的倍数的值。 query_cache_type:0 完全禁止QC,不受SQL语句控制(另外可能要注意的是,即使这里禁用,上面一个参数所设定的内存大小还是会被分配);1启用QC,可以在SQL语句使用 SQL_NO_CACHE禁用;2可以在SQL语句使用SQL_CACHE启用。 query_cache_min_res_unit:每次给QC结果分配内存的大小 状态 show status like 'Qcache%'可以看到这些信息。 Qcache_free_blocks:当一个表被更新之后,和它相关的cache blocks将被free。但是这个block依然可能存在队列中,除非是在队列的尾部。这些blocks将会被统计到这个值来。可以用FLUSH QUERY CACHE语句来清空free blocks。 Qcache_free_memory:可用内存,如果很小,考虑增加query_cache_size Qcache_hits:自mysql进程启动起,cache的命中数量 Qcache_inserts:自mysql进程启动起,被增加进QC的数量 Qcache_lowmem_prunes:由于内存过少而导致QC被删除的条数。加大query_cache_size,尽可能保持这个值0增长。 Qcache_not_cached:自mysql进程启动起,没有被cache的只读查询数量(包括select,show,use,desc等) Qcache_queries_in_cache:当前被cache的SQL数量 Qcache_total_blocks:在QC中的blocks数。一个query可能被多个blocks存储,而这几个blocks中的最后一个,未用满的内存将会被释放掉。例如一个QC结果要占6KB内存,如果query_cache_min_res_unit是4KB,则最后将会生成3个 blocks,第一个block用来存储sql语句文本,这个不会被统计到query+cache_size里,第二个block为4KB,第三个 block为2KB(先allocate4KB,然后释放多余的2KB)。每个表,当第一个和它有关的SQL查询被CACHE的时候,会使用一个 block来存储表信息。也就是说,block会被用在三处地方:表信息,SQL文本,查询结果。 另外一篇: 如果 MySQL Server 负载比较高,处理非常繁忙的话,可以启动Query Cache 以加速响应时间,启动方法可以在my....

2009-03-18 · 2 分钟 · admin

文章简介自动截取

修改主题 index.php archive.php 找到 替换成 2.71 生效

2009-03-15 · 1 分钟 · admin

安装代码高亮插件

准备开始转回wp 先装个高亮插件 下载地址 http://wordpress.org/extend/plugins/wp-syntax/ 为了更方便把编辑器改一下,看了半天终于找到了 wp-includes/js/quicktags.js 我觉得 code 用不到就把 改了,如下 edButtons[edButtons.length] =</code> <code>new edButton('ed_code' ,'code' ,'<pre lang="php">' ,'</pre>' ,'c' ); 来个 php 的呵呵 < ?php echo 'hello world!';?>

2009-03-15 · 1 分钟 · admin

转换成utf8成功!

准备从baidu 搬回来哦!

2009-03-15 · 1 分钟 · admin

php-fpm文档中文翻译

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://syre.blogbus.com/logs/20092011.html 原文链接:http://php-fpm.anight.org/ wiki:http://www.php-fpm.com/ 什么是 FastCGI FastCGI 是一个可伸缩、高速的在web server和脚本语言间通迅的接口。关于FastCGI技术的更多信息可以在官方网站和Wikipedia看到。 FastCGI 被许多脚本语言所支持,包括 php,如果用 –enable-fastcgi 选项编译的话。 多数流行的web server都支持 FastCGI。包括Apache(mod_fastcgi和mod_fcgid),Zeus,nginx和lighttpd。 FastCGI 的主要优点是把动态语言和 web server 分离开来。这种技术允许 web server 和动态语言运行在不同的主机上。这可以改进可扩展性和安全性而没有大的效率损失。 php-fpm 可以和任何支持外部 FastCGI 技术的 web server 一起使用。 php-fpm是做啥用的 很不幸,官方网站 php.net 上的 php 在将 FastCGI SAPI 用于生产环境方面有许多已知的问题。 下面是关于启用 FastCGI SAPI 时的问题和 php-fpm 是如何解决他们的对比列表。 描述 php自带的 spawn-fcgi + spawn-php.sh + daemontools php-fpm php守护进程化: pid file, log file, setsid(), setuid(), setgid(), chroot() (-) (+) (+) 进程管理。可以用 "graceful" 来停止并启动 php worker 进程而不会丢失请求。能够平滑地升级配置和二进制程序而不丢失任何请求。 php4 (-), php5 (只有 graceful) (-) (+) 严格限制来源请求的 web server 的 ip 地址 php4 (-) php5 (+) (从 5....

2009-03-14 · 3 分钟 · admin