ITPub博客

首页 > IT职业 > IT生活 > 实战Nginx与PHP(FastCGI)的安装、配置与优化

实战Nginx与PHP(FastCGI)的安装、配置与优化

IT生活 作者:玻璃窗起雾了 时间:2021-02-01 19:53:58 0 删除 编辑

一、什么是 FastCGI
FastCGI 是一个可伸缩地、高速地在 HTTP server 和动态脚本语言间通信的接口。多数流行的 HTTP server 都支持 FastCGI ,包括 Apache 、 Nginx 和 lighttpd 等,同时, FastCGI 也被许多脚本语言所支持,其中就有 PHP 。
FastCGI
是从 CGI 发展改进而来的。传统 CGI 接口方式的主要缺点是性能很差,因为每次 HTTP 服务器遇到动态程序时都需要重新启动脚本解析器来执行解析,然后结果被返回给 HTTP 服务器。这在处理高并发访问时,几乎是不可用的。另外传统的 CGI 接口方式安全性也很差,现在已经很少被使用了。
FastCGI
接口方式采用 C/S 结构,可以将 HTTP 服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当 HTTP 服务器每次遇到动态程序时,可以将其直接交付给 FastCGI 进程来执行,然后将得到的结果返回给浏览器。这种方式可以让 HTTP 服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

二、 Nginx+FastCGI 运行原理
Nginx 不支持对外部程序的直接调用或者解析,所有的外部程序(包括 PHP )必须通过 FastCGI 接口来调用。 FastCGI 接口在 Linux 下是 socket ,(这个 socket 可以是文件 socket ,也可以是 ip socket )。为了调用 CGI 程序,还需要一个 FastCGI 的 wrapper ( wrapper 可以理解为用于启动另一个程序的程序),这个 wrapper 绑定在某个固定 socket 上,如端口或者文件 socket 。当 Nginx 将 CGI 请求发送给这个 socket 的时候,通过 FastCGI 接口, wrapper 接纳到请求,然后派生出一个新的线程,这个线程调用解释器或者外部程序处理脚本并读取返回数据;接着, wrapper 再将返回的数据通过 FastCGI 接口,沿着固定的 socket 传递给 Nginx ;最后, Nginx 将返回的数据发送给客户端,这就是 Nginx+FastCGI 的整个运作过程。

三、 spawn-fcgi 与 PHP-FPM

前面介绍过, FastCGI 接口方式在脚本解析服务器上启动一个或者多个守护进程对动态脚本进行解析,这些进程就是 FastCGI 进程管理器,或者称之为 FastCGI 引擎, spawn-fcgi 与 PHP-FPM 就是支持 PHP 的两个 FastCGI 进程管理器。
下面简单介绍 spawn-fcgi 与 PHP-FPM 的异同。
 

spawn-fcgi 是 HTTP 服务器 lighttpd 的一部分,目前已经独立成为一个项目,一般与 lighttpd 配合使用来支持 PHP ,但是 ligttpd 的 spwan-fcgi 在高并发访问的时候,会出现内存泄漏甚至自动重启 FastCGI 的问题。
 

Nginx 是个轻量级的 HTTP server ,必须借助第三方的 FastCGI 处理器才可以对 PHP 进行解析,因此 Nginx+spawn-fcgi 的组合也可以实现对 PHP 的解析,这里不过多讲述。
 

PHP-FPM 也是一个第三方的 FastCGI 进程管理器,它是作为 PHP 的一个补丁来开发的,在安装的时候也需要和 PHP 源码一起编译,也就是说 PHP-FPM 被编译到 PHP 内核中,因此在处理性能方面更加优秀;同时它在处理高并发方面也比 spawn-fcgi 引擎好很多,因此,推荐 Nginx+PHP/PHP-FPM 这个组合对 PHP 进行解析。
 

FastCGI 的主要优点是把动态语言和 HTTP Server 分离开来,所以 Nginx 与 PHP/PHP-FPM 经常被部署在不同的服务器上,以分担前端 Nginx 服务器的压力,使 Nginx 专一处理静态请求和转发动态请求,而 PHP/PHP-FPM 服务器专一解析 PHP 动态请求。

四、 PHP 与 PHP-FPM 的安装及优化

