2、编译安装LAMP之httpd-2.4.4

回顾

PHP:脚本编程语言,php解释器php

    Webapp:面向对象的特性前端

       Zend:mysql

           第一段:词法分析、句法分析、编译为Opcode;web

              opcode放置于内存中sql

           第二段:执行opcode;数据库

        opcode的转换是动态完成的,当有用户访问第一次一个页面的时候,由Zend Engine将其转换为opcode,然后再去执行这个opcode,当第二次执行同一个脚本的时候,就是直接执行已经编译好的opcode,因此这样速度会快一些,可是在不一样的php进程之间,它们没法共享opcode,并且opcode是放在内存当中的,因此一关机或把php进程一关闭,这个内容极可能从内存中清除了;apache

    为了不它自身去清除opcode而且实如今多个不一样的php进程之间共享的功能,就引入了缓存加速器(缓存功能)编程

PHP的缓存器:后端

  •     APC
  •     eAccelerator
  •     XCache(支持最新版本的php,并且在生产环境中已经被普遍使用了)

 

PHP解释器如何与mysql交互?浏览器

    咱们首先须要明确的一点是,须要到数据库中查询数据的不是php解释器,而是使用php开发的web应用程序,php解释器除了解释php脚本以外没有别的能力。程序须要跟mysql交互才交互,不须要就不交互。

    php连向mysql时有一个高级的专门的库,叫驱动,RedHat系列上称为php-myssql

 

httpd与php结合的三种方式:

  做为web服务器而言,有一个进程叫作httpd进程,web服务器仅能解释静态内容,如:图片、网页文件、CSS样式表…,只要不须要执行程序,都是由httpd自身处理的。可是一旦用户请求的是php脚本的话,httpd自己完成不了这种功能,它必需要借助于php解释器来执行它。可是须要事先告诉httpd一旦有客户端请求php内容,就要调用php的功能来完成解释这个功能,这种让httpd跟php完成结合(交互)的方式有三种:

  • CGI

  这种方式已经用的不多了。工做在CGI机制时,就意味着在主机上,httpd一旦有用户请求php页面内容了,须要有一个进程响应,httpd使用CGI协议启动另一个独立进程的,这个进程是CGI进程或php进程,这个进程自己须要建立起来而后运行脚本,运行结束后以进程间通讯的方式返回给这个httpd进程,此时cgi进程工做就结束了;

  • Module

  将php直接编译成httpd的模块,他本身不能独立执行,当httpd用到php功能的时候才会被装载执行,由于Apache是模块化设计的。工做在模块化时,httpd进程一旦要用到php功能,只须要将这个模块从磁盘上加载进来在它自身内部运行便可,不须要启动一个新进程,只须要一个进程完成全部功能,而不须要两个进程了;

  • FastCGI/fpm

  安装一个服务器软件,这个服务器软件自身就能够提供可以执行php脚本的cgi进程,而且事先建立了多个空闲进程。当httpd有请求动态页面时,httpd发现用户请求的是动态内容,使用php解释器(httpd服务器里有)向对方请求获取一个进程便可,此时进程由后端php服务器建立,再也不由httpd建立,这就是fastcgi。对于这种方式,还需安装php服务器,这里的服务器有守护进程(Daemon)的概念,意味着可使用service xxx start启动,能够监听在某个套接字(Socket)上。而像之前所装的php,是以模块化的方式工做的,他不会启动一个服务器,也不会监听端口,可是若是要以fastcgi方式工做,就必须监听在一个端口上,默认监听在9000这样的端口上;

 

