httpd与php交互的三种机制

在编译httpd-2.4.4之前,我们来讨论一下httpd是如何实现和php来交互的?

当一个客户端发送一个web请求,如果这个request是请求的一个静态页面,那么httpd就直接从服务器加载静态内容返回给客户端;如果请求的是一个动态内容,例如请求的是一个php页面,那么httpd又该如何处理动态请求呢?

httpd与php交互有三种方式,使用的交互方式不一样,其服务器性能也不一样。

httpd和php交互的方式有三种:

1、CGI方式

这种方式就是当客户端请求一个php页面时,Apache服务器会调用cgi协议生成一个php解释器,并将动态请求通过cgi协议发送给php解释执行环境,来解释执行php脚本,执行完成后生成一个页面,然后再将这个页面返回个Apache服务器,最终返回给客户端。不过一旦请求结束,那么php解释器这个进程会立即销毁掉。所以当有多个请求时,php解释器会反复的生成与销毁,可见执行效率较低。而且php解释器只在请求之后生成的,并不是之前生成的,所以在响应速度上比较慢。并且一旦请求的数量过多,生成的进程数也比较多,因此会比较消耗资源,这种方式也很少使用了。

                

2、Module

这种方式是将php功能直接编译成Apache的模块,这样php就作为apache的一个子功能存在,当需要php功能时,只需要加载该模块即可。模块是不能单独执行的,只有加载被调用后才可以执行 。而且一旦需要php功能,php解释器会在apache内部运行,不用重新生成一个进程,这样进程数量就减少了,不会过多的占用系统资源。通常这种方式,php和apache在同一个服务器上,因此,基本不存在网络IO所造成的性能影响。但是如果动态请求和静态请求比较多的情况下,所有的请求都由一台服务器来处理响应,那么此种场景下,服务器的负载毕竟经受严重的考验,因此会影响服务器的性能。

                

3、FastCGI/fpm

这种方式是将php功能作成一个php服务器,在这台服务器启动时,会加载FastCGI进程管理器,FastCGI进程管理器会生成多个fastCGI解释器进程(php-fpm进程),并等待web请求,这些fastCGI进程是服务器启动后就自动创建好的,且这些进程是一直常驻在内存当中的,所以一旦有web请求时,可以立刻响应,且这些进程只需启动一次就可以了,节省了系统资源。因此这种方式来处理动态内容时更加高效。在这种方式下,其apache通常作为前端反向代理服务器,它只负责处理静态请求,对于动态请求,它将转发给后端的php服务器来处理,因此这样就实现了请求的动静分离。由于静态内容和动态内容有专门的服务器进行响应,因此对于静态请求和动态请求的比较多的情况下,使用这种方式,服务器的性能会更好。但是这两台服务器的交互会受到网络IO的影响。

 

 

httpd 2.4新特性
1、MPM可于运行时装载;
 --enable-mpms-shared=all --with-mpm=event
2、支持Event MPM
3、异步读写
4、在每模块及每目录上指定日志级别;
5、每请求配置;<If>, <ElseIf>, <Else>;
6、增强的表达式分析器;
7、毫秒级的KeepAlive Timeout;
8、基于主机名的虚拟主机不再需要NameVirtualHost指令;
9、降低了内存占用;
10、支持在配置文件中使用自定义变量;

 

 

http-2-4-4中新增的模块

新增加的模块:
mod_proxy_fcgi
mod_proxy_scgi
mod_proxy_express
mod_remoteip
mod_session
mod_ratelimit
mod_request
等等;

 

 

编译安装httpd-2.4.4

编译安装httpd-2.4.4步骤如下:

实现安装开发库和开发工具

# yum -y install "Development Libraries"

# yum -y install  "Development Tools"

 

一、编译安装apr和apr-util

这里使用的源码包为apr-1.5.1.tar.bz2和apr-util-1.5.3.tar.bz2

