1.1、关于CGI和FastCGI的理解
全称是“通用网关接口”,是一种让客户端(web浏览器)与Web服务器(nginx等)程序进行通信(数据传输)的协议。
用来规范web服务器传输到php解释器中的数据类型以及数据格式,包括URL、查询字符串、POST数据、HTTP header等,也就是为了保证web server传递过来的数据是标准格式的
1.2.CGI程序的工作原理
1)每次当web server收到index.php这种类型的动态请求后,会启动对应的CGI程序(PHP的解析器);
2)PHP解析器会解析php.ini配置文件,初始化运行环境,然后处理请求,处理完成后将数据按照CGI规定的格式返回给web server然后退出进程;
3)最后web server再把结果返回给浏览器。
1.3.CGI程序的特点
1)高并发时的性能较差: CGI程序的每一次web请求都会有启动和退出过程,也就是最为人诟病的fork-and-execute模式(每次HTTP服务器遇到动态请求时都需要重新启动脚本解析器来解析php.ini,重新载入全部DLL扩展并重初始化全部数据结构,然后把结果返回给HTTP服务器),很明显,这样的接口方式会导致php的性能很差,在处理高并发访问时,几乎是不可用的。2)传统的CGI接口方式安全性较差
3)CGI对php.ini的配置很敏感,在开发和调试的时候相当方便
2.1.什么是FastCGI?
通过CGI程序的工作原理可以看出:CGI程序性能较差,安全性较低,为了解决这些问题产生了FastCGI。
1)FastCGI(Fast Common Gateway Interface)全称是“快速通用网关接口”是通用网关接口(CGI)的增强版本,由CGI发展改进而来,主要用来提高CGI程序性能,类似于CGI,FastCGI也是一种让交互程序与Web服务器通信的协议2)FastCGI致力于减少网页服务器与CGI程序之间互动的开销,从而使服务器可以同时处理更多的网页请求(提高并发访问)。
3)同样的,一般说的FastCGI指的也是用各种语言编写的能实现该功能的程序。
2.2.FastCGI程序的工作原理
1)Web Server启动同时,加载FastCGI进程管理器(nginx的php-fpm或者IIS的ISAPI或Apache的Module)2)FastCGI进程管理器读取php.ini配置文件,对自身进行初始化,启动多个CGI解释器进程(php-cgi),等待来自Web Server的连接。3)当Web Server接收到客户端请求时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server会将相关环境变量和标准输入发送到FastCGI子进程php-cgi进行处理4)FastCGI子进程完成处理后将数据按照CGI规定的格式返回给Web Server,然后关闭FastCGI子进程或者等待下一次请求。
2.3.FastCGI对进程的管理方式
Fastcgi会先启一个master,解析配置文件,初始化执行环境,然后再启动多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然提高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是fastcgi的对进程的管理。
2.4.FastCGI的特点:
1)FastCGI具有语言无关性,支持用大多数语言进行编写,对应的程序也支持大多数主流的web服务器 FastCGI技术目前支持语言有:C/C++,Java,PHP,Perl,Tcl,Python,SmallTalk,Ruby等。支持FastCGI技术的主流web服务器有:Apache,Nginx,lighttpd等
2)FastCGI程序的接口方式采用C/S结构,可以将web服务器和脚本解析服务器分开,独立于web服务器运行,提高web服务器的并发性能和安全性:
提高性能:这种方式支持多个web分发服务器和多个脚本解析服务器的分布式架构,同时可以在脚本解析服务器上启动一个或者多个脚本解析守护进程来处理动态请求,可以让web服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。
提高安全性:API方式把应用程序的代码与核心的web服务器链接在一起,这时一个错误的API的应用程序可能会损坏其他应用程序或核心服务器,恶意的API的应用程序代码甚至可以窃取另一个应用程序或核心服务器的密钥,采用这种方式可以在很大程度上避免这个问题
3)FastCGI的不依赖于任何Web服务器的内部架构,因此即使服务器技术的变化, FastCGI依然稳定不变
4)FastCGI程序在修改php.ini配置时可以进行平滑重启加载新配置
所有的配置加载都只在FastCGI进程启动时发生一次,每次修改php.ini配置文件,只需要重启FastCGI程序(php-fpm等)即可完成平滑加载新配置,已有的动态请求会继续处理,处理完成关闭进程,新来的请求使用新加载的配置和变量进行处理
5)FAST-CGI是较新的标准,架构上和CGI大为不同,是用一个驻留内存的服务进程向网站服务器提供脚本服务。像是一个常驻(long-live)型的CGI,维护的是一个进程池,它可以一直执行着,只要激活后,不会每次都要花费时间去fork一次(这是CGI最为人诟病的fork-and-execute 模式),速度和效率比CGI大为提高,是目前的主流部署方式。
6)FastCGI的不足:
因为是在内存中同时运行多进程,所以会比CGI方式消耗更多的服务器内存,每个PHP-CGI进程消耗7至25兆内存,在进行优化配置php-cgi进程池的数量时要注意系统内存,防止过量
2.5、一个请求到PHP,Nginx的主要过程描述过程和原理。
1)、FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动startservers个CGI 子进程。主进程php-fpm主要是管理fastcgi子进程,监听9000端口。fastcgi子进程等待来自Web Server的连接。
2)、当客户端请求到达Web Server Nginx是时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理。
3)FastCGI进程管理器PHP-FPM选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。
4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。
5)、FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。
3、nginx fastcgi配置
#配置php 在源码目录
#cp php.ini-production /usr/local/php/etc/php.ini
#vi /usr/local/php/etc/php.ini
date.timezone = Asia/Shanghai
#配置php-fpm #在源码目录
#cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
#vi /usr/local/php/etc/php-fpm.conf
user=nginx
group=nginx
pid=run/php-fpm.pid
#cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
#chmod +x /etc/rc.d/init.d/php-fpm
#service php-fpm start
fastcgi代理配置
#####资源在远程电脑
#vi /usr/local/php/etc/php-fpm.conf
[global]
pid=run/php-fpm.pid
[www]
user=nginx
group=nginx
listen=127.0.0.1:9000
pm=dynamic
pm.maxchildren=5#子进程最大数量
pm.startservers=2#在启动时创建的子进程数量
pm.minspareservers=1#空闲子进程的最小数量
pm.maxspareservers=3#空闲子进程的最大数量
pm.processidletimeout=10s #一个空闲进程空闲多少秒后被杀死
pm.maxrequests=500#每个子进程处理完多少请求之后自动重启,为防止php第三方库内存泄露问题,设置0则不自动重启会一直处理请求
######end
###########资源在本机
#vi /usr/local/php/etc/php-fpm.conf
listen=/usr/local/php/php-fcgi.sock;
listen.owner=nginx #这个直接卸载上面一句位置下面
listen.group=nginx #这个直接卸载上面一句位置下面
#nginx配置
location ~\.php${
root html/wordpress;
fastcgipass unix:/usr/local/php/php-fcgi.sock;
fastcgiindex index.php;
fastcgiparam SCRIPTFILENAME $documentroot$fastcgiscriptname;
include fastcgiparams;
}
4、常见的服务器架构有以下三种:
1.服务器集群架构:服务器集群就是指将很多服务器集中起来一起进行同一种服务,在客户端看来就像是只有一个服务器。集群可以利用多个计算机进行并行计算从而获得很高的计算速度,也可以用多个计算机做备份,从而使得任何一个机器坏了整个系统还是能正常运行。
2.服务器负载均衡架构:负载均衡(Load Balancing)建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。
3.分布式服务器架构:所谓分布式资源共享服务器就是指数据和程序可以不位于一个服务器上,而是分散到多个服务器,以网络上分散分布的地理信息数据及受其影响的数据库操作为研究对象的一种理论计算模型服务器形式。分布式有利于任务在整个计算机系统上进行分配与优化,克服了传统集中式系统会导致中心主机资源紧张与响应瓶颈的缺陷,解决了网络GIS 中存在的数据异构、数据共享、运算复杂等问题,是地理信息系统技术的一大进步。
这个三种架构都是常见的服务器架构,集群的主要是IT公司在做,可以保障重要数据安全;负载均衡主要是为了分担访问量,避免临时的网络堵塞,主要用于电子商务类型的网站;分布式服务器主要是解决跨区域,多个单个节点达到高速访问的目前,一般是类似CDN的用途的话,会采用分布式服务器。
5、多台服务器共享session问题
1)基于NFS的Session共享。NFS(Network File System)最早由Sun公司为解决Unix网络主机间的目录共享而研发。仅需将共享目录服务器mount到其他服务器的本地session目录即可。
2)基于数据库的Session共享。
3)基于Cookie的Session共享。原理是将全站用户的Session信息加密、序列化后以Cookie的方式,统一种植在根域名下(如:.host.com),利用浏览器访问该根域名下的所有二级域名站点时,会传递与之域名对应的所有Cookie内容的特性,从而实现用户的Cookie化Session 在多服务间的共享访问。
4)基于缓存(Memcache)的Session共享。Memcache是一款基于Libevent多路异步I/O技术的内存共享系统,简单的key + value数据存储模式使得代码逻辑小巧高效,因此在并发处理能力上占据了绝对优势,目前能达到2000/s平均查询,并且服务器CPU消耗依然不到10%。
6、负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。
主要应用: dns,反向代理,代理服务器
nginx的负载均衡有4种模式:
1)、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2)、weight 指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
2)、iphash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
3)、fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配。
4)、urlhash(第三方)
0 留言