php webservers

24
PHP & Web Servers -- 大大 (Rollenc)

Upload: samon127

Post on 26-Jun-2015

1.584 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Php Webservers

PHP & Web Servers

--大罗 (Rollenc)

Page 2: Php Webservers

Directory

1. Request Circle2. Apache & php_mod 

1.php_mod Circle2.mpm & mpm_prefork

3. FastCGI1.Start a FastCGI2.FastCGI with mpm_worker3.Nginx & LightHTD

Page 3: Php Webservers

Apache Request Circle

Page 4: Php Webservers

Apache Request Circle(1)

1、 Post-Read-Request阶段在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。

2、 URI Translation阶段Apache在本阶段的主要工作:将请求的 URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。mod_alias就是利用这个阶段工作的。

3、 Header Parsing阶段Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。

Page 5: Php Webservers

Apache  Request Circle(2)

4、 Access Control阶段Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利用这个阶段工作的。

5、 Authentication阶段Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。

6、 Authorization阶段Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。

Page 6: Php Webservers

Apache Request Circle(3)

7、MIME Type Checking阶段Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块mod_negotiation和mod_mime实现了这个钩子。

8、 FixUp阶段这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和 Post_Read_Request类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。

9、 Response阶段Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。

Page 7: Php Webservers

Apache Request Circle(4)

10、 Logging阶段Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换 Apache的标准日志记录。

11、 CleanUp阶段Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者 Socket的关闭等等,这是 Apache一次请求处理的最后一个阶段。

Page 8: Php Webservers

Nginx Request Circle(1)

NGX_HTTP_POST_READ_PHASE        //读取请求阶段NGX_HTTP_SERVER_REWRITE_PHASE    //Server URI转换阶段NGX_HTTP_FIND_CONFIG_PHASE         //查找相应的配置来执行阶段NGX_HTTP_REWRITE_PHASE               //URI转换阶段NGX_HTTP_POST_REWRITE_PHASE      //对转换后的 URL结果进行处理的阶段NGX_HTTP_PREACCESS_PHASE           //权限检查准备阶段

Page 9: Php Webservers

Nginx Request Circle(2)

NGX_HTTP_ACCESS_PHASE                //权限检查阶段NGX_HTTP_POST_ACCESS_PHASE       //对权限检查结果进行处理阶段NGX_HTTP_TRY_FILES_PHASE            //处理配置中的try_files阶段NGX_HTTP_CONTENT_PHASE             //处理生成返回数据阶段NGX_HTTP_LOG_PHASE                    //记录日志处理阶段,具体说明应当是请求完成后,关闭请求时处理

Page 10: Php Webservers

php_mod Circle

1、 Apache接收请求。2、 Apache传递请求给mod_php。3、mod_php定位磁盘文件,并加载到内存中。4、mod_php编译源代码成为 opcode树。 (APC)5、mod_php执行 opcode树。

Page 11: Php Webservers

mpm

This Multi-Processing Module (MPM) implements a hybrid multi-process multi-threaded server. By using threads to serve requests, it is able to serve a large number of requests with less system resources than a process-based server. Yet it retains much of the stability of a process-based server by keeping multiple processes available, each with many threads.

Page 12: Php Webservers

mpm_prefork

进程模式,预先申请单进程内存暂用约: 1.7MWith mod_php: 3.7M

Page 13: Php Webservers

mpm_worker

支持多线程和多进程混合模型的 MPM线程 *进程单进程内存暂用约: 2.1M~ 4.3MPHP部分模块是非线程安全

Page 14: Php Webservers

 FastCGI 建立一个 HTTP/Socket,和 webserver交互

+

Apache/Nginx/lighttpd

Page 15: Php Webservers

Nginx & LightTPD

静态文件处理:

通过 sendfile接口 , 把这个请求委托给操作系统内核处理 .

sendfile()是作用于数据拷贝在两个文件描述符之间的操作函数 .这个拷贝操作是内核中操作的 ,所以称为 " 零拷贝 ".sendfile函数比起 read和write函数高效得多 ,因为 read和write是要把数据拷贝到用户应用层操作 .

Page 16: Php Webservers

FastCgi Circle

• Web  Server建立 FastCGI 程序处理需求。 FastCGI 程序可以在启动时就被建立,也可以等到召唤时才建立。

• FastCGI 程序建立后,先初始本身状态,接著等待一個來自 Web  Server的连接。

• 当 client 的需求來到時, Web  Server就建立一条到 FastCGI程序间的连接,并将 CGI 环境变量及标准環境變數及標準輸入的資料送入該連線。

• FastCGI 程序則將標準輸出及標準錯誤的資料,透過同一條連線送 回給伺服器。

• 當 FastCGI 程序關閉這條連線後,才表示需求處理完畢, FastCGI 程序則繼續等待其他的連線。

Page 17: Php Webservers

Start a FastCGI

/usr/bin/php-cgi -q -b localhost:9000  (2.1M)

/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 \  -C 2 -u www-data -f /usr/bin/php5-cgi  (2.4M)

Page 18: Php Webservers

Apache + FastCGI

1. Apache mod_fastcgi

AddHandler fcgid-script .phpOptions +ExecCGIFcgidWrapper /usr/local/bin/php-wrapper .php

2. Apache mod_fcgid

AddHandler fastcgi-script php

Page 19: Php Webservers

Nginx + FastCGI

# Vhosts fastcgi configfastcgi_pass  127.0.0.1:9000;fastcgi_index index.php;

location ~ \.php$ {include        /etc/nginx/fastcgi.conf;fastcgi_param  SCRIPT_FILENAME  /home/rollenc/luochunhui.com/web/$fastcgi_script_name;}

Page 20: Php Webservers

Nginx & LightTPD

读取准备:

epoll 是为处理大批量句柄而作了改进的 poll。

三个系统调用: epoll_create(2), epoll_ctl(2), epoll_wait(2)。

epoll 仅仅是一个异步事件的通知机制,其本身并不作任何的 IO读写操作,它只负责告诉你是不是可以读或可以写 了,而具体的读写操作,还要应用层自己来作。

Page 21: Php Webservers

Diff

1. Apache && Nginx 输出有 Buffer     堵塞 render函数2. Lighttpd 无 buffer     别输出大数据量,比如 echo file_get_contents($bigfile);

Page 22: Php Webservers

Ref• Nginx 的中文维基 http://wiki.nginx.org/NginxChs• 啃饼的技术博客 http://blog.csdn.net/kenbinzhang• Apache 服务的工作原理

http://blog.tianya.cn/blogger/post_show.asp?BlogID=40003&PostID=4585547

• netpet( 凌晓 )的博客 http://blog.csdn.net/netpet/default.aspx?PageNumber=2

• Emiller的 Nginx模块开发指南 中文草稿 http://yaoweibin.cn/maindoc/nginx-modules-guide-cn.pdf 

• 浪湾 (langwan)  http://hi.baidu.com/langwan/blog/category/%D4%B4%C2%EB%B7%D6%CE%F6

• Multi-Processing Modules (MPMs) http://httpd.apache.org/docs/2.0/mpm.html

• Apache Worker and PHP http://brian.moonspot.net/2008/02/13/apache-worker-and-php/

• Google: http://www.google.com/

Page 23: Php Webservers

Q & A

 

Page 24: Php Webservers

Thanks