LAMP基础

    在平时,用户请求的静态内容(静态即在服务器端不须要执行脚本的,不须要执行程序的内容),像图片、视频、CSS等不须要执行程序,只须要原封不动的给客户端,让客户端直接打开另一个程序便可,但在服务器上不须要执行程序。

    httpd自己就是模块化的,它的众多功能都是经过模块实现的,好比用户的认证,基于IP地址或基于用户的认证里边都是模块,因此把PHP作成它的模块也是能够工做的,可是php自己要比其余模块要复杂的多,因此通常而言,把php作成模块当然能实现很简便的管理,可是性能并非特别好

 

    Apache、php、mysql位于同一主机与位于不一样主机各有利弊,位于不一样主机上时,它们之间的通讯都要封装成TCP/IP报文,经过网线发送才能够。这中间涉及到大量的IO操做,若是网络足够慢的话,那它们之间结合的性能可能比较差,而放在本机内部是比较快的。因此究竟是分开部署仍是放在一块儿,得看请求规模有多大,若是自己并发的用户不会超过20个,放在同一台主机上没有问题,若是很是多,只能分层次实现了,有2层设计,也有3层设计。分为WEB服务器、应用程序服务器(之因此称为应用程序服务器是由于之后所实现的动态网站可能不只仅有动态服务器的,如JSP。而应用程序服务器可以接受用户来自于前端的请求,而且应用程序服务器须要的时候再跟数据库打交道)、数据库服务器

 

    须要明确的是,若前端并发有300个请求进来,并不意味着在应用程序服务器上能看到300个请求,由于不必定都是动态请求。因此若是300个请求中只有50个动态请求,同时50个请求中不必定都是要请求数据库的,要请求数据库的可能只有三两个。

    另外,一个页面文件中间可能包含多个WEB对象,这多个web对象有的是静态的,有的是php动态脚本。通常来说,静态内容都由前端WEB服务器直接处理,只有动态内容才交给应用程序服务器。

 

 

    静态内容的响应速度比动态内容快的要多得多的多。通常来说一个httpd服务器假若有512M内存,让用户请求phpmyadmin的主页面,压力测试通常来说能响应500个请求就足够快了。可是一样的内容若作成静态内容,不让执行php,即将php的结果缓存下来,让httpd直接处理,通常来说1s内响应1W个请求是很轻松的。因此动态内容虽然和灵活好用,可是代价是很是大的。那么如何让它快一些呢?能够将php的执行结果(注意:不是编译结果,执行并查询数据库生成的静态内容返回给客户端的内容才叫执行结果)缓存下来,下一次由WEB服务器直接获取缓存的内容便可。这种机制就叫动态内容的静态化,而这对于优化站点来说很重要,经过这种机制将大量动态内容缓存为静态内容就能够显著提升服务器性能。

 

  咱们在开始搭建LAMP平台以前须要注意的是:

  • LAMP平台是很是重要的内容,必定要作到不须要使用任何文档都能配置相关内容。如配置基于任何类型的三、5个主机,而且可以安装各类相应的模块;
  • LAMP是最须要定制的平台,由于可能须要的功能未编译、编译的功能不须要所以带来潜在的安全风险。所以须要彻底手动配置编译安装LAMP平台。

 

编译配置LAMP平台

LAMP:Linux、Apache、MySQL、PHP(Python、Perl)

使用的软件及其版本: 

  •     Apache:ASF(Apache软件基金会),著名的软件项目有:httpd、Tomcat、cloudware;
  •     httpd:2.4.4;
  •     php:5.4.13;
  •     MySQL:5.6.10(rpm,通用二进制,源码);

 

在此以前确保未安装rpm包版本的LAMP平台

 

安装次序:

  httpd --> MySQL --> php --> XCache

  由于php要想链接到MySQL上,必需要在编译php时告诉它MySQL在哪,使用哪一个MySQL。因此必需要先配置安装MySQL,而后才能安装php;

 

  • 编译安装httpd:

  解决依赖关系:

  在开始以前,咱们须要知道httpd是经过虚拟机来实现跨平台的。固然,这个虚拟机也不叫虚拟机,而是叫apr(Apache Protable Runtime,Apache可移植运行环境)

  httpd-2.4.4须要较新版本的apr和apr-util,所以须要事先对其进行升级。升级方式有两种,一种是经过源代码编译安装,一种是直接升级rpm包。这里选择使用编译源代码的方式进行。

 

 

  apr程序在系统上是装好了的。

        

    注意:

  •   apr是一个库,而apr-util是apr提供的工具组;
  •   Apache的运行依赖于这两个工具:
    •     apr
    •       apr-util

  

  httpd 2.4依赖于apr1.4,可是系统上自动安装的apr已过期,所以须要从新安装apr和apr-util。可是老版本又不能卸载,由于它可能被别的软件所依赖,也不能直接升级。因此只能使用多版本并存的机制,把新版本安装在与老版本不在同一个位置便可。

 

