Nginx-FastCGI

简介 

CGI的由来:

最早的Web服务器只能简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html文件,但是后期随着网站功能增多网站开发也越来越复杂,以至于出现动态技术,比如像php(1995年)、java(1995)、python(1991)语言开发的网站,但是nginx/apache服务器并不能直接运行 php、java这样的文件,apache实现的方式是打补丁,但是nginx缺通过与第三方基于协议实现,即通过某种特定协议将客户端请求转发给第三方服务处理,第三方服务器会新建新的进程处理用户的请求,处理完成后返回数据给Nginx并回收进程,最后nginx在返回给客户端,那这个约定就是通用网关接口(common gatewayinterface,简称CGI),CGI(协议) 是web服务器和外部应用程序之间的接口标准,是cgi程序和web服务器之间传递信息的标准化接口。

 

 CGI的通信方式

 为什么会有FastCGI?

 CGI协议虽然解决了语言解析器和seb server之间通讯的问题,但是它的效率很低,因为web server每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候再关闭进程,对于每一个创建的CGI进程都会执行这些操作,所以效率很低,而FastCGI是用来提高CGI性能的,FastCGI每次处理完请求之后不会关闭掉进程,而是保留这个进程,使这个进程可以处理多个请求。这样的话每个请求都不用再重新创建一个进程了,大大提升了处理效率。

 FastCGI通信方式:

 

 什么是PHP-FPM?

 PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个实现了Fastcgi的管理程序,并且提供进程管理的功能,进程包括master进程和worker进程,master进程只有一个,负责监听端口,接受来自web server的请求。worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进行PHP代码的处理。

 FastCGI配置指令

Nginx基于模块ngx_http_fastcgi_module实现通过fastcgi协议将指定的客户端请求转发至php-fpm处理,其配置指令如下:

fastcgi_pass address;
#转发请求到后端服务器,address为后端的fastcgi server的地址,可用位置:location, if in location
fastcgi_index name;

#fastcgi默认的主页资源,示例:fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];

#设置传递给FastCGI服务器的参数值,可以是文本,变量或组合,可用于将Nginx的内置变量赋值给自定义key,默认fastcgi_params已定义好
fastcgi_param REMOTE_ADDR     $remote_addr; #客户端源IP
fastcgi_param REMOTE_PORT     $remote_port; #客户端源端口
fastcgi_param SERVER_ADDR     $server_addr; #请求的服务器IP地址
fastcgi_param SERVER_PORT     $server_port; #请求的服务器端口
fastcgi_param SERVER_NAME     $server_name; #请求的server name

Nginx默认配置示例:
 location ~ \.php$ {
  root      html;
  fastcgi_pass  127.0.0.1:9000;
  fastcgi_index index.php;
  fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name; #默认脚本路径
  include    fastcgi_params;
 }

 缓存定义指令

fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size
[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time]
[manager_threshold=time] [loader_files=number] [loader_sleep=time]
[loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time]
[purger_threshold=time];

定义fastcgi的缓存;
path          #缓存位置为磁盘上的文件系统路径
max_size=size #磁盘path路径中用于缓存数据的缓存空间上限
levels=levels:#十六进制的缓存目录的层级数量,以及每一级的目录数量,levels=ONE:TWO:THREE,示
例:leves=1:2:2
keys_zone=name:size #设置缓存名称及k/v映射的内存空间的名称及大小
inactive=time       #缓存有效时间,默认10分钟,需要在指定时间满足fastcgi_cache_min_uses 次数被视为活动缓存。

缓存调用指令

fastcgi_cache zone | off;
#调用指定的缓存空间来缓存数据,可用位置:http, server, location
fastcgi_cache_key
string; #定义用作缓存项的key的字符串,示例:fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET
| HEAD | POST ...; #为哪些请求方法使用缓存
fastcgi_cache_min_uses number; #缓存空间中的缓存项在inactive定义的非活动时间内至少要被访问到此处所指定的次数方可被认作活动项
fastcgi_keep_conn on
| off; #收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启用长连接
fastcgi_cache_valid [code ...]
time; #不同的响应码各自的缓存时长
fastcgi_hide_header field; #隐藏响应头指定信息 fastcgi_pass_header field; #返回响应头指定信息,默认不会将Status、X
-Accel-...返回

FastCGI示例

