apache mpms和php概述
当设置一个Apache + PHP服务器来运行你的PHP应用程序时,有许多配置参数需要处理。 最重要的是php服务器Api(server api:sapi),它决定了Apache将如何运行PHP脚本。 除了php sapi之外,另一个重要的选择是apache mpm(多处理模块)。 mpms决定了apache如何处理一般的请求。
mpms和sapis有多种选择,每种都有自己的优点和缺点。 某些配置易于设置和管理,但性能较差,而有些则性能较高,但难以设置和维护。 由于可用的服务器种类繁多,通常很难决定选择哪一个。
mpms有prefork,worker,itk等等。在php sapi那边有3个基本选项,分别是mod_php,cgi和fastcgi。 除了这些之外,还有更多的组件可以在apache中使用,比如suphp,suexec,它可以修改标准sapis的行为。
[apache <=> some mpm] <=> some sapi <=> php interpreter/process
当决定使用那种具体的配置时,有很多事情需要考虑。
1、服务器有多少资源。 使用有限的内存和CPU能够满足需要。
2、需要什么安全选项。 如果我们通过apache vhosts在同一台服务器上建立多个网站/域名,那么我们需要在每个域中运行php scipts,使用它自己独立的UID /用户来获得正确的目录访问权限。
3、需要多少性能。 网站上的流量是高还是低?
有时候这个决定也会受到所需维护的容易性的影响。 有些系统管理员可能不希望有一个复杂的系统,从长远来看很难维护,并且可能愿意选择一个更易于配置并具有像Cpanel或Directadmin之类的GUI工具的备用配置。
Apache MPM
首先要了解的是apache mpms。 MPM或多处理模块是处理传入请求的apache代码的一部分。 所以不同的mpms处理请求的方式不同。 要注意的是,虽然这些被称为模块,但它们不像可加载模块可以加载多个。 而是一个mpm运行在Apache二进制文件里面。 所以一次只能安装1个mpm,而且你至少要安装1个mpm。(更多关于多处理模块资料)
1、mpm Prefork
这是apache带有的最老,最基本的mpm形式,并且与任何类型的php服务器api兼容。
官方描述
A single control process is responsible for launching child processes which listen for connections and serve them when they arrive. Apache always tries to maintain several spare or idle server processes, which stand ready to serve incoming requests. In this way, clients do not need to wait for a new child processes to be forked before their requests can be served.
prefork用单独的子进程来处理不同的请求,进程之间是彼此独立的,这也使其成为最稳定的MPM之一。但是由于每一个请求都会产生一个新的进程,导致系统资源(尤其是内存)消耗的很快,一旦并发量较大的时候,大量的Apache进程会占用巨大的内存空间。 Prefork MPM在所有情况下都很安全,对运行非线程安全(non-thread-safe)模式的软件如PHP,它是唯一的安全选择。
2、mpm Worker
mpm Worker解决了prefork的局限性。 它创建了像prefork这样的多个进程,但是也在每个进程内创建了多个线程。 每个线程都可以处理一个请求。 现在线程共享相同的资源,这个MPM是资源友好的。 事实上这也是所有情况下推荐使用的mpm,除非你被迫使用mod_php。MPM Worker 基于线程模式,具有内存消耗低(对繁忙的服务很重要)、扩展性在某些特定应用情况下比Prefork更好等优点。在这个模式下,采用的进程和线程混合的形式处理请求。由于使用线程来处理,所以可以处理相对海量的请求,而系统资源的开销要小于基于进程的Prefork模式。
官方描述
A single control process (the parent) is responsible for launching child processes. Each child process creates a fixed number of server threads as specified in the ThreadsPerChild directive, as well as a listener thread which listens for connections and passes them to a server thread for processing when they arrive.
Mpm worker可以用于任何PHP sapi 像cgi,suphp,fastcgi,fpm(modphp除外)。有许多php扩展不是线程安全的,因此如果你试图用mod_php运行mpm worker,那么apache服务器会不时崩溃。 在Ubuntu上,例如安装modphp会自动删除mpm worker。
除了常用的prefork和worker还有其他的mpm,这里就不详细列出来了。
PHP server api
PHP 服务器的API决定了如何将自己连接到PHP解释器来执行PHP文件并获得输出。 和mpm一样,这里也有很多选择。有可用于apache的模块或组件,可以按需加载以提供各种功能。 例如mod_php是授权apache直接加载php解释器并运行php代码的模块。 mod_fastcgi模块使apache能够与fastcgi协议进行通信,以支持fastcgi应用程序。 例如,php-cgi二进制文件是启用fastcgi的。
1、 Mod PHP (a.k.a Apache 2.0 Handler or DSO)
这是最简单的PHP处理程序,并在默认情况下在Ubuntu系统上安装,例如,当您尝试从突触安装PHP。
$ sudo apt-get install apache2 php5
Mod PHP是一个Apache模块,直接加载PHP解释器,并在Apache内运行PHP代码。 它不会像使用php-cgi二进制文件那样将php加载为外部进程。 所以php解释器和apache进程成为一体。 新fork出的apache进程,都有自己的php解释器。
控制的流程就像这样
apache process (php interpreter) <==> execute php code
基本上apache直接变成了一个php解释器。Mod PHP只适用于非线程mpm像prefork。由于这个Apache的线程功能完全丢失。
Prefork的速度很慢,因为每一个请求都会产生一个新的进程。而且,每个进程都有一个“自带”php解释器,即使它正在为JavaScript / css / images等静态内容提供请求。这使得它非常低效。
PHP脚本将只运行一个用户,如“www-data”或“nobody”。所以,如果你有多个网站,那么它不可能使每个虚拟主机运行自己的独立用户/ uid。 1个虚拟主机中的脚本可以读取其他虚拟主机的文件。
唯一例外的情况下,mod_php可以与每个虚拟主机使用不同的uid,使用mpm-itk,它将在apache内实现用户/ uid切换。可以是有用的,但有一个限制,它不重用一个进程,并产生一个新的进程,每一个请求使得它比prefork更糟糕。
2、 CGI - Common Gateway Interface
这是一个中立的协议,可以用来连接任何网络服务器与任何语言解释器。 我们在这里连接Apache和Php。 它在apache内部是通过mod_cgi实现的。
通过cgi,php的执行从apache环境中分离出来。 Apache将改为调用一个外部程序,如“php-cgi.exe”,通过输入和输出。 所以需要创建一个单独的php进程。
Apache (any mpm) <=========> /usr/bin/php-cgi binary [multiple instances per mpm process/thread]
参考资料
[1] http://www.binarytides.com/apache-mpm-php-server-api/
[2] http://wiki.apache.org/httpd/php
[3] http://www.brandonturner.net/blog/2009/07/fastcgi_with_php_opcode_cache/
apache mpms和php概述的更多相关文章
- Apache Sqoop - Overview——Sqoop 概述
Apache Sqoop - Overview Apache Sqoop 概述 使用Hadoop来分析和处理数据需要将数据加载到集群中并且将它和企业生产数据库中的其他数据进行结合处理.从生产系统加载大 ...
- Apache nifi 第一篇(概述)
1.什么是Apache NiFi? 简单地说,NiFi是为了自动化系统之间的数据流.虽然数据流这种形式很容易理解,但我们在此使用它来表示系统之间的自动化和不同系统之间数据的流转.企业拥有多个系统,其中 ...
- 从BSP模型到Apache Hama
一.什么是BSP模型 概述 BSP(Bulk Synchronous Parallel,整体同步并行计算模型)是一种并行计算模型,由英国计算机科学家Viliant在上世纪80年代提出.Google发布 ...
- Apache Storm 的历史及经验教训——Nathan Marz【翻译】
英文原文地址 中英文对照地址 History of Apache Storm and lessons learned --项目创建者 Nathan Marz Apache Storm 最近成为了ASF ...
- 从Apache Storm学到的经验教训 —— storm的由来(转)
阅读目录 Storm来源 初探 再探 构建第一个版本 被Twitter收购 开源的Storm 发布之后 Storm的技术演进 构建开发者社区版 离开Twitter 提交到Apache Apache孵化 ...
- web服务器-apache
一.apache详解 1. 概述 apache是世界上使用排名第一的web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的web服务器端软件之一.它快 ...
- 消息队列Queue大全
消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...
- 初学者如何理解tomcat服务器?
Tomcat介绍:Tomcat服务器是一个免费的开放源代码的Web应用服务器.当配置正确时,Apache为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet.另外,Tomcat和II ...
- 轻量级集群管理软件-Ansible
ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具, 它用Python写成,类似于saltstack和Puppet,但是有一个不同 ...
随机推荐
- lenovo ubuntu18.04 找不到网络适配器
链接: https://pan.baidu.com/s/1YJl-MfG0tVy9sLx4_otmnA 提取码: smfp https://blog.csdn.net/John_chaos/artic ...
- Git详解使用教程
一. 什么是Git Git(读音为/gɪt/).是一个开源的 分布式版本控制系统,可以有效.高速地处理从很小到非常大的项目版本管理. Git 是 Linus Torvalds 为了帮助管理 Linux ...
- jQuery源码分析--为什么在参数列表中传入undefined
(function(window, undefined){ //jQuery code; })(window); 为什么要传入undefined? 1.没有传入undefined: <!DOCT ...
- python函数的基本语法<二>
函数的流程控制: if...else... a = 100 b = 200 if a == 100 and b ==300: print('100,200') elif b == 200: print ...
- Rxjava2源码解析
1:用法: Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer& ...
- linux系统LNMP环境部署
源码安装 nginx# yum -y install gcc openssl-devel# useradd -s /sbin/nologin nginx# tar xf nginx-1.14.0.ta ...
- Redis 工具 redis-port 使用
redis-port 是一个 Redis 工具,通过解析 rdb 文件,实现 Redis 主节点和从节点的数据同步. 摘要: 一个可以将redis主从集群,cluster上的数据实时迁移到 cod ...
- vuejs 入门
配置环境教程网上太多了,就不赘述了,建议使用npm 命令行安装,总觉得这个念头不会使用命令行配置环境的就不是一个好的程序员,或者为了方便也可以直接在本地建一个.html文件,然后引用下面的链接即可. ...
- python_07
破解极限滑动认证 from selenium import webdriver from selenium.webdriver import ActionChains from PIL import ...
- SQL Server Management Studio 安装流程
数据库的操作需要使用SQL Server Management Studio,不过也可以使用其他的: 下面是安装操作的步骤:如果你下载的压缩包,你需要先解压到一个文件夹里,然后双击setup.exe, ...