1. 下载安装包
从 www.php.net 官方网站下载 PHP 源码包,这里下载的是稳定版 php-5.2.13.tar.gz 。
从 http://php-fpm.org/downloads/ 下载对应的 PHP-FPM 源码包,这里下载的是 php-5.2.13-fpm-0.5.13.diff.gz 。
需要注意,在下载软件包版本时,尽量使 PHP 和 PHP-FPM 版本一致,如果版本之间相差太大,可以会出现兼容问题。

2. 配置安装环境
安装 PHP 需要下面软件包的支持,如果没有安装,请自行安装。

1.     gcc gcc-c++ libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel  zlib zlib-devel glibc glibc-devel glib2 glib2-devel   

由于各个 Linux 系统版本的不确定性,读者也可以在安装 PHP 过程中,根据错误提示信息,安装对应的软件库。

3. 开始编译安装 PHP 和 PHP-FPM
编译安装 PHP 和 PHP-FPM 很简单,下面是安装过程:

1.     [root@localhost local]#tar zxvf php-5.2.13.tar.gz  

2.    [root@localhost local]#gzip -cd php-5.2.13-fpm-0.5.13.diff.gz | patch -d php-5.2.13 -p1

3.     [root@localhost local]#cd php-5.2.13  

4.    [root@localhost php-5.2.13]#./configure  --prefix=/usr/local/php --enable-fastcgi --enable-fpm

5.     [root@localhost php-5.2.13]#make  

6.    [root@localhost php-5.2.13]#make install

7.     [root@localhost php-5.2.13]cp php.ini-dist /usr/local/php/lib/php.ini  

其中,第二步将 PHP-FPM 作为补丁加入 PHP 源码中。
在 “./configure” 编译选项中,指定将 PHP 安装到 /usr/local 下, “--enable-fastcgi” 是启用对 PHP 的 FastCGI 支持, “--enable-fpm” 是激活对 FastCGI 模式的 fpm 支持。
在编译 PHP 时可以加入很多编译选项,但是这里为了介绍 PHP 的 FastCGI 功能没有加入更多的编译选项。

4. 配置与优化 PHP-FPM
PHP
的全局配置文件是 php.ini ,在上面的步骤中,已经将此文件复制到了 /usr/local/php/lib/php.ini 下。可以根据每个应用需求的不同,对 php.ini 进行相应的配置。
下面重点介绍 PHP-FPM 引擎的配置文件。
 

根据上面指定的安装路径, PHP-FPM 的默认配置文件为 /usr/local/php/etc/php-fpm.conf 。
php-fpm.conf
是一个 XML 格式的纯文本文件,其内容很容易看明白。这里重点介绍几个重要的配置标签:
 

标签 listen_address 是配置 fastcgi 进程监听的 IP 地址以及端口,默认是 127.0.0.1:9000 。
<value name="listen_address">127.0.0.1:9000</value>
 

标签 display_errors 用来设置是否显示 PHP 错误信息,默认是 0 ,不显示错误信息,设置为 1 可以显示 PHP 错误信息。
<value name="display_errors">0</value>
 

标签 user 和 group 用于设置运行 FastCGI 进程的用户和用户组。需要注意的是,这里指定的用户和用户组要和 Nginx 配置文件中指定的用户和用户组一致。
<value name="user">nobody</value>
<value name="group">nobody</value>
 

标签 max_children 用于设置 FastCGI 的进程数。根据官方建议,小于 2GB 内存的服务器,可以只开启 64 个进程, 4GB 以上内存的服务器可以开启 200 个进程。
<value name="max_children">5</value>
 

标签 request_terminate_timeout 用于设置 FastCGI 执行脚本的时间。默认是 0s ,也就是无限执行下去,可以根据情况对其进行修改。
<value name="request_terminate_timeout">0s</value>
 

标签 rlimit_files 用于设置 PHP-FPM 对打开文件描述符的限制,默认值为 1024 。这个标签的值必须和 Linux 内核打开文件数关联起来,例如要将此值设置为 65535 ,就必须在 Linux 命令行执行 'ulimit -HSn 65536' 。
<value name="rlimit_files">1024</value>
 

