apache和php的两种组合方式,module和fpm

2024-08-24 06:38

本文主要是介绍apache和php的两种组合方式,module和fpm,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天我要记录的,是php与apache协同工作的两种方式。一是module模式,php作为apache的一个模块来运行,二是php的fpm模式,亦即php作为单独服务来受理apache的请求。这里只说编译安装。

1、module模式:

centos6自带的apache2.2,默认就是module模式,在配置文件/etc/httpd/conf.d/php.conf中能看到,Apache是加载了php模块。

编译安装:我常用的configure命令是:

 ./configure --prefix=/usr/local/php.mod --sysconf=/usr/local/php.mod/conf --with-config-file-path=/usr/local/php.mod/conf --with-config-file-scan-dir=/usr/local/php.mod/conf.d --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-mcrypt --with-bz2 --with-apxs2=/usr/local/apache/bin/apxs --enable-maintainer-zts

其中:

--prefix=/usr/local/php.mod 指定安装路径。我加了个mod后缀,说明是php-mod模式安装的。

--sysconf=/usr/local/php.mod/conf 指定配置文件路径,貌似默认就是这里,但我习惯写上,如果是指向不存在的路径,它会自动创建目录。

--with-config-file-path=/usr/local/php.mod/conf 和--with-config-file-scan-dir=/usr/local/php.mod/conf.d 也是指定配置文件路径,我觉得写上更严谨,明确它搜索配置文件的方式。

--with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd 用于连mysql,用php内置的mysqlnd驱动,都不用指mysql路径。

--with-apxs2=/usr/local/apache/bin/apxs 指明是模块化安装php,apxs是apache的接口,这里就指明php是如何成为apache的模块的。通过它可以找到.so模块文件的安装路径。如果是php-fpm模式,此项就不需要了。

--enable-maintainer-zts

指明支持worker或event的mpm模式,如果是php-fpm模式,此项就不需要。

下一步:编译安装以后,要确认apache配置文件中开启了php模块,亦即:

LoadModule php5_module modules/libphp5.so没有被注释,apache2.2当中,需要区分mpm:

<IfModule prefork.c>LoadModule php5_module modules/libphp5.so
</IfModule>
<IfModule worker.c>LoadModule php5_module modules/libphp5-zts.so
</IfModule>

apache2.4中实测不区分,不需要-zts后缀。所谓libphp.so这个模块文件,就是编译时--with-apxs2选项告诉它应该放在哪里的。

下面这三项一定要有。

AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phpsDirectoryIndex index.php

如果需要连接mysql,php.ini文件中的socket一定要指定准确。因为php-mod模式是作为apache的模块,所以配置好以后,启动或重载apache服务即可。

但是php.ini文件哪里来的呢?编译安装时不会自动有这个文件,而是在源码目录中,有两个文件:

php.ini-development,php.ini-production,一看便知。随便复制哪个过去,改名为php.ini即可。很多源码都有提供配置范例文件。

2、php-fpm模式:

编译安装时:我用的configure命令是这样:

./configure --prefix=/usr/local/php.fpm --sysconf=/usr/local/php.fpm/conf --with-config-file-path=/usr/local/php.fpm/conf --with-config-file-scan-dir=/usr/local/php.fpm/conf.d --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-openssl --enable-mbstring --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --enable-sockets --with-mcrypt --with-bz2 --enable-fpm

大部分跟php-mod模式一样。但是不一样的是:

--enable-fpm说明是fpm模式安装,取代了之前的--with-apxs2参数。既然不是apache模块,自然--enable-maintainer-zts也就不需要了,但是这一点我没验证,如果有兴趣可以看官方文档。

下一步:编译完成后,依然要配置。

php.ini还是要配置socket项。

php-fpm.conf中需要指明pid路径,要和服务脚本中的pid路径一致。也能看到php-fpm服务监听的ip和端口。根据需要配置即可。

