当设置一个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概述的更多相关文章

  1. Apache Sqoop - Overview——Sqoop 概述

    Apache Sqoop - Overview Apache Sqoop 概述 使用Hadoop来分析和处理数据需要将数据加载到集群中并且将它和企业生产数据库中的其他数据进行结合处理.从生产系统加载大 ...

  2. Apache nifi 第一篇(概述)

    1.什么是Apache NiFi? 简单地说,NiFi是为了自动化系统之间的数据流.虽然数据流这种形式很容易理解,但我们在此使用它来表示系统之间的自动化和不同系统之间数据的流转.企业拥有多个系统,其中 ...

  3. 从BSP模型到Apache Hama

    一.什么是BSP模型 概述 BSP(Bulk Synchronous Parallel,整体同步并行计算模型)是一种并行计算模型,由英国计算机科学家Viliant在上世纪80年代提出.Google发布 ...

  4. Apache Storm 的历史及经验教训——Nathan Marz【翻译】

    英文原文地址 中英文对照地址 History of Apache Storm and lessons learned --项目创建者 Nathan Marz Apache Storm 最近成为了ASF ...

  5. 从Apache Storm学到的经验教训 —— storm的由来(转)

    阅读目录 Storm来源 初探 再探 构建第一个版本 被Twitter收购 开源的Storm 发布之后 Storm的技术演进 构建开发者社区版 离开Twitter 提交到Apache Apache孵化 ...

  6. web服务器-apache

    一.apache详解 1. 概述 apache是世界上使用排名第一的web服务器软件.它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的web服务器端软件之一.它快 ...

  7. 消息队列Queue大全

    消息队列Queue大全 (http://queues.io/) 作业队列,消息队列和其他队列.几乎所有你能想到的都在这. 关于 那里有很多排队系统.他们每个人都不同,是为解决某些问题而创建的.这个页面 ...

  8. 初学者如何理解tomcat服务器?

    Tomcat介绍:Tomcat服务器是一个免费的开放源代码的Web应用服务器.当配置正确时,Apache为HTML页面服务,而Tomcat实际上运行JSP页面和Servlet.另外,Tomcat和II ...

  9. 轻量级集群管理软件-Ansible

    ansible概述和运行机制 ansible概述 Ansible是一款为类Unix系统开发的自由开源的配置和自动化工具,  它用Python写成,类似于saltstack和Puppet,但是有一个不同 ...

随机推荐

  1. cnblogs侧边栏访客统计 小插件

    之前博客的侧边栏一直用的是flagcounter,直观简洁又好看,近期恍然发现被博客园禁了.禁用原因据说是由于flagcounter将香港(HongKong).台湾(TaiWan)和澳门(Macau) ...

  2. 你能说说Java中Comparable和Comparator的区别吗

    之前面试中被问到这个问题,当时不屑(会)回答,下来特意查了查,整理如下. Java 中为我们提供了两种比较机制:Comparable 和 Comparator,二者都是用来实现对象的比较.排序. 下面 ...

  3. SqlServer2005 查询 第三讲 between

    在数据库的查询中最重要的是要知道命令的顺序,因为在sql命令中有许多的参数,例如distinct,top,in,order by,group by.......如果你不能理解什么时候该执行什么的话,很 ...

  4. PHP实现日历签到,并实现累计积分功能

    在网站开发过程中我们会经常用到签到功能来奖励用户积分,或者做一些其他活动.这次项目开发过程中做了日历签到,因为没有经验所有走了很多弯路,再次记录过程和步骤. 1.日历签到样式:使用的是calendar ...

  5. docker入门篇

    在网上的教程中,大多数是建议利用linux来安装docker,在此我也建议大家用linux安装,为什么?请看下图 docker使用go语言开发,并且运行在linux系统下,而如果想用window运行, ...

  6. 根据本地ip获取地理位置,再根据地理位置,获取天气

    import json,requestsfrom urllib.request import urlopenfrom pyquery import PyQuery as pqfrom lxml imp ...

  7. Nginx 代理本地文件夹(Windows环境)

    安装环境: win10 nginx-1.17.2 步骤: 一.打开nginx.conf 路径:\nginx-1.17.2\conf\nginx.conf 二.编辑 配置跨域以及代理文件夹路径 三.启动 ...

  8. 跑健壮性Monkey,出现一次Crash全过程-日志分析-Dotest董浩

    最近带着学生做的某个项目,跑健壮性Monkey,出现一次Crash全过程-日志分析: 准备:搭建adb环境.安装实际测试包:开始: Monkey命令: adb shell monkey -p com. ...

  9. 新闻实时分析系统-HBase分布式集群部署与设计

    HBase是一个高可靠.高性能.面向列.可伸缩的分布式存储系统,利用Hbase技术可在廉价PC Server上搭建 大规模结构化存储集群. HBase 是Google Bigtable 的开源实现,与 ...

  10. Mac OS 终端利器 iTerm2(怕以后找不到,自存自用)

    之前一直使用 Mac OS 自带的终端,用起来虽然有些不太方便,但总体来说还是可以接受的,是有想换个终端的想法,然后今天偶然看到一个终端利器 iTerm2,发现真的很强大,也非常的好用,按照网上配置了 ...