上次博文我们具体讨论了Apache(httpd)的理论知识和配置:
HTTP协议基础(参见博文:http://sweetpotato.blog.51cto.com/533893/1656137)
Apache2.2的基本配置(参见博文:http://sweetpotato.blog.51cto.com/533893/1657668)
Apache2.2的虚拟主机(参见博文:http://sweetpotato.blog.51cto.com/533893/1660229)
基于https的Apache2.2(参见博文:http://sweetpotato.blog.51cto.com/533893/1662061)
【本次博文的主要内容】
httpd 2.4的编译安装
httpd2.4配置的综合实验
一、编译安装httpd-2.4.12:
1、安装环境
系统环境:CentOS 6.4-x86_64
所需软件包:
apr-1.5.0.tar.bz2:apr(Apache Portable Runtime)
apr-util-1.5.4.tar.bz2
Perl-Compatible Regular Expressions Library (PCRE):pcre-devel
httpd-2.4.12.tar.bz2
下载地址:
http://apr.apache.org/
http://httpd.apache.org/
2、Apache的运行原理:
理解了Apache的运行机制后,才能更好地理解为什么Apache的安装需要依赖apr包哈。
【Apache的运行机制】:
由上图可知,apr(Apache可移植运行环境)是工作于OS之上的一层,Apache就是依靠它实现跨平台的哈;httpd-2.4.12依赖于更高版本(1.5版本以上)的apr和apr-util。
【Apache的启动过程】:
3、编译安装Apache2.4.12:
了解了上述内容后,下面我们就来实际编译安装Apache2.4.12
(1)配置编译环境并解决依赖关系(安装相关包组):
安装开发环境包组:
安装pcre-devel(兼容Perl的正则表达式库):
下载apr-1.5.2/apr-util-1.5.4:
编译安装apr-1.5.2:
[root@Centos ~]# tar xf apr-1.5.2 [root@Centos ~]# cd apr-1.5.2 [root@Centos ~]# ./configure --prefix=/usr/local/apr [root@Centos ~]# make && make install编译安装apr-util-1.5.4:
[root@Centos ~]# tar xf apr-util-1.5.4.tar.bz2 [root@Centos ~]# cd apr-util-1.5.4 [root@Centos apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/ [root@Centos apr-util-1.5.4]# make && make install(2)下载httpd-2.4.12源码包:
(3)解压并查看源码包内容:
(4)编译安装httpd-2.4.12:
[root@Centos httpd-2.4.12]# tar xf httpd-2.4.12.tar.bz2 [root@Centos httpd-2.4.12]# cd httpd-2.4.12 [root@Centos httpd-2.4.12]# ./configure --prefix=/usr/local/apache --sysconfdir=/etc/httpd-2.4.12 --enable-so --enable-ssl --enable-cgi --enable-rewrite --enable-deflate --with-z --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=event [root@Centos httpd-2.4.12]# make && make install # 各编译参数详解 --prefix:#安装路径 --sysconfdir:#指定配置文件路径 --enable-so:#DSO兼容,DSO=Dynamic Shared Object,动态共享对象,可实现模块动态生效 --enable-ssl:#支持SSL/TLS,可以实现https访问 --enable-cgi:#支持CGI脚本(默认对非线程的MPM模式开启) --enable-rewrite:#启用Rewrite功能 --enable-deflate:#支持压缩 --with-z:#使用指定的zlib库,不指定路径会自动寻找 --with-pcre:#使用指定的PCRE库,不指定路径会自动寻找 --with-apr:#指定apr安装路径 --with-apr-util:#指定apr-util安装路径 --enable-modules:#支持动态启用的模块,可选参数有“all”,“most”,“few”,“reallyall” --enable-mpms-shared:#支持动态加载的MPM模块,可选“all” --with-mpm:#设置默认启用的MPM模式(5)查看httpd-2.4.12安装目录的内容:
[root@Centos ~]# tree -d /usr/local/apache/ /usr/local/apache/ ├── bin #存放启动或关闭httpd的脚本文件 ├── build ├── cgi-bin #cgi程序文件的存放目录 ├── error #发生服务器端错误时返回给客户端的错误页面 │ └── include ├── htdocs #Web页面所在的目录 ├── icons #存放httpd的图标文件 │ └── small ├── include #存放头文件 ├── logs #httpd的日志文件 ├── man #帮助手册 │ ├── man1 │ └── man8 ├── manual #httpd的配置手册 │ ├── developer │ ├── faq │ ├── howto │ ├── p_w_picpaths │ ├── misc │ ├── mod │ ├── platform │ ├── programs │ ├── rewrite │ ├── ssl │ ├── style │ │ ├── css │ │ ├── lang │ │ ├── latex │ │ ├── scripts │ │ └── xsl │ │ └── util │ └── vhosts └── modules #存放httpd的模块配置文件存放位置:
(6)编译安装后的基本配置:
修改httpd的主配置文件,设置其Pid文件的路径:
修改PATH环境变量,让/usr/local/apache/bin目录下的命令都可以执行:
[root@Centos ~]# vim /etc/profile.d/httpd.sh #必须要以.sh结尾,并且放在这里可以单独管理,不要的时候可以直接删除,添加如下内容 export PATH=/usr/local/apache/bin:$PATH #思考一下:/usr/local/apache/bin放在前面有什么好处? [root@Centos ~]# . /etc/profile.d/httpd.sh #source一下 [root@Centos ~]# httpd -t #检查是相关命令是否可用了 Syntax OK导出头文件:
导出man手册(编辑/etc/man.config):
编写服务脚本(因是编译安装,不会自动生成服务脚本),并给其添加执行权限:
[root@Centos httpd-2.4.12]# vim /etc/rc.d/init.d/httpd #!/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 [root@Centos httpd-2.4.12]# chmod +x /etc/rc.d/init.d/httpd #添加执行权限启动服务并测试:
I:编辑/etc/hosts文件,添加如下内容(还记得为什么吗?参考上一篇博文的相关内容哈:http://sweetpotato.blog.51cto.com/533893/1657668):
II:测试能否启动、关闭httpd服务:
III:设置开机启动:
IV:在浏览器中测试:
到此,我们就成功编译安装了httpd-2.4.12。
二、Apache2.4配置的综合实验:
【实验目标】:
Apache2.4的配置主要体现出其与Apache2.2版本的区别之处。
建立httpd服务器(基于编译的方式进行),要求:
1)提供两个基于名称的虚拟主机:
(a)www1.webtest.com,页面文件目录为/web/vhosts/www1;错误日志为/var/log/httpd/www1.err,访问日志为/var/log/httpd/www1.access;
(b)www2.webtest.com,页面文件目录为/web/vhosts/www2;错误日志为/var/log/httpd/www2.err,访问日志为/var/log/httpd/www2.access;
(c)为两个虚拟主机建立各自的主页文件index.html,内容分别为其对应的主机名;
(d)通过www1.webtest.com/status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status);
2)www1主机仅允许192.168.1.0/24网络中的客户机访问;www2主机可以被所有主机访问;
【实验环境】:
一台CentOS6.4虚拟机作为DNS/CA/Apache2.4服务器,两台windows 7的虚拟机做客户端,规划如下:
CentOS6.4虚拟机上:配置了两块网卡(192.168.1.59/24 192.168.80.2/24)
域名:webtest.com 192.168.1.0/24
DNS/CA:ns1.webtest.com 192.168.1.59/24 192.168.80.2/24 CentOS6.4
Web:192.168.1.59/24 192.168.80.3/24 CentOS6.4
虚拟主机1:www1.webtest.com
虚拟主机2:www2.webtest.com
win7客户端1:
192.168.1.201/24 DNS指向192.168.1.59
win7客户端2:
192.168.80.11/24 DNS指向192.168.80.2
【实验步骤】:
Step1:按照规划,配置好各个虚拟机的网络,其中CentOS虚拟机上配置了两个IP地址,配置如下:
Step2:在192.168.1.59的CentOS虚拟机上安装并配置好DNS服务,区域文件的配置如下图所示:
说明:DNS的配置参考我前面的博文,这里不再赘述(参考博文地址:http://sweetpotato.blog.51cto.com/533893/1598225)。
Step2:启动DNS服务并测试:
Step3:按照上面步骤编译安装好Apache2.4.12并启动:
Step4:看看当前是以什么工作模型工作的:
说明:Apache2.4的新特性之一:正式支持event MPM模型
Step5:配置基于主机名的虚拟主机:
【配置说明】:
1、此处配置与RPM包安装的httpd2.2不同,虚拟主机的配置全部位于/etc/httpd-2.4.12/extra目录:
2、基于主机名的虚拟主机不再需要NameVirtualHost指令定义;
编辑httpd-vhosts.conf文件,定义基于主机名的虚拟主机并为每个虚拟主机定义日志:
<VirtualHost *:80> #配置基于主机名的虚拟主机(不再需要NameVirtualHost指令) ServerName www1.webtest.com DocumentRoot "/web/vhost/www1" ErrorLog "/var/log/httpd/www1.err" CustomLog "/var/log/httpd/www1.access" common </VirtualHost> <VirtualHost *:80> ServerName www2.webtest.com DocumentRoot "/web/vhost/www2" ErrorLog "/var/log/httpd/www2.err" CustomLog "/var/log/httpd/www2.access" common </VirtualHost>根据上述站点目录的定义,创建相关目录:
[root@Centos ~]# mkdir -pv /web/vhost/www1 mkdir: created directory `/web' mkdir: created directory `/web/vhost' mkdir: created directory `/web/vhost/www1' [root@Centos ~]# mkdir -pv /web/vhost/www2 mkdir: created directory `/web/vhost/www2' [root@Centos ~]# mkdir -pv /var/log/httpd mkdir: created directory `/var/log/httpd'在对应的虚拟主机站点目录下创建默认主页面,内容为对应的主机名:
检查语法错误并重启httpd服务:
Step6:在win7虚拟机上配置好网络并测试,特别注意将DNS指向我们配置好的DNS服务器:
win7-01(192.168.1.201):
win7-02(192.168.80.11):
Step7:查看每个虚拟主机的访问日志:
可以看到,两个虚拟主机运行正常哈,其日志正是我们在配置文件中定义的。
Step8:通过www1.webtest.com/status输出httpd工作状态相关信息,且只允许提供帐号密码才能访问(status:status):
在win7-01客户端上访问status:
输入用户名和密码:
Step9:配置www1主机仅允许192.168.1.0/24网络中的客户机访问;www2主机可以被所有主机访问:
【配置说明】:
与Apache2.2不同之处:
对于基于IP(客户端)的访问控制做了修改,不再支持使用order, allow, deny这些机制,而是统一使用require进行:
#语法: <directory "paht/to/somedir"> <RequireAll> Require all granted #允许所有IP访问 Require all denied #不允许任何IP访问 Require ip 192.168 #IP地址的简写方式 Require ip 192.168.1.0/24 #允许某个网段的IP访问 Require not ip 192.168.80.0/24 #不允许某个网段的IP访问 Require host test.com #不允许主机名是test.com的主机访问 </RequireAll> #注:Require的限制策略遵循“最后匹配原则”,即后一条规则会部分覆盖前一条规则(取交集)。检查语法并重读httpd.conf配置文件:
清空www1虚拟主机的日志:
用win7-02(IP:192.1658.80.11/24)的虚拟机访问www1.webtest.com:
查看www1主机的错误日志:
用win7-01(IP:192.165.1.201)的虚拟机访问www1.webtest.com:
查看www1主机的访问日志和错误日志:
小结:
本次博文我们主要讨论了:
1、编译安装Apache2.4.12:
Apache2.4.12的编译安装依赖于1.5以上版本的apr和apr-util。
2、通过配置Apache2.4.12阐述了与RPM包安装的Apache2.2在配置上的区别:
对于基于IP的访问控制做了修改,不再支持使用order, allow, deny这些机制,而是统一使用require进行
基于主机名的虚拟主机不再需要NameVirtualHost指令
3、Apache2.4的新特性:
MPM支持在运行时装载
支持event MPM类型
支持异步读写
在每模块及每目录上指定日志级别
每请求配置:<If>,<Elseif>
增强版的表达式分析器
毫秒级的keepalive timeout
支持使用自定义变量
新增模块
mod_proxy_fcgi
mod_ratelimit
mod_request
mod_remoteip
本次博文的内容就这么多哈,欢迎各位大大拍砖~~