软件包安装后文件放置的位置:

 咱们再来回忆一下,通常来说,rpm包格式的软件安装的时候:

  •     二进制程序一般都在/bin,/sbin,/usr/bin,/usr/sbin下,这是RedHat官方提供的rpm包一般都在这几个路径下。
  •     库文件都在/lib,/usr/lib下。
  •     配置文件/etc
  •     帮助文档/usr/share/{doc,man}

 所以咱们此处约定,编译安装时:(安装在不一样路径下,就不会覆盖老版本了)

  •     /usr/local(自定义安装第三方软件的地方)
  •     二进制:/usr/local/{bin,sbin}
  •     库文件:/usr/local/lib
  •     配置文件:/usr/local/etc
  •     帮助文件:/usr/local/share/{doc,man}

    可是若是编译安装了不少软件,每个软件都放在此目录下,要想卸载的话,只能一个一个删除,方便的作法是安装在一个同名的目录下,如:/usr/local/apr/{bin,sbin,etc,lib,includes,share/doc,share/man};

    可是这样还有一个问题,二进制程序路径时/usr/local/apr/bin,再也不PATH中,不能直接执行命令,所以须要修改PATH。库文件、man一样如此。

 

  • 编译安装apr和apr-util:

  确保开发环境已安装好;

  下载安装环境:  

             

    先安装apr,再安装apr-util,由于util依赖于apr,以后才装httpd;(须要注意的是,RedHat已经安装好了apr1.4,不须要在编译安装了)

  将软件时间同步为硬件时间:

              

    编译安装apr:

  注意:对于新版apr来说,只是对于httpd有用,只要在安装httpd的时候告诉它apr在哪便可。因此此处不须要输入其bin路径,也不须要数据头文件与库文件。httpd本身会找的。

        到此为止不须要额外配置。

    编译安装apr-util:

 

--with-apr用于指定apr的安装路径;

 

  附:apache官方对APR的介绍:

  The mission of the Apache Portable Runtime (APR) project is to create and maintain software libraries that provide a predictable and consistent interface to underlying platform-specific implementations. The primary goal is to provide an API to which software developers may code and be assured of predictable if not identical behaviour regardless of the platform on which their software is built, relieving them of the need to code special-case conditions to work around or take advantage of platform-specific deficiencies or features.

 

  httpd-2.4.4编译过程也要依赖于pcre-devel软件包,须要事先安装。此软件包系统光盘自带,所以,找到并安装便可。

  • 安装httpd

  

configure选项:

 
    configure选项:

       --sysconfdir=DIR:指定配置文件路径(不改的话只能到默认安装路径下的/etc/找,而对于Apache来说不是/etc/目录,而是默认安装路径下的/conf目录)

       --enable-mods-share=MODULE-LIST:是否启用共享模块,all表示全部共享模块,most为大多数,few为仅有几个,realyall

       --enable-mods-static=MODULE-LIST:静态编译进去的

       --enable-authn-…:启用哪一种认证功能。默认基于文件的认证

     

       必定要加上去的功能:

           --enable-so:默认的,支持动态共享模块,若不支持这个功能,php将没法以模块方式跟Apache结合工做

           --enable-ssl:启用ssl功能,也是必须的,否则没法使用https

           --enable-defalte:客户端访问服务器静态内容时,这个静态内容要经过网络传递给客户端,这些内容若是都是文本内容,文本内容一压缩体积很是小,若是带宽有限,
                  每次传输前都压缩一下会节约不少带宽。defalate是一种压缩机制,它能将页面自动让httpd服务器压缩一下再传递给浏览器,
                  而浏览器也能够再解压缩查看,这是经常使用的压缩机制。 --enable-expires:过时首部控制 --enable-fcgi:若是未来打算让Apache跟php结合时是以fastcgi的方式工做的,这个须要启用。 --enable-mpms-shared=MPM-LIST:打算以共享方式启用哪些MPM,在2.2中没有,但在2.4中有了,Apache支持MPM的 MPM(多道处理模块):prefork、worker、event, 事实上到底支持哪种MPM在编译的时候就肯定了,在2.4的时候有一个特性,便可以以模块化方式使用MPM,意味着能够将这三个同时编译进来,
        想用哪一个切换便可。可是有一个缺陷,php以模块化方式跟Apache结合的时候,若是使用prefork,php很简单,但若是使用worker或event,php必需要编译成zts格式,
        所以若是须要灵活使用不一样格式的话,须要编译两次php。假设只要机器支持,默认推荐使用event(假设性能最好),因此在2.4默认是event,而2.2默认是prefork。 --with-mpm=MPM:定义哪个为默认的MPM,若不指定默认通常为event。 --enable-rewrite:支持URL重写 --enable-cgi:支持cgi --enable-cgid:被线程方式的MPM使用,因此使用的如果event或worker的MPM,启用cgid
 

 

