fastcgi

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
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中一起涉及,此处不再累述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值