Linux运维实战之Apache2.4编译安装及其新特性

上次博文我们具体讨论了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:

[[email protected] ~]# tar xf apr-1.5.2
[[email protected] ~]# cd apr-1.5.2
[[email protected] ~]# ./configure --prefix=/usr/local/apr
[[email protected] ~]# make && make install

编译安装apr-util-1.5.4:

[[email protected] ~]# tar xf apr-util-1.5.4.tar.bz2 
[[email protected] ~]# cd apr-util-1.5.4
[[email protected] apr-util-1.5.4]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
[[email protected] apr-util-1.5.4]# make && make install

(2)下载httpd-2.4.12源码包:

(3)解压并查看源码包内容:

(4)编译安装httpd-2.4.12:

[[email protected] httpd-2.4.12]# tar xf httpd-2.4.12.tar.bz2
[[email protected] httpd-2.4.12]# cd httpd-2.4.12
[[email protected] 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
[[email protected] 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安装目录的内容:

[[email protected] ~]# 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
│   ├── images
│   ├── misc
│   ├── mod
│   ├── platform
│   ├── programs
│   ├── rewrite
│   ├── ssl
│   ├── style
│   │   ├── css
│   │   ├── lang
│   │   ├── latex
│   │   ├── scripts
│   │   └── xsl
│   │       └── util
│   └── vhosts
└── modules  #存放httpd的模块

配置文件存放位置:

(6)编译安装后的基本配置:

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

修改PATH环境变量,让/usr/local/apache/bin目录下的命令都可以执行:

[[email protected] ~]# vim /etc/profile.d/httpd.sh #必须要以.sh结尾,并且放在这里可以单独管理,不要的时候可以直接删除,添加如下内容
export PATH=/usr/local/apache/bin:$PATH    #思考一下:/usr/local/apache/bin放在前面有什么好处?
[[email protected] ~]# . /etc/profile.d/httpd.sh  #source一下
[[email protected] ~]# httpd -t   #检查是相关命令是否可用了
Syntax OK

导出头文件:

导出man手册(编辑/etc/man.config):

编写服务脚本(因是编译安装,不会自动生成服务脚本),并给其添加执行权限:

[[email protected] 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 [email protected]
    RETVAL=$?;;
*)
    echo $"Usage: $prog {start|stop|restart|condrestart|reload|status|fullstatus|graceful|help|configtest}"
    exit 1
esac
exit $RETVAL
[[email protected] 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>

根据上述站点目录的定义,创建相关目录:

[[email protected] ~]# mkdir -pv /web/vhost/www1
mkdir: created directory `/web‘
mkdir: created directory `/web/vhost‘
mkdir: created directory `/web/vhost/www1‘
[[email protected] ~]# mkdir -pv /web/vhost/www2
mkdir: created directory `/web/vhost/www2‘
[[email protected] ~]# 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


本次博文的内容就这么多哈,欢迎各位大大拍砖~~

时间: 2024-08-06 11:34:29

Linux运维实战之Apache2.4编译安装及其新特性的相关文章

王高利:Apache2.4编译安装及其新特性

http://skypegnu1.blog.51cto.com/8991766/1764006

linux运维实战练习-正则表达式

一.linux运维实战练习题及解答 1.显示/etc/passwd文件中以bash结尾的行 2.显示/etc/passwd文件中的两位数或三位数 3.显示`netstat -tan`命令结果中以'LISTEN'后跟0个.1个或者多个空白字符结尾的行 4.添加用户bash.testbash.basher以及nologin用户(nologin用户的shell为/sbin/nologin):而后找出/etc/passwd文件中用户名与其shell名相同的行 5.显示当前系统上root.centos或者

linux运维实战练习-2015年9月01日课程作业(练习)

linux运维实战练习-2015年9月01日课程作业(练习)安排 一.作业(练习)内容: 1.复习本次课程所讲的内容 2.总结整理磁盘管理及文件系统管理中设计的各种命令的使用,并附注一定的示例: 在Linux中,一块磁盘能被使用(可以被访问.被写入.被存储)要有以下三个步骤: (1)进行磁盘分区,及创建分区 (2)创建文件系统 (3)挂载文件系统 (1)磁盘分区 创建分区的命令: fdisk, parted, sfdisk fdisk:最多支持在一块硬盘上的15个分区:fdisk提供了一个交互式

linux运维实战练习-2015年9月5日课程作业(任务计划使用和练习)-JY1506402-19+liuhui880818

作业目标:linux运维实战练习-2015年9月5日课程作业(练习)安排 作业环境:CentOS 6.7/7 x86_64 一.作业(练习)内容: 1.总结Linux系统上的任务计划(at.crontab)的详细使用方法: 2.每周一到周六的凌晨3点20分,运行cp命令对/etc/目录进行归档另存,存储位置为/backups/etc-YYYY-MM-DD: 3.每周日凌晨2点30分,运行cp命令对/etc/fstab文件进行备份,存储位置为/backup/fstab-YYYY-MM-DD-hh-

linux运维实战练习案例-2015年12月20日-12月31日 (第一次)

一.实战案例(练习)内容 假如你学习完Linux,想找一份儿Linux相关的运维工作,某天你接到一家公司给出的邀请,你来到该公司面试,面试前,运维主管给你出了一些简单的笔试题,题目如下: 1.创建一个10G的文件系统,类型为ext4,要求开机可自动挂载至单独数据/data目录: 操作步骤: (1).使用fdisk工具创建一个10G的分区 [[email protected] ~]# fdisk /dev/sda 欢迎使用 fdisk (util-linux 2.23.2). 更改将停留在内存中,

Linux运维实战之Apache的基本配置(全局配置、主服务器配置):

上次博文我们具体讨论了http协议(参见:http://sweetpotato.blog.51cto.com/533893/1656137),本次博文我们来具体配置一台Apache(httpd)服务器. 本次博文的主要内容: httpd相关包信息 httpd的安装及主页面 httpd的配置文件 httpd的全局配置 httpd的主服务器配置 一.httpd的RPM包介绍及其相关信息: RHEL5和RHEL6略有不同: 下图是RHEL5上httpd相关包的信息: 下图是RHEL6上httpd相关包

Linux运维实战之DNS(bind)服务器的安装与配置

上次博文我们讨论了DNS的基础,本次博文我们重点来看看如何配置一台DNS服务器. [本次博文的主要内容] bind服务器简介(包括客户端工具dig的介绍) 配置正向解析DNS服务器 配置反向解析DNS服务器 配置辅助DNS服务器并在主辅之间实现区域传送 一.BIND服务器简介: Bind是Berkeley Internet Name Domain Service的简写,它是一款实现DNS服务器的开放源码软件.Bind原本是美国DARPA资助伯克利大学(Berkeley)开设的一个研究生课题,后来

linux运维实战练习-中级班套餐班-2015年10月18日-10月24日课程作业(练习)安排

一.作业(练习)内容: 1.MariaDB基础总结,包括表管理.索引管理.用户及权限管理: 2.编译安装LAMP,其中分别实现: (1).把php编译成为httpd的模块 (2).php以fpm工作为独立守护进程 3.安装并配置基于虚拟用户的vsftpd: 4.建立nfs共享,将主机172.16.0.1上的目录/magedu通过nfs共享给172.16.0.0/16(可根据自己的网络情况来设置)网络的主机以读写方式使用: 5.建立samba共享,共享目录为/data,要求: 1)共享名为shar

20161011L04-03老男孩linux运维实战培训-Linux系统的用户和用户组管理-01

一些LINUX用户的操作命令 useradd   创建用户 adduser  创建用户 passwd  改密码命令 usermod  改变用户名,和用户目录的 userdel 删除用户 id 显示用户UID 和 GID的 groupadd 创建用户组 groupdel 删除用户组 groupmod 改变用户组名信息 groups  显示用户所属的组 /etc/skel   用户新建用户的时候和默认去取配置的地方 /etc/login.defs 用来定义用户创建时一些用户的信息 比如UID GID