Nginx反向代理功能-实现FastCGI实战案例
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.FastCGI概述
1>.CGI的由来
最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动态技术,比如像php(1995年)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不能直接运行php、java这样的文件。
apache实现的方式是打补丁,但是nginx缺通过与第三方基于协议实现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户的请求,处理完成后返回数据给Nginx并回收进程,最后nginx在返回给客户端,那这个约定就是通用网关接口(common gateway interface,简称CGI),CGI(协议)是web服务器和外部应用程序之间的接口标准,是cgi程序和web服务器之间传递信息的标准化接口。
2>.为什么FastCGI
CGI协议虽然解决了语言解析器和seb server之间通讯的问题,但是它的效率很低,因为web server每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGI是用来提高CGI性能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。
3>.什么是PHP-FPM
PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自webserver的请求。worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理。
二.Nginx与php-fpm在同一服务器实战案例
1>.安装php相关软件环境
[root@node101.yinzhengjie.org.cn ~]# yum -y install php-fpm php-mysql Loaded plugins: fastestmirror Loading mirror speeds from cached hostfile epel/x86_64/metalink | 8.7 kB 00:00:00 * base: mirrors.tuna.tsinghua.edu.cn * epel: mirrors.tuna.tsinghua.edu.cn * extras: mirror.bit.edu.cn * updates: mirrors.tuna.tsinghua.edu.cn base | 3.6 kB 00:00:00 epel | 5.4 kB 00:00:00 extras | 2.9 kB 00:00:00 updates | 2.9 kB 00:00:00 (1/3): epel/x86_64/group_gz | 90 kB 00:00:00 (2/3): epel/x86_64/updateinfo | 1.0 MB 00:00:00 (3/3): epel/x86_64/primary_db | 6.9 MB 00:00:00 Resolving Dependencies --> Running transaction check ---> Package php-fpm.x86_64 0:5.4.16-46.1.el7_7 will be installed --> Processing Dependency: php-common(x86-64) = 5.4.16-46.1.el7_7 for package: php-fpm-5.4.16-46.1.el7_7.x86_64 ---> Package php-mysql.x86_64 0:5.4.16-46.1.el7_7 will be installed --> Processing Dependency: php-pdo(x86-64) = 5.4.16-46.1.el7_7 for package: php-mysql-5.4.16-46.1.el7_7.x86_64 --> Running transaction check ---> Package php-common.x86_64 0:5.4.16-46.1.el7_7 will be installed --> Processing Dependency: libzip.so.2()(64bit) for package: php-common-5.4.16-46.1.el7_7.x86_64 ---> Package php-pdo.x86_64 0:5.4.16-46.1.el7_7 will be installed --> Running transaction check ---> Package libzip.x86_64 0:0.10.1-8.el7 will be installed --> Finished Dependency Resolution Dependencies Resolved ============================================================================================================================================================================ Package Arch Version Repository Size ============================================================================================================================================================================ Installing: php-fpm x86_64 5.4.16-46.1.el7_7 updates 1.4 M php-mysql x86_64 5.4.16-46.1.el7_7 updates 101 k Installing for dependencies: libzip x86_64 0.10.1-8.el7 base 48 k php-common x86_64 5.4.16-46.1.el7_7 updates 565 k php-pdo x86_64 5.4.16-46.1.el7_7 updates 99 k Transaction Summary ============================================================================================================================================================================ Install 2 Packages (+3 Dependent packages) Total download size: 2.2 M Installed size: 8.8 M Downloading packages: (1/5): libzip-0.10.1-8.el7.x86_64.rpm | 48 kB 00:00:00 (2/5): php-common-5.4.16-46.1.el7_7.x86_64.rpm | 565 kB 00:00:00 (3/5): php-mysql-5.4.16-46.1.el7_7.x86_64.rpm | 101 kB 00:00:00 php-pdo-5.4.16-46.1.el7_7.x86_ FAILED http://mirror.lzu.edu.cn/centos/7.7.1908/updates/x86_64/Packages/php-pdo-5.4.16-46.1.el7_7.x86_64.rpm: [Errno 14] curl#56 - "Recv failure: Connection reset by peer":-- ETA Trying other mirror. (4/5): php-fpm-5.4.16-46.1.el7_7.x86_64.rpm | 1.4 MB 00:00:06 (5/5): php-pdo-5.4.16-46.1.el7_7.x86_64.rpm | 99 kB 00:00:05 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 358 kB/s | 2.2 MB 00:00:06 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : libzip-0.10.1-8.el7.x86_64 1/5 Installing : php-common-5.4.16-46.1.el7_7.x86_64 2/5 Installing : php-pdo-5.4.16-46.1.el7_7.x86_64 3/5 Installing : php-mysql-5.4.16-46.1.el7_7.x86_64 4/5 Installing : php-fpm-5.4.16-46.1.el7_7.x86_64 5/5 Verifying : php-common-5.4.16-46.1.el7_7.x86_64 1/5 Verifying : libzip-0.10.1-8.el7.x86_64 2/5 Verifying : php-pdo-5.4.16-46.1.el7_7.x86_64 3/5 Verifying : php-mysql-5.4.16-46.1.el7_7.x86_64 4/5 Verifying : php-fpm-5.4.16-46.1.el7_7.x86_64 5/5 Installed: php-fpm.x86_64 0:5.4.16-46.1.el7_7 php-mysql.x86_64 0:5.4.16-46.1.el7_7 Dependency Installed: libzip.x86_64 0:0.10.1-8.el7 php-common.x86_64 0:5.4.16-46.1.el7_7 php-pdo.x86_64 0:5.4.16-46.1.el7_7 Complete! [root@node101.yinzhengjie.org.cn ~]#