海外主机测评

您现在的位置是:首页 > 服务器 > 正文

服务器

fastcgiFastcgi连不上

cds8202023-04-24服务器81
本文目录一览:1、跟我学Nginx,配置FastCGI代理2、关于FastCGI、php-cgi、php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么?3、cgi、

本文目录一览:

  • 1、跟我学Nginx,配置 FastCGI 代理
  • 2、关于FastCGI、php-cgi、php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么?
  • 3、cgi、fastcgi、php-cgi、php-fpm异同
  • 4、Nginx配置里的Fastcgi是干啥用的?
  • 5、php504错误

跟我学Nginx,配置 FastCGI 代理

CGI 全称 "通用网关接口"(Common Gateway Interface),用于 HTTP 服务器与其它机器上的程序服务通信交流的一种工具,CGI 程序须运行在网络服务器上。

传统 CGI 接口方式的主要缺点是性能较差,因为每次 HTTP 服务器遇到动态程序时都需要重启解析器来执行解析,然后结果被返回给 HTTP 服务器。这在处理高并发访问几乎是不可用的,因此就诞生了FastCGI。另外传统的 CGI 接口方式安全性也很差。

FastCGI 是一个可伸缩地、高速地在 HTTP 服务器和动态脚本语言间通信的接口(FastCGI 接口在 Linux 下是 socket(可以是文件 socket,也可以是 ip socket)),主要优点是把动态语言和 HTTP 服务器分离开来。多数流行的 HTTP 服务器都支持 FastCGI,包括 Apache、Nginx 和 lightpd。

同时,FastCGI 也被许多脚本语言所支持,比较流行的脚本语言之一为 PHP。FastCGI 接口方式采用 C/S 架构,可以将 HTTP 服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或多个脚本解析守护进程。当 HTTP 服务器每次遇到动态程序时,可以将其直接交付给 FastCGI 进程执行,然后将得到的结构返回给浏览器。这种方式可以让 HTTP 服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

FastCGI 的重要特点:

Nginx 可用于将客户端请求路由到 FastCGI 服务器,这些 FastCGI 服务器是使用各种框架和编程语言(如:PHP)构建的应用程序。

与 FastCGI 服务器一起使用的最基本的 nginx 配置包括使用 fastcgi_pass 指令而不是 proxy_pass 指令,以及 fastcgi_param 指令来设置传递给 FastCGI 服务器的参数。

假设 FastCGI 服务器可在 localhost:9000 上访问。 以上一节中的代理配置为基础,将 proxy_pass 指令替换为 fastcgi_pass 指令,并将参数更改为 localhost:9000。在 PHP 中,SCRIPT_FILENAME 参数用于确定脚本名称,QUERY_STRING 参数用于传递请求参数。生成的配置如下:

上面配置将设置一个 server,该 server 将通过 FastCGI 协议将除静态图像请求之外的所有请求路由到 localhost:9000 上运行的代理服务器

关于FastCGI、php-cgi、php-fpm的区别是什么,各自有什么用途,以及相互间的关系是什么?

fastcgi是一个通用网关接口,用于Web服务器(iis, apache)和应用程序通信。

php-cgi是php平台的cgi程序

以上两个结合,可以使php整合在web服务中

php-fpm是一个独立的php-fcgi管理软件,它要整合进web服务中,需要使用代理模式

一般与nginx搭配。也可以与apache搭配

php-fpm一般不直接作为服务容器提供外网访问,而是通过常用web容器作代理

php作为服务器端的解析程序,运行模式分很多种,fastcgi, mod_php, proxy(代理)等。

与iis搭配时一般采用fast-cgi模式,iis自带fast-cgi引擎,配置好php参数即可

与apache搭配,在windows平台下,一般也是fast-cgi模式,在linux系统中一般是mod_php模式,把php作为一个子模块加载

也可以配置php-fpm 然后在apache中配置代理模式

与nginx搭配,一般就是用php-fpm+代理模式了

cgi、fastcgi、php-cgi、php-fpm异同