httpd-2.4.4需要较新版本的apr和apr-util,因此需要事先对其进行升级。升级方式有两种,一种是通过源代码编译安装,一种是直接升级rpm包。直接升级rpm包会覆盖原来的文件。这里选择使用编译源代码的方式进行。

(1)、编译安装apr-1.5.1,编译步骤如下:

# tar -jxf   apr-1.5.1.tar.bz2

#cd apr-1.5.1

#./configure  --prefix=/usr/local/apr    #指定apr安装目录

#make

#make  install

        

 

(2)、编译安装apr-util-1.5.3.tar.bz2,编译步骤如下:

# tar -jxf  apr-util-1.5.3

# cd  apr-util-1.5.3

#./configure --prefix=/usr/local/apr-util    --with-apr=/usr/local/apr  (指定apr在哪)

#make

#make  install

 

(3)、 httpd-2.4.4编译过程也要依赖于pcre-devel软件包,需要事先安装。

# yum install pcre-devel

# yum -y install openssl-devel  ##如果httpd支持ssl功能,还需要安装ssl的开发包

 

二、编译安装httpd-2.4.4

步骤如下:

# tar -zxf  httpd-2.4.4.tar.gz

# cd httpd-2-4-4

# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib  --with-pcre  --with-apr=/usr/local/apr  --with-apr-util=/usr/local/apr-utils/ --enable-modules=most --enable-mpms-shared=all --with-mpm=event

# make  && make install

 