apache配置文件中,要确认没有开启php模块,同时要开启proxy和proxy-fcgi模块。并添加:

ProxyRequests OffProxyPassMatch ^/(.*\.php)$ fcgi://127.0.0.1:9000/path/to/document_root/$1

这里是正则表达式应用,意思是把.php结尾的url过滤出来发给php-fpm,那个$1是对正则分组匹配结果的引用。

apache通过自身的代理模块,把接收到的php请求转发给php-fpm服务,再把php处理之后的结果发给客户端浏览器。相当于php另立门户,成了分包商,apache成了总包商。

如果转发失败,apache直接把.php发过去,客户端浏览器收到的是不能解析的内容,它会提示你另存到磁盘。

当然下面这几项也是需要的:

AddType application/x-httpd-php .phpAddType application/x-httpd-php-source .phpsDirectoryIndex index.php

由于php-fpm是单独的服务,因此,要把服务脚本文件样本sapi/fpm/init.d.php-fpm放到init.d目录中去,确认pid路径和php-fpm.conf中的一致,并赋予x权限。至此,service php-fpm start就可以运行了。

本文完。

这篇关于apache和php的两种组合方式,module和fpm的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1101728

相关文章

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

Linux脚本(shell)的使用方式

《Linux脚本(shell)的使用方式》:本文主要介绍Linux脚本(shell)的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录概述语法详解数学运算表达式Shell变量变量分类环境变量Shell内部变量自定义变量:定义、赋值自定义变量:引用、修改、删

python判断文件是否存在常用的几种方式

《python判断文件是否存在常用的几种方式》在Python中我们在读写文件之前,首先要做的事情就是判断文件是否存在,否则很容易发生错误的情况,:本文主要介绍python判断文件是否存在常用的几种... 目录1. 使用 os.path.exists()2. 使用 os.path.isfile()3. 使用

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Mybatis的分页实现方式

《Mybatis的分页实现方式》MyBatis的分页实现方式主要有以下几种,每种方式适用于不同的场景,且在性能、灵活性和代码侵入性上有所差异,对Mybatis的分页实现方式感兴趣的朋友一起看看吧... 目录​1. 原生 SQL 分页(物理分页)​​2. RowBounds 分页(逻辑分页)​​3. Page

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Linux实现线程同步的多种方式汇总

《Linux实现线程同步的多种方式汇总》本文详细介绍了Linux下线程同步的多种方法,包括互斥锁、自旋锁、信号量以及它们的使用示例,通过这些同步机制,可以解决线程安全问题,防止资源竞争导致的错误,示例... 目录什么是线程同步?一、互斥锁(单人洗手间规则)适用场景:特点:二、条件变量(咖啡厅取餐系统)工作流

SpringBoot整合Apache Flink的详细指南

《SpringBoot整合ApacheFlink的详细指南》这篇文章主要为大家详细介绍了SpringBoot整合ApacheFlink的详细过程,涵盖环境准备,依赖配置,代码实现及运行步骤,感兴趣的... 目录1. 背景与目标2. 环境准备2.1 开发工具2.2 技术版本3. 创建 Spring Boot

Linux中修改Apache HTTP Server(httpd)默认端口的完整指南

《Linux中修改ApacheHTTPServer(httpd)默认端口的完整指南》ApacheHTTPServer(简称httpd)是Linux系统中最常用的Web服务器之一,本文将详细介绍如何... 目录一、修改 httpd 默认端口的步骤1. 查找 httpd 配置文件路径2. 编辑配置文件3. 保存

Spring Boot 整合 Apache Flink 的详细过程

《SpringBoot整合ApacheFlink的详细过程》ApacheFlink是一个高性能的分布式流处理框架,而SpringBoot提供了快速构建企业级应用的能力,下面给大家介绍Spri... 目录Spring Boot 整合 Apache Flink 教程一、背景与目标二、环境准备三、创建项目 & 添