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服务
# service httpd24 start
访问默认主页http://192.168.108.251
好了,编译安装后的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可以被正常解析)
本文出自 “linux学习之路” 博客,谢绝转载!