JAVA和Nginx 教程大全

网站首页 > 精选教程 正文

Nginx-cgi fastcgi 的原理详解 nginx高效的原理

wys521 2024-10-11 19:02:00 精选教程 17 ℃ 0 评论

介绍

CGI全称通用网关接口 Commmon Gateway Interface

用于HTTP服务上的程序服务通信交流的一种工具,CGI程序须运行在网络服务器上。

所谓的动态网页,都是要外部应用程序生成的,而不是Web服务器能干的事情。所以,最初的、最简单的CGI,是使用C来写的,很简单。

传统CGI接口方式性能较差,由于每次HTTP服务器遇到动态程序需要重启解析器来执行解析,然后结果被返回给HTTP服务器。这在处理高并发时,几乎是不可能的,因此诞生了FastCGI。

fastCGI用来管理多个CGI进程,它负责同时生成和回收多个CGI进程,以服务器的内存空间,换取处理时间

Nginx 与APACHE

Nginx和apache最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

nginx处理静态文件好,耗费内存少.但无疑apache仍然是目前的主流,有很多丰富的特性.所以还需要搭配着来.当然如果能确定nginx就适合需求,那么使用nginx会是更经济的方式.

一般来说nginx与php就行通信有两种方式

NGINX+APACHE+PHP

GINX+PHP(FASTCGI)

第一中是利用CGI让nginx和php就行通信

第二种是静态nginx 动态资源让APACHE的MOD_PHP模块来实现

nginx在处理高并发的情况下比较有优势,而对于大多数虚拟主机用户来说,根本谈不上高并发,因为带宽才是瓶颈,2M带宽还谈什么并发,是吧.而且Apache支持不用重载配置的.htaccess配置,在易用性上要比Nginx配置好一些.也就是Apache+PHP架构要比Nginx简单,在不追求什么并发的场景,为什么要换一套架构呢?够用能用好用就行了呗。

Nginx返回502 Bad Gateway错误不是因为Nginx的问题,而是因为后端的问题.

比如后端PHP-FPM在处理一个请求时进程崩溃了,那么Nginx就会返回502错误.

当然你可以用fastcgi_next_upstream配置让Nginx把请求转移给另一个upstream处理.

fastcgi_next_upstream error timeout invalid_header http_500 http_502 http_504;

Nginx+PHP-FPM实现了动静分离,负载均衡,故障转移,在高并发场景确实要比Apache有优势.

内置PHP模块的Apache进程在处理PHP时就无法处理静态资源,而Nginx则不需要担心这个问题,因为处理PHP是PHP-FPM的事,这就是动静分离.而且Nginx支持upstream配置PHP-FPM集群实现负载均衡,这点也是Apache不擅长的。

通过Nginx用户对动态PHP网页访问过程

location ~ \.php$ {
 include /etc/nginx/fastcgi_params;
 fastcgi_intercept_errors on;
 fastcgi_pass 127.0.0.1:9000;
 }

用户访问的是index.php,则会匹配到location ~ \.php$,这个的含义是对用户通过URI访问的资源进行区分大小的匹配,并且访问的资源是以.php结尾的。

nginx根据用户请求的资源匹配到具体的location后,会执行location对应的动作,location中动作的含义是:

include /etc/nginx/fastcgi_params; #表示nginx会调用fastcgi这个接口

fastcgi_intercept_errors on; #表示开启fastcgi的中断和错误信息记录

fastcgi_pass 127.0.0.1:9000; # 表示nginx通过fastcgi_pass将用户请求的资源发给127.0.0.1:9000进行解析,这里的nginx和php脚本解析服务器是在同一台机器上,所以127.0.0.1:9000表示的就是本地的php脚本解析服务器。

用户请求的是动态内容,nginx会将请求交给fastcgi客户端,通过fastcgi_pass将用户的请求发送给php-fpm

如果用户访问的是静态资源呢,那就简单了,nginx直接将用户请求的静态资源返回给用户。

fastcgi_pass将动态资源交给php-fpm后,php-fpm会将资源转给php脚本解析服务器的wrapper

rapper收到php-fpm转过来的请求后,wrapper会生成一个新的线程调用php动态程序解析服务器

如果用户请求的是需要读取例如MySQL数据库等,将会触发读库操作;

如果用户请求的是如图片/附件等,PHP会触发一次查询后端存储服务器如通过NFS进行存储的存储集群;

php会将查询到的结果返回给nginx

nginx构造一个响应报文将结果返回给用户

如果用一张图表示nginx fastcgi wrapper php之间的关系

我们采用的是Nginx做负载均衡的转发模式配合Tomcat或IIS一起使用

虽然Tomcat也可以认为是HTTP服务器,但通常它仍然会和Nginx配合在一起使用:

  • 动静态资源分离——运用Nginx的反向代理功能分发请求:所有动态资源的请求交给Tomcat,而静态资源的请求(例如图片、视频、CSS、JavaScript文件等)则直接由Nginx返回到浏览器,这样能大大减轻Tomcat的压力。

  • 负载均衡,当业务压力增大时,可能一个Tomcat的实例不足以处理,那么这时可以启动多个Tomcat实例进行水平扩展,而Nginx的负载均衡功能可以把请求通过算法分发到各个不同的实例进行处理

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表