Php与Apache和Nginx的结合方式

Php与Apache和Nginx的结合方式

前言

web服务器种类繁多,按照处理静态语言的可以分为(nginx,apache),处理动态Java语言有tomcat(本身支持http协议),但是我们的浏览器本身就可以解析html静态语言,那为什么还是需要web服务器呢?因为在不同场景不同需求下,我们需要具有不同功能的web服务器互相组合来实现我们的复合需求!比如tomcat本身可以动态解析java程序,并且本身支持http协议,可以独立访问。但是生产环境前面还是需要用Nginx反向代理+负载均衡对其优化。处理php语言也是一样的,nginx和apache都可以配合php去实现,但是他们又有几种方式呢?每种方式又有什么优缺点?我们如何针对不同场景选出正确的组合。带着这几个疑问我们今天来共同学习下!

一.apache与php结合有三种方式: cgi模式, php模块模式,fastcgi模式

1.cgi模式:cgi是common gateway interface (通用网关接口),是HTTP服务器和上游其他程序(php)进行通信的一个接口,cgi是一种协议,他定义了webserver与cig程序的通信方式,当webserver接受客户端请求,如果匹配到规则需要cgi服务器将动态语言解析,此时会将动态页面通过cgi接口传到cgi程序进行解析而后再将解析的静态内容返回给Httpserver。cgi的出现让web从动态变为静态,但是cgi目前已经被fastcg淘汰。因为使用cgi方式每次客户端请求都要建立和销毁进程,不断的fork进程是一项很消耗时间的资源和工作。所以这个模式不必多讲。几乎没人用。

2.Apache   + mod_php模块方式

LoadModule php5_module modules/libphp5.so

这种工作模式下php作为apache的一个模块随着apache进程一起启动,所以又称为apache handle模式,二者紧密度比较高性能要比fastcgi好一些,但是由于php和apache运行在同一个进程里面所以Php的动作都会影响apache。如果php出现问题会导致apache也无法工作,无论对于排查错误还是web服务器的稳定性都不是好的选择,所以通常适用于开发以及测试环境,机器性能不是特别好,却能发挥出效率高的特点。

3.apache+fastcgi(php)模式

此种模式下是需要php-fpm(php -fastcgi-process manager)来控制我们的fastcgi进程,apache进程和php进程独立开了。php进程如果宕掉,php-fpm也会为他启动新的进程,虽然性能要低于apache handle 模式 但是网站更加稳定,排查错误也比较容易。可是他仍然不是最佳的选择,因为apache本身不太适用于高并发,所以我们的nginx出场了。

二.nginx与php结合只有一种方式那就是nginx+fastcgi模式

2.1.nginx+php(fastcgi模式)是目前处理php动态语言比较流行的模式。nginx本身以高并发特点著名,并且具备反向代理,负载均衡等多种功能配合支持多种正则表达式在web服务器名单上脱颖而出。fastcgi更优于cgi模式,他是一种常驻型的cgi,可以一直执行,是需要激活不会每次都花时间去fork一次,而且还支持分布式运算,使得php程序解析执行可以单独交给php服务器。Nginx连接fastcgi还有两种方式TCP(ip+端口)和unix domain socket 两种模式

tcp socket  和 unix domain socket区别

  • tcp socket 通信支持网络进程间(本机内网ip <192.168.137.100>nginx配置负载均衡时候会用到)通信,也支持本地lookback通信<127.0.0.1:9000>
  • unix socket 通信仅支持本地运行的进程间的通信,常常把sock放在/dev/shm/这个tmpfs文件系统下,加快通信速度

tcp模式

fastcgi 通过ip+端口实现nginx与php之间的连接,由于tcp连接是可靠连接。可以保证通信的连接性和正确性。但是通过tcp的方式也有缺点。无论是监听127.0.0.1还是本地内网ip都需要经过lookback口还要申请端口以及tcp相关资源。

unix domain  socket模式

这种模式下不需要像tcp那样有额外的开销,性能要比tcp好一些。但是在高并发的场景,Unix socket并不稳定,连接数爆发时,会产生大量的长时缓存,在没有面向连接协议的支撑下,大数据包可能会直接出错不返回异常。tcp这样的面向连接的协议,多少可以保证通信的正确性和完整性。

我的选择

如果并发不是特别大用socket模式,如果并发比较大,容易丢失连接,选择tcp模式

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Loading...