标签 max_requests 指明了每个 children 最多处理多少个请求后便会被关闭,默认的设置是 500 。
<value name="max_requests">500</value>
 

标签 allowed_clients 用于设置允许访问 FastCGI 进程解析器的 IP 地址。如果不在这里指定 IP 地址, Nginx 转发过来的 PHP 解析请求将无法被接受。
<value name="allowed_clients">127.0.0.1</value>

5. 管理 FastCGI 进程
在配置完 php-fpm 后,就可以启动 FastCGI 进程了。启动 fastcgi 进程有两种方式:

1.     /usr/local/php/bin/php-cgi --fpm   

2.    或者

3.     /usr/local/php/sbin/php-fpm  start  

建议采用第二种方式启动 FastCGI 进程。
 /usr/local/php/sbin/php-fpm
还有其他参数,具体为 start|stop|quit|restart|reload|logrotate 。
每个启动参数的含义如下:

1.     q  start,启动 PHP的 FastCGI进程。  

2.    q stop,强制终止PHP的FastCGI进程。

3.     q  quit,平滑终止 PHP的 FastCGI进程。  

4.    q restart, 重启PHP的FastCGI进程。

5.     q  reload,  重新加载 PHP的 php.ini。  

6.    q logrotate, 重新启用log文件。

reload 是个很重要的参数,它可以在 PHP 的 FastCGI 进程不中断的情况下重新加载改动过的 php.ini ,因此通过 php-fpm 可以平滑变更 FastCGI 模式下的 PHP 设置。


在 FastCGI 进程启动后,其监听的 IP 地址和端口也随即启动,可以通过 ps 和 netstat 查看相关信息。

1.      [root@localhost php]# netstat -antl|grep 9000  

2.    tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN

3.     [root@localhost php]# ps -ef|grep php-cgi  

4.    root      3567     1     0  17:06 ?       00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf

5.     nobody    3568  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  

6.    nobody    3569  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf

7.     nobody    3570  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  

8.    nobody    3571  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf

9.     nobody    3572  3567  0  17:06 ?        00:00:00 /usr/local/php/bin/php-cgi --fpm --fpm-config /usr/local/php/etc/php-fpm.conf  

10. root      3583  3524  0 17:09 pts/1    00:00:00 grep php-cgi

五、配置 Nginx 来支持 PHP
Nginx 的安装特别简单,前面已经对此进行了详细介绍,这里不再进行讲述。下面重点介绍 Nginx 如何通过 php-fpm 的 FastCGI 进程对 PHP 进行解析处理。
由于N ginx 本身不会对 PHP 进行解析,因此要实现 Nginx 对 PHP 的支持,其实是将对 PHP 页面的请求交给 fastCGI 进程监听的 IP 地址及端口。如果把 php-fpm 当做动态应用服务器,那么 Nginx 其实就是一个反向代理服务器。 Nginx 通过反向代理功能实现对 PHP 的解析,这就是 Nginx 实现 PHP 动态解析的原理。
这里假定 Nginx 的安装目录为 /usr/local ,则 Nginx 配置文件的路径为 /usr/local/nginx/conf/nginx.conf 。下面是在 Nginx 下支持 PHP 解析的一个虚拟主机配置实例。

1.             server {  

2.     include port.conf;

3.      server_name www.ixdba.net ixdba.net;  

4.

5.       location / {  

6.     index index.html index.php;

7.      root /web/www/www.ixdba.net;  

8.     }

9.      

10.  location ~ \.php$ {

11.             root           html;  

12.             fastcgi_pass   127.0.0.1:9000;

13.             fastcgi_index  index.php;  

14.             fastcgi_param  SCRIPT_FILENAME  html$fastcgi_script_name;

15.             include        fastcgi_params;  

16.         }

17. }  

18.

通过 location 指令,将所有以 php 为后缀的文件都交给 127.0.0.1:9000 来处理,而这里的 IP 地址和端口就是 FastCGI 进程监听的 IP 地址和端口。
fastcgi_param
指令指定放置 PHP 动态程序的主目录,也就是 $fastcgi_script_name 前面指定的路径,这里是 /usr/local/nginx/html 目录,建议将这个目录与 Nginx 虚拟主机指定的根目录保持一致,当然也可以不一致。
fastcgi_params
文件是 FastCGI 进 程的一个 站长博客 参数配置文件 ,在安装 Nginx 后,会默认生成一个这样的文件,这里通过 include 指令将 FastCGI 参数配置文件包含了进来。
接下来,启动 nginx 服务。
/usr/local/nginx/sbin/nginx
到此为止, Nginx+PHP 已经配置完成。

