1、介绍
Apache(音译为阿帕奇)是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩充,将Perl/Python等解释器编译到服务器中。
-
官方网站:www.apache.org
-
学习手册:http://httpd.apache.org/docs/2.4/
2、安装
2.1、安装依赖
[root@apache ~]# yum install -y pcre-devel libxml2 expat-devel gcc zlib-devel
2.2、apr介绍及安装
APR(Apache portable Run-time libraries,Apache可移植运行库)的目的如其名称一样,主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库。在早期 的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数。
[root@apache ~]# wget https://downloads.apache.org/apr/apr-1.7.0.tar.gz
[root@apache ~]# tar xf apr-1.7.0.tar.gz
[root@apache ~]# cd apr-1.7.0/
[root@apache apr-1.7.0]# ./configure --prefix=/usr/local/apr
[root@apache apr-1.7.0]# make && make install
2.3、APR-util介绍及安装
apr-util该目录中也是包含了一些常用的开发组件。这些组件与apr目录下的相比,它们与apache的关系更加密切一些。比如存储段和存储段组,加密等等。
[root@apache ~]# wget l
[root@apache ~]# tar xf apr-util-1.6.1.tar.gz
[root@apache ~]# cd apr-util-1.6.1/
[root@apache apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
[root@apache apr-util-1.6.1]# make && make install
2.4、 apr-iconv介绍及安装
apr-iconv包中的文件主要用于实现iconv编码。目前的大部分编码转换过程都是与本地编码相关的。在进行转换之前必须能够正确地设置本地编码。因此假如两个非本地编码A和B需要转换,则转换过程大致为A->Local以及Local->B或者B->Local以及Local->A。
[root@apache ~]# wget https://downloads.apache.org/apr/apr-iconv-1.2.2.tar.gz
[root@apache ~]# tar xf apr-iconv-1.2.2.tar.gz
[root@apache ~]# cd apr-iconv-1.2.2/
[root@apache apr-iconv-1.2.2]# ./configure --prefix=/usr/local/apr-iconv --with-apr=/usr/local/apr
[root@apache apr-iconv-1.2.2]# make && make install
2.5、apache安装
[root@apache ~]# wget https://downloads.apache.org/httpd/httpd-2.4.54.tar.gz
[root@apache ~]# tar xf httpd-2.4.54.tar.gz
[root@apache ~]# cd httpd-2.4.54/
[root@apache httpd-2.4.54]# ./configure --prefix=/usr/local/apache --enable-mpms-shared=all --with-mpm=event --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-so --enable-remoteip --enable-proxy --enable-proxy-fcgi --enable-proxy-uwsgi --enable-deflate=shared --enable-expires=shared --enable-rewrite=shared --enable-cache --enable-file-cache --enable-mem-cache --enable-disk-cache --enable-static-support --enable-static-ab --disable-userdir --enable-nonportable-atomics --disable-ipv6 --with-sendfile
[root@apache httpd-2.4.54]# make && make instatll
[root@apache httpd-2.4.54]# tree -L 1
.
├── bin 二进制命令
├── build
├── cgi-bin cgi脚本目录
├── conf 配置文件目录
├── error 错误记录
├── htdocs 默认网站根目录
├── icons 小图标
├── include 一些C语言文件
├── logs 日志目录
├── man 帮助手册
├── manual 在线手册
└── modules 存放apache运行需要的模块
参 数 | 作 用 |
--prefix=/usr/local/apache | 指定安装目录 |
--enable-mpms-shared=all --with-mpm=event | 开启动态MPM切换 |
--with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util | 指定依赖包apr apr-util安装路径 |
--enable-so | 打开 so 模块,so 模块是用来提 dso 支持的 apache 核心模块 |
--enable-remoteip | 支持基于客户端IP做访问控制 |
--enable-proxy --enable-proxy-fcgi --enable-proxy-uwsgi | 启用代理支持PHP Python网站 |
--enable-deflate=shared | 开启压缩 |
--enable-expires=shared | 开启客户端缓存 |
--enable-rewrite=shared | 开启URL重写 |
--enable-cache --enable-file-cache --enable-mem-cache --enable-disk-cache | 开启服务器缓存 |
--enable-static-support | 支持静态连接 |
--enable-static-ab | 使用静态连接编译 ab - apache http 服务器性能测试工具 |
--disable-userdir | 禁用用户主目录提供页面访问 |
--enable-nonportable-atomics | 对新式CPU支持,支持原子的比较交换(compare-and -swap, CAS)操作指令 |
--disable-ipv6 | 禁用IPV6 |
--with-sendfile | 开启sendfile 0复制机制 |
2.5.1、启动服务
[root@apache ~]# /usr/local/apache/bin/httpd
- 验证,浏览器输入IP地址,显示以下内功表示安装成功
Apache停止 停止以服务形式的Apache时,执行 “httpd -k stop” 或者 “httpd -k shutdown” 命令。 执行后的命令行页面如下,显示 “service has stopped” 表示停止成功。
3、MPM多处理模块
3.1、介绍
Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作。不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率。Apache httpd 通过模块化的设计来适应各种环境。这种设计允许网站管理员通过在 编译时或运行时,选择哪些模块将会加载在服务器中,来选择服务器特性。
Apache HTTP 服务器 2.0 扩展此模块化设计到最基本的 web 服务器功能。 它提供了可以选择的多处理模块(MPM),用来绑定到网络端口上,接受请求, 以及调度子进程处理请求。
扩展到这一级别的服务器模块化设计,带来两个重要的好处:
- Apache httpd 能更优雅,更高效率的支持不同的平台。尤其是 Apache httpd 的 Windows 版本现在更有效率了,因为
mpm_winnt
能使用原生网络特性取代在 Apache httpd 1.3 中使用的 POSIX 层。它也可以扩展到其它平台 来使用专用的 MPM。 - Apache httpd 能更好的为有特殊要求的站点定制。例如,要求 更高伸缩性的站点可以选择使用线程的 MPM,即
worker
或event
; 需要可靠性或者与旧软件兼容的站点可以使用prefork
。
在用户看来,MPM 很像其它 Apache httpd 模块。主要是区别是,在任何时间, 必须有一个,而且只有一个 MPM 加载到服务器中。可用的 MPM 列表位于 模块索引页面。
3.2、默认MPM
下表列出了不同系统的默认 MPM。如果你不在编译时选择,那么它就是你将要使用的 MPM。
Netware | mpm_netware |
OS/2 | mpmt_os2 |
Unix | prefork ,worker 或 event ,取决于平台特性 |
Windows | mpm_winnt |
3.3、建MPM为静态模块
在全部平台中,MPM 都可以构建为静态模块。在构建时选择一种 MPM,链接到服务器中。如果要改变 MPM,必须重新构建。
为了使用指定的 MPM,请在执行 configure
脚本 时,使用参数 --with-mpm=NAME
。NAME 是指定的 MPM 名称。
编译完成后,可以使用 ./httpd -l
来确定选择的 MPM。 此命令会列出编译到服务器程序中的所有模块,包括 MPM。
3.4、构建MPM为动态模块
在 Unix 或类似平台中,MPM 可以构建为动态模块,与其它动态模块一样在运行时加载。 构建 MPM 为动态模块允许通过修改 LoadModule
指令内容来改变 MPM,而不用重新构建服务器程序。
在执行 configure
脚本时,使用 --enable-mpms-shared
选项可以启用此特性。 当给出的参数为 all
时,所有此平台支持的 MPM 模块都会被安装。还可以在参数中给出模块列表。
默认 MPM,可以自动选择或者在执行 configure
脚本时通过 --with-mpm
选项来指定,然后出现在生成的服务器配置文件中。 编辑 LoadModule
指令内容可以选择不同的 MPM。
4、Apache 默认网站
每一个web服务器软件一般默认都会提供一个用于测试的网站,apache也为用户提供了一个默认网站。默认网站的配置写在默认配置文件中。
[root@apache ~]# cat /usr/local/apache/conf/httpd.conf
默认配置:
– Listen:监听地址:端口(80)
– ServerName:本站点注册的DNS名称(空缺)
– DocumentRoot:网页根目录(/var/www/html)
– DirectoryIndex:起始页/首页文件名(index.html)
5、Apache 虚拟主机
由同一台服务器提供不同的web站点,区分方式:基于域名、端口、IP地址的虚拟主机。
默认情况下,一个web服务器软件只能定义一个默认网站,也就是说只能发布一个WEB站点,对于大网站还可以,有海量用户来消耗服务器的资源,但是小网站呢?一个服务器上只跑一个小网站,服务器资源使用约等于0,那就尴尬了。为了充分利用服务器资源,现实生产环境中一般都是采用一个WEB服务器软件发布多个站点。如何解决这个问题呢?那就是配置虚拟主机!
虚拟主机和默认网站在apache中不能同时存在,只能存在一种,当虚拟主机出现后,apache默认网站就失效了,如果你还需要默认网站,就拿虚拟主机在发布一次默认网站对应的站点即可解决。
5.1、基于IP的虚拟主机
5.1.1、修改主配置文件,打开虚拟主机子配置文件
[root@apache ~]# vim /usr/local/apache/conf/httpd.conf
# Virtual hosts
Include conf/extra/httpd-vhosts.conf # 把本行的#删除
5.1.2、设置基于IP的虚拟主机
需求,给服务器配置多个IP,有几个虚拟主机及配置几个IP地址,实验用了两个虚拟主机,所以有两个IP即可 192.168.4.80、192.168.4.81
[root@apache ~]# ifconfig eth0:1 192.168.4.81
5.1.3、创建两个WEB站点 WEB1 WEB2
[root@apache ~]# mkdir /usr/local/apache/htdocs/web{1,2}
[root@apache ~]# echo web1 > /usr/local/apache/htdocs/web1/index.html
[root@apache ~]# echo web2 > /usr/local/apache/htdocs/web2/index.html
[root@apache ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost 192.168.4.80:80>
#ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache/htdocs/web1"
#ServerName dummy-host.example.com
#ServerAlias www.dummy-host.example.com
#ErrorLog "logs/dummy-host.example.com-error_log"
#CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<VirtualHost 192.168.4.81:80>
#ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/usr/local/apache/htdocs/web2"
#ServerName dummy-host2.example.com
#ErrorLog "logs/dummy-host2.example.com-error_log"
#CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>
5.1.4、重启apache,测试服务
[root@apache ~]# /usr/local/apache/bin/apachectl -t
Syntax OK
[root@apache ~]# killall httpd
[root@apache ~]# /usr/local/apache/bin/apachectl
[root@apache ~]# elinks http://192.168.4.80 -dump
web1
[root@apache ~]# elinks http://192.168.4.81 -dump
web2
基于IP的虚拟主机特点:
不同IP对应不同网站,访问方便,用户直接使用默认端口即可访问,服务器需要有多个IP地址,适合IP充足环境。
5.2、基于prot的虚拟主机
5.2.1、修改子配置文件
[root@apache ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
#ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache/htdocs/web1"
#ServerName dummy-host.example.com
#ServerAlias www.dummy-host.example.com
#ErrorLog "logs/dummy-host.example.com-error_log"
#CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
Listen 81 # 一定要开启端口
<VirtualHost *:81>
#ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/usr/local/apache/htdocs/web2"
#ServerName dummy-host2.example.com
#ErrorLog "logs/dummy-host2.example.com-error_log"
#CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>
5.2.2、 重启apache,测试服务
[root@apache ~]# /usr/local/apache/bin/apachectl -t
Syntax OK
[root@apache ~]# killall httpd
[root@apache ~]# /usr/local/apache/bin/apachectl
[root@apache ~]# elinks http://192.168.4.80:80 -dump
web1
[root@apache ~]# elinks http://192.168.4.80:81 -dump
web2
基于端口的虚拟主机特点:
不同端口对应不同网站,访问需要加端口,节省IP地址,适合私网运行。
5.3、基于域名的虚拟主机
设置多个域名,生产环境中如果可以直接在dns解析域名到主机IP,但是实验中没有域名和DNS,就使用hosts文件做了个解析。修改客户端hosts文件,解析域名 web1.com 192.168.4.80、web2.com 192.168.4.80,用本机做服务端和客户端,所以修改本机hosts文件。
5.3.1、修改hosts文件
[root@apache ~]# vim /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.4.80 web1.com
192.168.4.80 web2.com
5.3.2、修改子配置文件
[root@apache ~]# vim /usr/local/apache/conf/extra/httpd-vhosts.conf
<VirtualHost *:80>
#ServerAdmin webmaster@dummy-host.example.com
DocumentRoot "/usr/local/apache/htdocs/web1"
ServerName web1.com
#ServerAlias www.dummy-host.example.com
#ErrorLog "logs/dummy-host.example.com-error_log"
#CustomLog "logs/dummy-host.example.com-access_log" common
</VirtualHost>
<VirtualHost *:80>
#ServerAdmin webmaster@dummy-host2.example.com
DocumentRoot "/usr/local/apache/htdocs/web2"
ServerName web2.com
#ErrorLog "logs/dummy-host2.example.com-error_log"
#CustomLog "logs/dummy-host2.example.com-access_log" common
</VirtualHost>
5.3.3、重启apache,测试服务
[root@apache ~]# /usr/local/apache/bin/apachectl -t
Syntax OK
[root@apache ~]# killall httpd
[root@apache ~]# /usr/local/apache/bin/apachectl
[root@apache ~]# elinks http://web1.com -dump
web1
[root@apache ~]# elinks http://web2.com -dump
web2
基于域名的虚拟主机特点:
不同域名对应不同网站,需要多个域名 可以是二级或三级域名,每个站点使用默认端口,方便用户访问,只需要一个IP地址,节约成本,适合公网环境。