[root@localhost httpd-2.4.4]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd --enable-so --enable-rewirte --enable-ssl --enable-cgi --enable-cgid -enable-mble-cgi --enable-cgid -enable-modules=most --enable-mods-shared=most --enable-mpms-shared=all --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util

 

注意:Apache是受SELinux控制的,因此若是启动了SELinux,httpd会没法启动,须要确保SELinux关闭。

 

  启动Web服务器:

    注意:只有使用rpm包安装时才有安装脚本,本身手动安装的没有此脚本;

      在安装路径的bin下有一个apachectl脚本,使用这个脚本启动便可:

    

 

   apachectl是没法直接加入chkconfig的,要想加入chkconfig须要加入两行,此处再也不演示; 

  

                                        

安装后的目录:

 

 
  bin:二进制程序(不在PATH环境变量当中,执行时须要加入路径)
  build:编译时的目录
  cgi-bin:执行cgi程序的存放位置
  error:错误信息
  htdocs:网页文件的位置
  icons:图标
   include:头文件,如有人要对Apache作二次开发,须要用到这个目录
  logs:日志文件
  man:帮助文件
  manual:官方手册
  modules:模块目录  
 

 

 

 

  补充:

  (1)构建MPM为静态模块
  在所有平台中,MPM均可以构建为静态模块。在构建时选择一种MPM,连接到服务器中。若是要改变MPM,必须从新构建。为了使用指定的MPM,请在执行configure脚本 时,使用参数 --with-mpm=NAME。NAME是指定的MPM名称。编译完成后,可使用 ./httpd -l 来肯定选择的MPM。 此命令会列出编译到服务器程序中的全部模块,包括 MPM。

  (2)构建 MPM 为动态模块

  在Unix或相似平台中,MPM能够构建为动态模块,与其它动态模块同样在运行时加载。 构建 MPM 为动态模块容许经过修改LoadModule指令内容来改变MPM,而不用从新构建服务器程序。在执行configure脚本时,使用--enable-mpms-shared选项便可启用此特性。当给出的参数为all时,全部此平台支持的MPM模块都会被安装。还能够在参数中给出模块列表。默认MPM,能够自动选择或者在执行configure脚本时经过--with-mpm选项来指定,而后出如今生成的服务器配置文件中。编辑LoadModule指令内容能够选择不一样的MPM。

 

  修改httpd的主配置文件,设置其Pid文件的路径

    注意: pid文件通常来说应该放在/var/run下,放在logs中彷佛不太稳当,要想放在/var/run下须要编辑配置文件:

      先关闭Apache:

 

    进程一关,pid文件就自动删除了

 

    提供SysV服务脚本/etc/rc.d/init.d/httpd,内容以下:

        要想此文件顺利执行确保pid文件在/var/run下;

 

 
#!/bin/bash
#
# httpd        Startup script for the Apache HTTP Server
#
# chkconfig: - 85 15
# description: Apache is a World Wide Web server.  It is used to serve \
#           HTML files and CGI.
# processname: httpd
# config: /etc/httpd/conf/httpd.conf
# config: /etc/sysconfig/httpd
# pidfile: /var/run/httpd.pid

# Source function library.
. /etc/rc.d/init.d/functions

if [ -f /etc/sysconfig/httpd ]; then
        . /etc/sysconfig/httpd
fi

# Start httpd in the C locale by default.
HTTPD_LANG=${HTTPD_LANG-"C"}

# This will prevent initlog from swallowing up a pass-phrase prompt if
# mod_ssl needs a pass-phrase from the user.
INITLOG_ARGS=""

# Set HTTPD=/usr/sbin/httpd.worker in /etc/sysconfig/httpd to use a server
# with the thread-based "worker" MPM; BE WARNED that some modules may not
# work correctly with a thread-based MPM; notably PHP will refuse to start.