六、测试 Nginx 对 PHP 的解析功能
这里在 /usr/local/nginx/html 目录下创建一个 phpinfo.php 文件,内容如下:
<?php phpinfo(); ?>
然后通过浏览器访问 http://www.ixdba.net/index.html ,默认会在浏览器显示 “Welcome to Nginx!” 表示 Nginx 正常运行。
接着在浏览器中访问 http://www.ixdba.net/phpinfo.php ,如果 PHP 能够正常解析,会出现 PHP 安装配置以及功能列表统计信息。

七、实例讲解 Nginx 中 FastCGI 参数的优化
在配置完成 Nginx+FastCGI 之后,为了保证 Nginx 下 PHP 环境的高速稳定运行,需要添加一些 FastCGI 优化指令。下面给出一个优化实例,将下面代码添加到 Nginx 主配置文件中的 HTTP 层级。

1.     fastcgi_cache_path /usr/local/nginx/fastcgi_cache  levels = 1 :2  keys_zone = TEST :10m  inactive = 5m ;    

2.    fastcgi_connect_timeout 300;

3.     fastcgi_send_timeout 300;    

4.    fastcgi_read_timeout 300;

5.     fastcgi_buffer_size 64k;    

6.    fastcgi_buffers 4 64k;

7.     fastcgi_busy_buffers_size 128k;    

8.    fastcgi_temp_file_write_size 128k;

9.     fastcgi_cache TEST;    

10. fastcgi_cache_valid 200 302 1h;

11. fastcgi_cache_valid 301 1d;    

12. fastcgi_cache_valid any 1m;

下面是对上述代码的含义进行介绍。
第一行代码是为 FastCGI 缓存指定一个文件路径、目录结构等级、关键字区域存储时间和非活动删除时间。
fastcgi_connect_timeout
指定连接到后端 FastCGI 的超时时间。
fastcgi_send_timeout
指定向 FastCGI 传送请求的超时时间,这个值是已经完成两次握手后向 FastCGI 传送请求的超时时间。
fastcgi_read_timeout
指定接收 FastCGI 应答的超时时间,这个值是已经完成两次握手后接收 FastCGI 应答的超时时间。

fastcgi_buffer_size 用于指定读取 FastCGI 应答第一部分需要用多大的缓冲区,这个值表示将使用 1 个 64KB 的缓冲区读取应答的第一部分(应答头),可以设置为 fastcgi_buffers 选项指定的缓冲区大小。

fastcgi_buffers 指定本地需要用多少和多大的缓冲区来缓冲 FastCGI 的应答请求。如果一个 PHP 脚本所产生的页面大小为 256KB ,那么会为其分配 4 个 64KB 的缓冲区来缓存;如果页面大小大于 256KB ,那么大于 256KB 的部分会缓存到 fastcgi_temp 指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中 PHP 脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为 256KB ,那么可以把这个值设置为 “16 16k” 、 “4 64k” 等。

fastcgi_busy_buffers_size 的默认值是 fastcgi_buffers 的两倍。

fastcgi_temp_file_write_size 表示在写入缓存文件时使用多大的数据块,默认值是 fastcgi_buffers 的两倍。

fastcgi_cache 表示开启 FastCGI 缓存并为其指定一个名称。开启缓存非常有用,可以有效降低 CPU 的负载,并且防止 502 错误的发生,但是开启缓存也会引起很多问题,要视具体情况而定。
fastcgi_cache_valid
、 fastcgi 用来指定应答代码的缓存时间,实例中的值表示将 200 和 302 应答缓存一个小时,将 301 应答缓存 1 天,其他应答均缓存 1 分钟。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69992957/viewspace-2755235/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: MYSQL 入门全套
下一篇: php开发memcached
请登录后发表评论 登录
全部评论
只有兴趣才能萌生出动力。

注册时间:2021-01-10

  • 博文量
    23
  • 访问量
    11575