二、编译安装LAMP之httpd-2.4.4

回顾

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

    Webapp:面向对象的特性

       Zend:

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

              opcode放置于内存中

           第二段:执行opcode;

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

    为了避免它自身去清除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平台是非常重要的内容,一定要做到不需要使用任何文档都能配置相关内容。如配置基于任何类型的3、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新特性:

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

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

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

    异步读写可以大大提升httpd的工作性能。

  • 4、在每模块及每目录上指定日志级别;
  • 5、每请求配置;<If>, <ElseIf>, <Else>;
  • 6、增强的表达式分析器;
  • 7、毫秒级的KeepAlive Timeout;
  • 8、基于域名的虚拟主机不再需要NameVirtualHost指令;
  • 9、降低了内存占用;
  • 10、支持在配置文件中使用自定义变量;

 

对于基于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是其功能的补充。

posted @ 2019-07-29 09:54  幻落之瞳  阅读(194)  评论(0编辑  收藏  举报