Nginx配置PHP

FastCGI简介

php-fpm全名是PHP FastCGI进程管理器;Nginx本身不能执行PHP程序,因此需要依赖FastCGI对PHP程序进行解释执行;如下图:


/etc/php-fpm.conf 是php-fpm的主配置文件,/etc/php-fpm.d/www.conf 是其它配置文件;

/etc/php-fpm.d目录下的所有配置文件在主配置文件 /etc/php-fpm.conf 中被引入,类似Nginx的配置文件形式。

php-fpm启动后会先读php.ini,再读php-fpm配置,php-fpm会覆盖php.ini配置;

php-fpm启动后会创建一个master进程,监听9000端口(可配置),master进程根据/etc/php-fpm.d/www.conf配置创建若干子进程,子进程用于处理实际业务;当有客户端(比如nginx)来连接9000端口时,空闲子进程会自己去接收处理,若子进程全部处于忙碌状态,新进的待accept连接会被master放进队列里,等待fpm子进程空闲;这个存放待accept的半连接的队列长度由 listen.backlog 配置。


安装PHP-FPM

安装PHP-FPM,以使用nginx支持php项目(PHP 与 PHP-FPM 版本必须保持一致)

## 安装
yum -y install php-fpm
## 启动
systemctl start php-fpm
## 开机启动
systemctl enable php-fpm
## 查看运行情况
netstat -nlpt | grep php-fpm

## 查看php-frpm版本,以及是否安装成功
php-fpm -v
## 输出结果如下:
PHP 7.3.33 (fpm-fcgi) (built: Nov 16 2021 11:18:28)
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.33, Copyright (c) 1998-2018 Zend Technologies
    with Xdebug v3.0.4, Copyright (c) 2002-2021, by Derick Rethans

常用命令:

## 启动
systemctl start php-fpm
## 重启
systemctl restart php-fpm
## 开机启动
systemctl enable php-fpm
## 状态,可查看当前运行的所有子进程、空闲进程、请求数量、数据流量等
systemctl status php-fpm
## 检查配置
php-fpm -t

配置Nginx

server {
    listen 443 ssl http2 default backlog=1024;
    server_name admin.sidoc.cn;
    charset utf-8;

    ## 匹配所有请求
    location / {  
       root   /usr/share/nginx/html;  
       index  index.html index.htm index.php;  
    } 

    ## 匹配后缀为.php的请求
    location ~ \.php$ {  
        root           html;  
        fastcgi_pass   127.0.0.1:9000; ## 设置FastCGI服务器的地址
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name## 向fastcgi传递请求参数
        include        fastcgi_params; ## 引入fastcgi_params内的配置
    }
}


性能优化

1. 为了节约内存,应尽量减少PHP模块的安装数量

2. 调高 linux 内核能够打开的文件数量

## a.查看Linux内核最多能打开的文件数量
ulimit -n
## b.执行如下命令,提高上限
echo ulimit -HSn 65536 >> /etc/profile
echo ulimit -HSn 65536 >> /etc/rc.local
## b.使用之生效
source /etc/profile
## c.验证
ulimit -n

以上若未能生,可以在 /etc/security/limits.conf 文件的最后加上如下两句:

soft nofile 51200
hard nofile 51200


调整Socket请求积压的队列长度

Nginx收到客户端请求后,会将请求转到监听在9000端口上的php-fpm,然后php-fpm的子进程处理请求,若php-fpm的所有子进程全部处于忙绿状态,则php-fpm会将新进的请求放进队列里,等待fpm子进程空闲时处理;这个存放待accept的半连接的队列长度由 listen.backlog 字段配置;如果请求在backlog队列中等待时间过久,会导致Nginx报“504 gateway timeout”超时错误;如果Nginx报请求超时后,php-fpm才处理完请求返回给nginx,会因为TCP连接已经断开而报“Broken pipe”错误;如果backlog队列长度设定的太小,很快就被待accept的请求占满,则新进的请求将无法被php-fpm接收处理,会导致nginx报“502 Bad Gateway”错误。

通常建议将 listen.backlog 设定在 1024 以上,如下是配置方式:

在 nginx 配置的端口监听后加“default backlog=1024”,如下:

listen 80 default backlog=1024;

在php-fpm中配置 listen.backlog 为 1024

listen.backlog 1024


php-fpm进程管理

可同时开启多个php-fpm进程来处理请求,一个php-fpm进程同一时间只能处理一个请求;php-fpm的进程管理有两个方式,即动态管理和静态管理;


动态进程管理:是php-fpm根据请求数量自动动态调整进程数量,以满足实际需要;跟 Apache 一样,运行的 PHP 程序执行完成后,或多或少都会有内存泄露,这也是为什么开始一个进程只占 3M 左右内存,运行一段时间后就会上升到 20-30M 的原因了;所以在配置进程数量时,通常以一个进程占用30M内存来进行计算。


静态进程管理:是在配置中设定一个固定的进程数量,php-fpm就一直使用这些固定数量的进程来处理请求;此法不需要动态控制进程数量,因此性能和稳定性都相对较好,推荐使用。


由于一个进程最大可能占用30M内存,因此用本机内存大小除以30M,就能得到本机能够开启的最大进程数量;例如,以2G内存的电脑为例,其能够开启的进程数量为:2048M/30M  68;配置如下:

## 打开配置文件

## 静态进程管理方式
pm = static
## 静态方式下配置 php-fpm 进程数量
pm.max_children = 68; 


进程最大请求数配置

pm.max_requests = 10240;

当一个php-cgi进程处理的请求数达到这个配置后,则会自动重启该进程,将内存释放给操作系统,避免内存泄漏导致系统宕机。


配置php-fpm子进程运行的用户

vim /etc/php-fpm.d/www.conf

找到以下三行代码并修改如下

user = nginx 
group = nginx 

listen.owner = nignx
listen.group = nginx
listen.mode = 0660


开启慢日志

slowlog = /usr/local/var/log/php-fpm.log.slow
request_slowlog_timeout = 3s

当某个请求的时间超过了3秒,就会在慢日志中记录相应的记录,注意上面的时间3s,不能忽略了单位,相应的还有其他单位,m分,h时;


实时查看及监控PHP-FPM的运行状态

https://www.xiaole88.com/archives/58/


举报

© 著作权归作者所有


1