一、apache介绍。

apache是一个基金会的名字,httpd才是我们要安装的软件包,早起叫apache,从2.0版本开始叫apache。

apache官网:www.apache.org

下载三个软件

http://mirrors.cnnic.cn/apache/
apr和apr-util是一个通用的函数库,可以让HTTPd不关心底层的操作系统,很方便的移植,比如从Linux到windows

http://mirrors.cnnic.cn/apache/apr/

二、apache安装

分别解压三个软件

tar zxvf apr-***.tar.gz

tar zxvf apr-util-***.tar.gz

tar zxvf httpd-***.tar.gz


先安装apr
cd apr-***.tar.gz

./configure --prefix=/usr/local/apr

make && make install


在安装apr-util-***.tar.gz

./configure --prefix=/usr/local/apr-util

--with-apr=/usr/local/apr                  (指定apr,依赖apr)

make && make install

这里可能会出现一个问题,提示缺少expat的开发库,安装一下就好

yum install expat-devel -y


最后安装httpd-***.tar.gz

./configure --prefix=/usr/local/apr-util 

--with-apr=/usr/local/apr                      (指定apr,依赖apr)

--with-apr-util=/usr/local/apr-util               (指定apr-util,依赖apr-util)

--enable-so                                (支持动态加载模块,例如php)

--enable-mods-shared=most                      (指定加载哪些模块,most表示绝大多数)


make && make install

这里会提示缺少pcre,pcre是个Perl库.包括perl兼容的正则表达式


进入/usr/local/apache2.4中

bin下是可执行文件

conf 是配置文件所在目录

htdocs 存放了一个访问页,默认的访问网页

logs 日志相关的目录

man 帮助文档

modules 存放了扩展模块


/usr/local/apache2.4/bin/httpd -M    

/usr/local/apache2.4/bin/apachectl -M    都是查看apache加载了哪些模块


static 静态模块  和bin/httpd是绑定在一起的文件

shared 动态模块  是一个.so文件,是在modules目录下


/usr/local/apache2.4/bin/apachectl start  启动apache

netstat -lntp                    查看默认监听80端口,mysql默认监听3306端口,ssh默认监听22端口



apache的三种工作模式:
(1)prefork:prefork模式算是很古老但是非常稳定的apache模式。apache在启动之初,就先fork一些子进程,然后等待请求进来。之所以这样做,是为了减少频繁创建和销毁进程的开销。每个子进程只有一个线程,在一个时间点内,只能处理一个请求
优点:成熟稳定,兼容所有新老模块。同时,不需要担心线程安全问题
缺点:一个进程相对占用更多的系统资源,消耗更多的内存。而且,他并不擅长处理高并发请求,在这种场景下,它会将请求放进队列里,一直等到有可用进程,请求才会被处理
(2)worker:和prefork模式相比,worker使用了多线程和多进程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监控线程,每个请求过来会被分配到一个线程来服务。线程比进程更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现更优秀些
优点:占用更少的内存,高并发下表现优秀
缺点:必须考虑线程安全的问题,因为多个子线程是共享父进程的内存地址的。如果使用keep-alive长连接的方式,某个线程会一直被占据,也许中间几乎没有请求,需要一直等待到超时才会被释放。如果太多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用
(3)event:它和worker模式很像,不同的是它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event模式中,会有一些专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放,增强了在高并发场景下的请求处理