(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服务

源码编译安装的httpd,默认没有基于Sysv风格的脚本,因此只能使用如下方式启动和关闭httpf服务。

# /usr/local/apache/bin/apachectl start

关闭服务

# /usr/local/apache/bin/apachectl stop

 

说明:在这里安装完成之后,就可以启动httpd服务了,只不过在httpd-2-4-4版本中,启动httpd服务的脚本在/usr/local/apache/bin/apachectl,所以使用/usr/local/apache/bin/apachectl start即可。

如果在/usr/local/apache/bin/目录下,执行apachectl start启动的是之前的httpd的脚本文件和服务。原因是因为执行的是/usr/sbin/apachectl脚本文件而不是/usr/local/apache/bin/apachectl。而在/usr/sbin/apachectl文件中,执行的就是/etc/sbin/httpd -k  start,/etc/sbin/httpd就是之前的httpd版本的生成的二进制文件。

 

 

 

四、修改httpd-2-4-4的主配置文件/etc/httpd/httpd24.conf,设置PidFile文件路径

编辑/etc/httpd/httpd24.conf,添加如下行内容:

PidFile  "/var/run/httpd24.pid"

 

说明:在设置pid文件时,最好先将服务停止掉,然后在修改配置文件,否则重启后服务启动不了了。此时采用的办法就是用killall命令将此进程杀掉吧。


五、提供SysV服务脚本/etc/rc.d/init.d/httpd24

脚本内容如下

#!/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/httpd24.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



而后为此脚本赋予执行权限:
# chmod +x /etc/rc.d/init.d/httpd24

创建符号链接加入服务列表:
# chkconfig --add httpd24

设置开启自启动

# chkconfig httpd24 on

 

然后还需要导入头文件和库文件

导入头文件

# ln -sv /usr/local/apache/include /usr/include/httpd24

由于httpd-2.4.4并没有库文件因此不需要导入

 

修改PATH路径

# echo "PATH=/usr/local/apache/bin:$PATH"   >   /etc/profile.d/httpd24.sh

# source /etc/profile.d/httpd24.sh

 

导入帮助手册

修改/etc/man.conf文件

# vim /etc/man.conf

添加如下行信息:

MANPATH /usr/local/apache/man

 

至此,httpd-2.4.4完成编译过程已经完成了,接下来就可以进行测试访问了。

 


 

 

六、测试访问

在测试访问前,我们先来看看httpd的版本是不是2.4.4。之前由于已经修改了PATH环境变量,这里我直接使用httpd -v来查看当前的httpd版本号。

httpd与php交互的三种机制和编译安装LAMP之httpd-2.4.4_httpd-2.4.4

 

 

启动httpd服务

# service httpd24 start

访问默认主页http://192.168.108.251

httpd与php交互的三种机制和编译安装LAMP之httpd-2.4.4_httpd-2.4.4 _02

 

 

 

好了,编译安装后的httpd可以正常服务了,接下来,就看看httpd-2.4.4的虚拟主机吧。

 

 

七、httpd-2.4版本的虚拟主机配置 

在之前的httpd-2-2版本中 ,基于ip的访问控制格式如下:

Order  allow,deny

allow from all的形式,在httpd-2-4中不再支持这种格式的写法.

 

在httpd-2-4中各种访问控制需要使用关键字require:

基于ip的访问控制:Require  ip  IP-ADDRESS

基于网络的访问控制:Require NETWORK-ADDRESS

                                        Require  NETWORK/LENGTH

                                        Require  NET

注意:192.168.1.0/255.255.255.0 = 192.168.1.0/24 = 192.168 

基于主机的访问控制:Require  host   HOSTNAME

基于域名的访问控制:Require domain  DOMAIN

基于主机名的访问控制    Require  hostname   主机名;例如Require  hostname  www.sina.com

基于用户的访问控制:Require user USERNAME

基于用户组的访问控制:Require  group GROUPNAME

允许所有的主机访问:Require  all granted

拒绝所有主机访问:Require all deny

可以在每一个访问机制的关键词前面加not表示取反,例如Require not ip  192.168.1.1;表示不允许该主机访问。

 

httpd-2.4版本中虚拟主机的实现过程如下: 

在httpd-2.4版本中,基于主机名的虚拟主机不再需要NameVirtualHost指令;

只需要如下步骤即可:

1、编辑/etc/httpd24/httpd.conf文件,注释中心主机,即注释DocumentRoot这一行

 

2、编辑/etc/httpd24/httpd.conf文件,将"#Include /etc/httpd24/extra/httpd-vhosts.conf"这一行的"#"符号去掉,这个文件就是虚拟主机的配置文件,因此我们不需要在单独创建虚拟主机的配置文件。

 

3、编译/etc/httpd24/extra/httpd-vhosts.conf

在使用虚拟主机前,需要加载mod_log_config这个模块,因此需要在httpd的主配置文件(即/etc/httpd24/httpd.conf)中加载该模块。步骤如下:

# vim /etc/httd24/httpd.conf

LoadModule log_config_module modules/mod_log_config.so

 

mod_log_config这个模块加载完成之后,就可以编辑虚拟主机的配置文件了。

创建虚拟主机如:

<VirtualHost *:80>
 DocumentRoot "/www/httpd24/htdoc"
 servername www.xsl.com
 errorlog "logs/httpd24.errlog"
 customlog "logs/httpd24.accesslog" combined
 <Directory "/www/httpd24/htdoc">  //注意在httpd-2.4版本上要配置Directory容器,否则访问不了
  options none
  allowoverride none
  require ip  192.168.106.0/24   //我的测试机地址为192.168.106.0/24网段
 </Directory> 
</VirtualHost>

 

注意:注意在httpd-2.4版本上配置虚拟主机时,需要指定允许哪些主机可以访问,默认是不允许所有主机访问的。因此,需要配置Directory容器,并定义访问属性。
 

 

 #创建站点根目录

# mkdir -pv  /www/httpd24/htdoc

echo "welcome to httpd-2.4.4"  > /www/httpd24/htdoc/index.html

 

 

最后重启服务

# service httpd24 restart

 

测试访问默认主页

http://www.xsl.com   (确保主机名www.xsl.com可以被正常解析)

httpd与php交互的三种机制和编译安装LAMP之httpd-2.4.4_httpd-2.4.4 _03