Nginx与php-fpm在同一服务器

]# grep "^[a-Z]" /etc/php-fpm.conf
include=/etc/php-fpm.d/*.conf
pid = /run/php-fpm/php-fpm.pid
error_log = /var/log/php-fpm/error.log
daemonize = yes #是否后台启动
[root@s2 ~]# cat /etc/php-fpm.d/www.conf [www] listen = 127.0.0.1:9000  #监听地址及IP listen.allowed_clients = 127.0.0.1 #允许客户端从哪个源IP地址访问,要允许所有行首加 ;注释即可 user = nginx #php-fpm启动的用户和组,会涉及到后期文件的权限问题 group = nginx pm = dynamic #动态模式进程管理 pm.max_children = 500 #静态方式下开启的php-fpm进程数量,在动态方式下他限定php-fpm的最大进程数 pm.start_servers = 100 #动态模式下初始进程数,必须大于等于pm.min_spare_servers和小于等于 pm.max_children的值。 pm.min_spare_servers = 100 #最小空闲进程数 pm.max_spare_servers = 200 #最大空闲进程数 pm.max_requests = 500000 #进程累计请求回收值,会回收并重新生成新的子进程 pm.status_path = /pm_status #状态访问URL ping.path = /ping #ping访问动地址 ping.response = ping-pong #ping返回值 slowlog = /var/log/php-fpm/www-slow.log #慢日志路径 php_admin_value[error_log] = /var/log/php-fpm/www-error.log #错误日志 php_admin_flag[log_errors] = on php_value[session.save_handler] = files #phpsession保存方式及路径 php_value[session.save_path] = /var/lib/php/session #当时使用file保存session的文件路径

准备php测试页面

]# cat /data/nginx/php/index.php
<?php
  phpinfo();
?>

Nginx配置转发

location ~ \.php$ {
  root      /data/nginx/php; #$document_root调用root目录
  fastcgi_pass  127.0.0.1:9000;
  fastcgi_index index.php;
  #fastcgi_param SCRIPT_FILENAME /data/nginx/php$fastcgi_script_name;
  fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  #如果SCRIPT_FILENAME是绝对路径则可以省略root /data/nginx/php;
  include    fastcgi_params;
}

 FastCGI示例--Nginx与php不在同一个服务器

 nginx会处理静态请求,但是会转发动态请求到后端指定的php-fpm服务器,因此代码也需要放在后端的php-fpm服务器,即静态页面放在Nginx上而动态页面放在后端php-fpm服务器,正常情况下,一般都是采用6.3.2的部署方式。

 安装php

[root@s4 ~]# rpm -ivh https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm #包含较新的PHP等软件包
#[root@s4 ~]# yum install php56-php-fpm php56-php-mysql -y #安装指定版本的php
[root@s4 ~]# yum install php72-php-fpm php72-php-mysql -y
验证安装路径:
[root@s4 ~]# rpm -ql php72-php-fpm

 修改php-fpm监听配置

#php56修改监听配置
[root@s4 ~]# vim /opt/remi/php56/root/etc/php-fpm.d/www.conf
39 listen = 192.168.7.104:9000 #指定监听IP
65 #listen.allowed_clients = 127.0.0.1 #注释运行的客户端
#php72修改监听配置 [root@s4
~]# vim /etc/opt/remi/php72/php-fpm.d/www.conf user = apache //此用户必须和nginx为同一个用户 group = apache listen = 172.18.0.202:9000 ; listen.allowed_clients = 127.0.0.1

 Nginx配置转发

location ~ \.php$ { //不建议直接复制,windows空格在linux会报错
  root      /data/nginx/php;
  fastcgi_pass  192.168.7.104:9000;
  fastcgi_index index.php;
  #fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name;
  fastcgi_param SCRIPT_FILENAME  $document_root$fastcgi_script_name;
  include    fastcgi_params;
}

php-fpm 的运行状态页面

php-fpm配置文件开启状态

]# vim /etc/php-fpm.d/www.conf
120 ; Default Value: not set
121 pm.status_path = /status
137 ; Default Value: pong
138 ping.response = pong
132 ; Default Value: not set
133 ping.path = /ping

修改完重启php-fpm

访问配置文件里面指定的路径,会返回php-fpm的当前运行状态。

location ~ ^/(pm_status|ping)$ {
  #access_log off;
  #allow 127.0.0.1;
  #deny all;
  include fastcgi_params;
  fastcgi_pass 127.0.0.1:9000;
  fastcgi_param PATH_TRANSLATED $document_root$fastcgi_script_name;
}

测试

]# curl http://www.magedu.net/pm_status
pool:         www
process manager:   dynamic
start time:      06/Mar/2019:16:07:40 +0800
start since:      620
accepted conn:     3
listen queue:     0
max listen queue:   0
listen queue len:   128
idle processes:    99
active processes:   1
total processes:    100
max active processes: 1
max children reached: 0
slow requests:     0
[root@s2 ~]# curl http://www.magedu.net/ping
ping-pong
[root@s2 ~]# curl http://www.magedu.net/pm_status?full
[root@s2 ~]# curl http://www.magedu.net/pm_status?html
[root@s2 ~]# curl http://www.magedu.net/pm_status?json

pm.status_path 参数详解

后续可以用于监控

poolfpm 池子名称,大多数为www

process manager 进程管理方式,值:static, dynamic or ondemand. dynamic

start time 启动日期,如果reload了php-fpm,时间会更新

start since 运行时长

accepted conn 当前池子接受的请求数

listen queue 请求等待队列,如果这个值不为0,那么要增加FPM的进程数量

max listen queue 请求等待队列最高的数量

listen queue lensocket 等待队列长度

idle processes 空闲进程数量

active processes 活跃进程数量

total processes 总进程数量

max active processes 最大的活跃进程数量(FPM启动开始算)

max children reached 进程最大数量限制的次数,如果这个数量不为0,那说明你的最大进程数量太小了,请改大一点。

slow requests 启用了php-fpm slow-log,缓慢请求的数量

 

posted @ 2022-02-02 15:01  不会跳舞的胖子  阅读(228)  评论(0编辑  收藏  举报