1. cgi

    - 通用网关接口,就是外部应用程序(cgi程序)与web服务器之间的接口标准。

    - nginx是内容分发者,如果是请求index.php,根据配置文件内容得知不是静态文件,就会去找对应的cgi程序进行解析

    - cgi就是规定要传那些数据,以什么格式传递给后方进行处理的协议

    - cgi工作模式,一个请求发送过来,启动cgi解释器(创建进程)- 逻辑处理 - 退出 (fork and exec 模式) 每次都需要重新创建进程,加载配置,浪费系统资源

2. fastcgi

    - 快速通用网关接口,常驻型的cgi,不用每次都fork进程,其会使cgi解解释器进程常驻内存,所以性能较高

    - master-worker模型,服务器启动时载入fastcgi进程管理器

    - fastcgi会进行自身初始化,初始化时会创建多个进程

    - 请求到达web服务器后,fastcgi进程管理器会选择并通过socket连接到一个cgi解释器

3. php-cgi

    - php自带的cgi管理器

    - php-cgi的缺点,不能平滑重启,需要重启php-cgi才能使php.ini生效

4. php-fpm

    - php-fpm是php的一种fastcgi的实现,管理php的fastcgi进程池

    - 能够调度php-cgi程序

    - 能够实现平滑重启

    - php-fpm创建一个master进程,然后创建进程池,监听socket,fork出多个子进程,子进程各自accept请求,php-fpm的子进程同时只能响应一个请求,处理完一个请求才可以accept下一个请求,多进程,同步阻塞模型

    - master和worker进程之间不直接进行通信,master通过共享内存获取worker进程信息,master进程发送信号通知worker进程

    - php-fpm可以同时监听多个端口,每个端口对应一个worker pool

    - worker是cgi程序,php-fpm是fastcgi协议的php是实现

Nginx配置里的Fastcgi是干啥用的?

前一段时间又重读了《HTTP权威指南》一书,觉得有一些理论知识还是蛮重要的,需要进行一番整理,让自己之后对整条web链路有个更清晰的认识。

当用户打开浏览器并输入一串url地址时,到最终页面内容呈现在用户眼前时,这之间的步骤可大致整理如下:

1)用户输入 。

2)浏览器解析出主机名。

3)浏览器查询这个主机名的ip地址如192.168.0.1(即dns解析)并获得端口号如80

4)浏览器发起到192.168.0.1:80的连接。(tcp连接握手)

5)浏览器向服务器发送一条http get或post报文。(有可能会先发送给proxy或gateway,再由它们转发给服务器,如nginx做反向代理以实现负载均衡

6)浏览器从服务器读取http响应报文。

7)浏览器关闭连接。

以上便是一条http请求的大致过程,理论上所有的http通信都是由tcp/ip承载的,即http使用tcp连接,其保证了在资源传输过程中是可靠的/不会丢失或损坏的。

注:http和https比较,https就是在http层和tcp层之间接入了一个密码加密层,称之为TLS或SSL,常用于一些支付等安全性要求较高的网站。

注:关于http的性能优化,tcp连接的时延和瓶颈等,之后可能需要另整理一份。

web服务器可以用来表示web服务器的软件,也可以表示提供web页面的特定设备或机器。这边主要是指通用软件web服务器,如apache或nginx。

《http权威指南》中有一份用perl脚本写的web服务器的源码,实现了最简单的收发客户端报文的功能。

当然,实际的web服务器比这要复杂的多,核心步骤整理如下:

1)接受一个客户端(浏览器)连接,或者拒绝该客户端的连接并将其关闭。

2)接受请求,从网络中读取一条http请求报文并解析。

3)处理请求,对请求报文进行解析。

4)访问资源,访问报文中指定的资源,有可能是缓存好的html静态页面或图片资源,也有可能是动态资源,如php文件,此时web server会通过fastcgi请求php应用程序以此产生动态资源,下面会详细讲。

5)创建http响应报文,并回送给客户端。

6)纪录事务处理过程,即记log。

讲Fastcgi之前需要先讲CGI,CGI是为了保证web server传递过来的数据是标准格式的,它是一个协议,方便CGI程序的编写者。Fastcgi是CGI的更高级的一种方式,是用来提高CGI程序性能的。

