fastcgi : php-fpm
fastcgi简介
-
1.httpd+php结合的方式:
module: php
fastcgi : php-fpm -
2.fastcgi:php-fpm的工作机制
-
module:php
Apache本身不具有处理php程序的能力,但是php以Apache模块的方式加载httpd中,使其具有了处理php程序的能力,但是以模块方式需要依附于Apache,性能并不能很好的发挥, 在处理php程序时,Apache需要开启子进程,处理完成php程序之后子进程又关闭。之后用户如果再访问php资源,将继续开启子进程,处理完成之后又关闭。而fastcgi的的机制与其就不一样。 -
fastcgi : php-fpm
以独立的程序在centos7上监听9000端口,专门用于处理php资源,而不是依附于Apache的模块,如果本机通信的话可以实现走socket的方式。
-
-
3.httpd ---- php-fpm ---- mysql的LAMP架构
centos6和7对php-fpm的支持
-
CentOS 6:
PHP-5.3.2之前:默认不支持fpm机制;需要自行打补丁并编译安装
httpd-2.2:默认不支持fcgi协议,需要自行编译此模块
解决方案:编译安装httpd-2.4, php-5.3.3+ -
CentOS 7:
httpd-2.4:rpm包默认编译支持fcgi模块
php-fpm包:专用于将php运行于fpm模式
fastcgi的实现
- php包和fastcgi均是提供php程序的处理能力,属于冲突的两个软件包。
2.fastcgi的实现
- 1.确保未安装php,如果安装先卸载php
- 2.yum install php-fpm (php-fpm是fastcgi的具体实现)
其中对php-fpm软件包进行分析/usr/lib/systemd/system/php-fpm.service 以独立服务的方式处理php程序
/etc/php-fpm.conf php-fpm的配置文件
/etc/php-fpm.d php-fpm的配置文件目录
/etc/php-fpm.d/www.conf php-fpm的一些关键配置
配置文件详解:
# vim /etc/php-fpm.d/www.conf
....
listen = 127.0.0.1:9000 设置php-fpm的监听端口和监听地址
;'/path/to/unix/socket' - to listen on a unix socket. 可以设置为socket套接字,centos8默认在安装php时默认安装php-fpm,以套接字的方式实现httpd和php-fpm进程间通信。
centos8的监听配置:listen = /run/php-fpm/www.sock
.....
listen.allowed_clients = 127.0.0.1 默认谁可以作为php-fpm的客户端 当php-fpm和httpd即LAP不是在同一服务器实现时,此选项需要注释远程htppd才能作为php-fpm的客户端
; Default Value: any 此是默认选项
....
user = apache
group = apache php-fpm进程的用户,因为httpd和php-fpm均访问的资源在同一目录下,若源码编译安装php-fpm时,此时用户身份需要和httpd进程的用户身份一致,均为apache。若httpd和php-fpm部署在不同主机,建议将apache的uid也一致比较好。
....
pm.max_children = 50
pm.start_servers = 5
pm.min_spare_servers = 5
.....进程开启的默认数目,最大空闲,最少空闲等等,与httpd一样,工作时根据生产需求开启。
.....
生产范例:
cat /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 #监听地址及IP
listen.allowed_clients = 127.0.0.1 #允许客户端从哪个源IP地址访问,要允许所有行首加 ;注释即可
user = apache #php-fpm启动的用户和组,会涉及到后期文件的权限问题
group = apache
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的文件路径
-
- fcgi服务配置文件:/etc/php-fpm.conf, /etc/php-fpm.d/*.conf
- 官方文档:http://php.net/manual/zh/install.fpm.configuration.php
- 连接池: pm = static|dynamic
static:固定数量的子进程;pm.max_children
dynamic:子进程数量以动态模式管理,默认值
pm.max_children = 50
pm.start_servers =5
pm.min_spare_servers =5
pm.max_spare_servers =35
pm.max_requests = 500 每个进程可以处理的请求数 - 确保运行php-fpm进程的用户对session目录有读写权限
mkdir /var/lib/php/session
chown apache.apache /var/lib/php/session
PHP-FPM常见配置
daemonize = no //是否将程序运行在后台
listen = 127.0.0.1:9000 //FPM 监听地址
listen = /var/run/php.sock //UDF模式使用
listen.mode= 0666 //UDF模式使用
listen.backlog = -1 //等待队列的长度 -1表示无限制
listen.allowed_clients = 127.0.0.1 //仅允许哪些主机访问
pm = dynamic //PM是动态运行还是静态运行
//static 固定数量的子进程,pm.max_childen
//dynamic子进程数据以动态模式管理
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
pm.max_requests = 500
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
//设置session存放位置
php-fpm的会话问题:
httpd无状态的解决办法是cookie,session等保存用户信息,其中php-fpm保存session信息的目录 /var/lib/php/session 。
session信息可能导致的问题:
如果LAP服务器压力较大时,将会利用拆分的方法,将LAP服务器水平扩展,那么session怎么办?
session的解决办法:
①判断用户是不是同一用户,如果是同一用户,那么前端代理调度时就一直往其session信息所在的LAP主机调度。
如何判断同一用户?cookie信息,代理服务器配置
②session共享:将session目录放于共享的服务器上,然后将将session服务器挂载至多组LAP上。实现session共享!
③session同步:有session信息产生就同步至其他LAP,但是这样导致session信息重复占用磁盘空间,没有session共享好。
但是如果session共享如果是放于文件夹,磁盘路径放置session信息时,由于磁盘性能不好,一般解决办法是php可以实现基于内存的session存放路径,即使用专门的软件:redis
即php将来安装插件:将session放置于redis服务器上。
-
3.启动php-fpm:systemctl start php-fpm
其监听端口:127.0.0.1:9000 默认是本机的9000端口 -
4.配置httpd,使其知道接收到用户对php资源的请求时,交给php-fpm程序处理
- 在/etc/httpd/conf.d/fcgi.conf中配置如下:
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
UDS(unix domain socket)方式
ProxyPassMatch ^/(.*\.php)$ unix:/var/run/php.sock|fcgi://localhost/app/httpd24/htdocs/$1- 参看:http://httpd.apache.org/docs/2.4/mod/mod_proxy_fcgi.html
- 注意:在HTTPD服务器上必须启用proxy_fcgi_module模块,充当PHP客户端
httpd –M |grep fcgi
cat /etc/httpd/conf.modules.d/00-proxy.conf
- 在/etc/httpd/conf.d/fcgi.conf中配置如下:
1) 配置httpd,添加/etc/httpd/conf.d/fcgi.conf 配置文件
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
UDS(unix domain socket)方式
ProxyPassMatch ^/(.*\.php)$
unix:/var/run/php.sock|fcgi://localhost/app/httpd24/htdocs/$1
2) 虚拟主机配置
vim /etc/httpd/conf.d/vhosts.conf
DirectoryIndex index.php
<VirtualHost *:80>
ServerName www.b.net
DocumentRoot /apps/vhosts/b.net
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/apps/vhosts/b.net/$1
<Directory "/apps/vhosts/b.net">
Options None
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
安装较新版本的php-fpm
【1.yum源安装】
- 清华大学yum源安装较新版的PHP-FPM(依赖EPEL源)
- https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
- yum install php56-php-fpm php56-php-mysql
- yum install php73-php-fpm php73-php-mysql
- yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm 将php-fpm的各版本的yum仓库均配置好
利用yum仓库安装php-fpm73
1.安装php-fpmyum仓库
# yum install https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
2.启用php73仓库
# vim /etc/yum.repos.d/remi-php73.repo
[remi-php73]
enabled=1
3.安装php-fpm73
# yum install -y php73-php-fpm
4.查看php73-php-fpm包提供的文件
# rpm -ql php73-php-fpm
/usr/lib/systemd/system/php73-php-fpm.service server文件
配置文件:
/etc/opt/remi/php73/php-fpm.conf
/etc/opt/remi/php73/php-fpm.d
/etc/opt/remi/php73/php-fpm.d/www.conf
5.安装httpd、并配置httpd
# yum install -y httpd
# vim /etc/httpd/conf.d/fastcgi.conf
DirectoryIndex index.php
ProxyRequests Off
ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/var/www/html/$1
6.启动httpd和=php73-php-fpm.service
# systemctl start httpd php73-php-fpm
7.测试:httpd能否处理php资源请求,php能否连接数据库
需要连接数据库需要安装:php73-php-mysqlnd,然后重启php73-php-fpm程序
【2.源码安装较新版本的php-fpm】
- 源码编译安装php-fpm在源码安装LAMP中一起涉及,此处不再累述