Apache http2配置php-fpm总结

httpd2不能处理PHP文件,处理php是需要单独的php解析程序,以前我是通过在httpd2里面增加一个模块来进行处理(LoadModule加载模块),但是这种方法耦合有点大,这次就用了php-fpm,httpd2接收到php后,转发给php-fpm进程进行处理。

环境介绍

  • 操作系统: centos-release-7-3.1611.el7.centos.x86_64
  • Apache httpd: Apache/2.4.43 (Unix), 安装在了/usr/httpd/
  • PHP: PHP 7.4.5 (待安装)

步骤说明

  • 安装PHP 7.4.5
  • 安装php-fpm
  • 配置apache httpd2,使其php请求转到php-fpm处理
【安装PHP 7.4.5】
  1. 创建文件夹 /usr/local/php7.4.5, 下载php压缩包wget https://www.php.net/distributions/php-7.4.5.tar.gz。解压到当前文件夹,在当前文件夹下就有了php的解压文件,下一步就是需要编译。

  2. 进入到php的源码文件,我这里是 /usr/local/php7.4.5/php-7.4.5/,在此文件夹执行 ./configure --prefix=/usr/local/php7.4.5/ --enable-fpm --with-apxs2=/usr/httpd/bin/apxs --with-zlib-dir=/usr/lib64 --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd


    --with-apxs2:这个参数看到有的文章说需要fastcgi模式的话,就不能配置这个,其实也不完全是这样,这个参数的用途只不过是把php的解释模块编译成so文件添加到apache的modules中,并且自动添加到conf文件。如果我们不想用模块模式的话,在httpd.conf中把LoadModule php7_module给注释掉就行。

    –enable-fastcgi,–enable-force-cgi-redirect:网上说这2个编译参数是在php以前的版本需要,php新版本已经内置支持,所以不需要加这2个参数了。


    –with-mysql:这个编译参数再php7已经废弃了,要改用–with-pdo-mysql,但是单用–with-pdo-mysql也不行,需要和mysqlnd配合。


    –prefix:编译后的文件存放位置,编译后会产生一些执行文件,比如php,php-fpm等。

  3. 正常情况下到这里就结束了,但是由于依赖软件的缺失,这里可能会报错,比如我编译报了 configure: error: libxml2 not found. Please check your libxml2 installation. ,我的环境是X86的,所以安装libxml2-devel,yum install libxml2-devel.x86_64
    在这里插入图片描述

  4. make && make install安装成功,然后再/usr/httpd/conf里面将httpd.conf,从php-7.4.5文件夹(源码)中复制php.ini.production到安装目录,改为php.ini,这个是php的配置文件,后期有动态加载的模块都在这里面写。
    Apache http2配置php-fpm总结_第1张图片

【安装php-fpm】
  1. 进入刚才php编译后的文件夹内/usr/local/php7.4.5/,里面有etc和sbin文件夹,etc里面存放的就是php-fpm的配置文件,进入usr/local/php7.4.5/etc,复制php-fpm.conf.defaultphp-fpm.conf到当前文件夹,然后进入/usr/local/php7.4.5/etc/php-fpm.d,复制www.conf.default[自定名称].conf,我这里是kiramario.conf,然后vim kiramario.conf,将 [www] 改为 [kiramario]。其他配置可酌情设置,具体参数可以参照下面的网站。
    Apache http2配置php-fpm总结_第2张图片
    Apache http2配置php-fpm总结_第3张图片
    在这里插入图片描述


    官网:https://www.php.net/manual/zh/install.fpm.configuration.php

    参考博文:https://blog.csdn.net/Derek_Yam/article/details/89474827


    个人理解:
    [global]下面的就表示是公共的配置,php-fpm.conf文件里面的pool definition下面有一段include=/usr/local/PHP/etc/php-fpm.d/*.conf ,php-fpm.d文件夹放置子进程池的配置信息,比如www.conf,在启动的时候,此文件的配置会和php-fpm的配置一起加载到内存,当然也可以直接把www.conf的内容拷过来贴在php-fpm后面pool definition部分,把www.conf看成是php-fpm的下一段内容即可。这样写是方便以后扩展不同的子进程池配置,比如以后要增加别的子进程,叫kiramario,就添加个kiramario.conf,把配置文件里的[www]改为[kiramario],填上相应的端口信息等配置信息即可。
    Apache http2配置php-fpm总结_第4张图片

    可以如此理解:
    [global]
    pid = /usr/local/php/var/run/php-fpm.pid
    error_log = /usr/local/php/var/log/php-fpm.log
    省略
    [www]
    listen = /tmp/php-fcgi.sock
    listen.mode = 666
    user = nobody
    group = nobody
    省略
    [kiramario]
    listen = /tmp/php-fcgi2.sock
    listen.mode = 666
    user = nobody
    group = nobody
    省略


    注意:”这里不能配置user和group为root,否则会报 ERROR: please specify user and group other than root。nobody是一个普通用户,非特权用户,就像Windows系统中的内置帐户一样在按照linux的时候自动建立一些用户帐户。用nobody用户名的目的是使任何人都可以登录系统,只能访问人人皆可读写的文件。其次当服务器向外服务时,可能会让用户以nobody的身份登录,这个用户的权限也给配置的很低,因此有比较高的安全性。

  2. /usr/local/php7.4.5/下创建个log文件夹,因为配置的时候指定了日志记录位置是这个。

  3. 执行./php-fpm -c /usr/local/php7.4.5/php.ini -y /usr/local/php7.4.5/etc/php-fpm.conf,按照配置文件php.ini和php-fpm启动php-fpm,然后ps aux | grep php-fpm发现进程已经启动。在这里插入图片描述

配置apache httpd2,使其php请求转到php-fpm处理
  1. 加载mod_proxy.somod_proxy_fcgi.somod_rewrite.so模块,将LoadModule php7_module modules/libphp7.so注释掉。
    在这里插入图片描述在这里插入图片描述

  2. 在 IfModule mime_module加上AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .php
    Apache http2配置php-fpm总结_第5张图片

  3. 设置项目目录,我在httpd的安装位置加了个www文件夹/usr/httpd/www,将项目地址放在这里,index.php作为默认访问文件。在http.conf设置项目目录为www和默认文件index.php。

    在这里插入图片描述Apache http2配置php-fpm总结_第6张图片在这里插入图片描述

  4. 打开虚拟主机设置添加 Include conf/extra/httpd-vhosts.conf在http.conf目录下的extra目录里面,找到http-vhosts.conf,配置虚拟主机。
    在这里插入图片描述
    Apache http2配置php-fpm总结_第7张图片

  5. 登录网站查看到服务启动成功。Apache http2配置php-fpm总结_第8张图片


我在配置好虚拟主机后,登录网站一直显示file not found,一直没有找到原因,最后发现是因为我拷贝的别人的虚拟主机配置,别人是这么写的:ProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/www/$1,这里就是将 php文件请求,跳转到fcgi://127.0.0.1:9000/去处理,访问主页 XXX.XX.XX.XXX/index.php的时候,$1就是index.php,会被转成fcgi://127.0.0.1:9000/www/index.php,而我的的网站项目目录是/usr/httpd/www,因此将这里改成fcgi://127.0.0.1:9000/usr/httpd/www/$1就正常了

你可能感兴趣的:(环境配置,问题解决,linux,php,apache,fastcgi,centos)