web server(如nginx)只是内容的分发者。比如,如果请求/index.html,那么web server会去文件系统中找到这个文件,发送给浏览器,这里分发的是静态资源。

如果现在请求的是/index.php,根据配置文件,nginx知道这个不是静态文件,需要去找PHP解析器来处理,那么他会把这个请求简单处理后交给PHP解析器。此时CGI便是规定了要传什么数据/以什么格式传输给php解析器的协议。

当web server收到/index.php这个请求后,会启动对应的CGI程序,这里就是PHP的解析器。接下来PHP解析器会解析php.ini文件,初始化执行环境,然后处理请求,再以CGI规定的格式返回处理后的结果,退出进程。web server再把结果返回给浏览器。

那么CGI相较于Fastcgi而言其性能瓶颈在哪呢?CGI针对每个http请求都是fork一个新进程来进行处理,处理过程包括解析php.ini文件,初始化执行环境等,然后这个进程会把处理完的数据返回给web服务器,最后web服务器把内容发送给用户,刚才fork的进程也随之退出。 如果下次用户还请求动态资源,那么web服务器又再次fork一个新进程,周而复始的进行。

而Fastcgi则会先fork一个master,解析配置文件,初始化执行环境,然后再fork多个worker。当请求过来时,master会传递给一个worker,然后立即可以接受下一个请求。这样就避免了重复的劳动,效率自然是高。而且当worker不够用时,master可以根据配置预先启动几个worker等着;当然空闲worker太多时,也会停掉一些,这样就提高了性能,也节约了资源。这就是Fastcgi的对进程的管理。大多数Fastcgi实现都会维护一个进程池。注:swoole作为httpserver,实际上也是类似这样的工作方式。

那PHP-FPM又是什么呢?它是一个实现了Fastcgi协议的程序,用来管理Fastcgi起的进程的,即能够调度php-cgi进程的程序。现已在PHP内核中就集成了PHP-FPM,使用--enalbe-fpm这个编译参数即可。另外,修改了php.ini配置文件后,没办法平滑重启,需要重启php-fpm才可。此时新fork的worker会用新的配置,已经存在的worker继续处理完手上的活。

php504错误

解决方式:

一般默认的fastcgi进程响应的缓冲区是8K,这时可以设置大一点,在nginx.conf里,加入:fastcgi_buffers 8 128k,这表示设置fastcgi缓冲区为8块128k大小的空间。

当然如果在进行某一项即时的操作, 可能需要nginx的超时参数调大点,例如设置成60秒:send_timeout 60;经过这两个参数的调整,一般不会再提示“504 Gateway Time-out”错误,问题基本解决。

有时候网站需要对php-fpm和nginx进行配置修改。因为这种情况下,也会出现“504 Gateway Time-out”错误提示。而这时候Nginx 504 Gateway Time-out的含义就是所请求的网关没有请求到,简单来说就是没有请求到可以执行的PHP-CGI。

解决方式:

更改php-fpm的几处配置即可:

把max_children由之前的10改为现在的30,这样就可以保证有充足的php-cgi进程可以被使用;

把request_terminate_timeout由之前的0s改为60s,这样php-cgi进程处理脚本的超时时间就是60秒,可以防止进程都被挂起,提高利用效率。

接着再更改nginx的几个配置项,减少FastCGI的请求次数,尽量维持buffers不变:

fastcgi_buffers由 4 64k 改为 2 256k;

fastcgi_buffer_size 由 64k 改为 128K;

fastcgi_busy_buffers_size 由 128K 改为 256K;

fastcgi_temp_file_write_size 由 128K 改为 256K。

重新加载php-fpm和nginx的配置,再次测试,如果没有出现“504 Gateway Time-out”错误,问题便解决了。

解决方式:

将php-fpm的处理方式改成apache模式即可。

关于fastcgi和Fastcgi连不上的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

发表评论

评论列表

  • 这篇文章还没有收到评论,赶紧来抢沙发吧~