# Path to the apachectl script, server binary, and short-form for messages.
apachectl=/usr/local/apache/bin/apachectl
httpd=${HTTPD-/usr/local/apache/bin/httpd}
prog=httpd
pidfile=${PIDFILE-/var/run/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd}
RETVAL=0

start() {
        echo -n $"Starting $prog: "
        LANG=$HTTPD_LANG daemon --pidfile=${pidfile} $httpd $OPTIONS
        RETVAL=$?
        echo
        [ $RETVAL = 0 ] && touch ${lockfile}
        return $RETVAL
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -p ${pidfile} -d 10 $httpd
    RETVAL=$?
    echo
    [ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
    echo -n $"Reloading $prog: "
    if ! LANG=$HTTPD_LANG $httpd $OPTIONS -t >&/dev/null; then
        RETVAL=$?
        echo $"not reloading due to configuration syntax error"
        failure $"not reloading $httpd due to configuration syntax error"
    else
        killproc -p ${pidfile} $httpd -HUP
        RETVAL=$?
    fi
    echo
}

# See how we were called.
case "$1" in
  start)
    start
    ;;
  stop)
    stop
    ;;
  status)
        status -p ${pidfile} $httpd
    RETVAL=$?
    ;;
  restart)
    stop
    start
    ;;
  condrestart)
    if [ -f ${pidfile} ] ; then
        stop
        start
    fi
    ;;
  reload)
        reload
    ;;
  graceful|help|configtest|fullstatus)
    $apachectl $@
    RETVAL=$?
    ;;
  *)
    echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
    exit 1
esac

exit $RETVAL
 

   

    然后为此脚本赋予执行权限并重启:

         

    加入服务列表,设定开机自启:

         

         

 

    将Apache安装目录的bin目录命令加入PATH路径中:

      

      

    从新登陆便可生效:

       

      

      

 

默认使用的是event模块;

  

    

  换一种MPM模块:

 

 

httpd2.4新特性:

  • 一、MPM可于运行时装载;

    --enable-mpms-shared=all --with-mpm=event

  • 二、Event MPM
  • 3、异步读写

    异步读写能够大大提高httpd的工做性能。

  • 四、在每模块及每目录上指定日志级别;
  • 五、每请求配置;<If>, <ElseIf>, <Else>;
  • 六、加强的表达式分析器;
  • 七、毫秒级的KeepAlive Timeout;
  • 八、基于域名的虚拟主机再也不须要NameVirtualHost指令;
  • 九、下降了内存占用;
  • 十、支持在配置文件中使用自定义变量;

 

对于基于IP的访问控制:

    在httpd2.2及以前使用

       Order allow deny

       allow from all

    而在2.4中,上述功能已废弃,再也不支持此方法,在2.4中使用Require user

  Require user USERNAME
  Require group GROUPNAME
  Require ip IPADDR
  Require host HOSTNAME

    IP地址格式:

  IP
  NETWORK/NETMASK
  NERWORK/LENGTH
  NET(如:172.16.0.0/255.255.0.0,也可使用172.16.0.0/16,还可使用172.16)

 

        主机名格式:

  HOSTNAME
  DOMAIN

       如:www.magedu.com

               .magedu.com

    容许全部主机访问:

  Require all granted

    拒绝全部主机访问:

  Require all deny

    若指定不容许访问,在Require 后加not便可,如:

  Require not ip IPADDR

    注意:Require使用的匹配机制是最佳匹配机制,谁的匹配范围最小、精确,谁生效。固然还要注意自上而下的匹配次序,须要摸索一下才能获得最精确的使用方式,通常来说,它是使用结合次序以及最佳匹配完成的。

 

       httpd2.4新增长的模块:

        

  上述模块是2.2中不具有的;

  mod_proxy_fcgi在2.2中要想使用fastcgi的功能,还得像httpd额外安装第三方fastcgi模块。而2.4中不须要,使用—enable-modules=most,这个模块就会被默认装载(编译)的mod_proxy_fcgi是做为mod_proxy的一部分(子模块),但mod_proxy不是新增的,早期就有,这是核心模块,而mod_proxy_fastcgi是其功能的补充。

相关文章
相关标签/搜索