# 安装apache

apache依赖于apr和apr-util包

## 安装apr

下载：

```bash
wget http://mirrors.cnnic.cn/apache/httpd/httpd-2.4.27.tar.gz

wget http://mirrors.hust.edu.cn/apache/apr/apr-1.5.2.tar.gz

wget http://mirrors.hust.edu.cn/apache/apr/apr-util-1.5.4.tar.gz
```

解压：

```bash
tar zxvf httpd-2.4.27.tar.gz

tar zxvf apr-util-1.5.4.tar.gz

tar zxvf apr-1.5.2.tar.gz

cd /usr/local/src/apr-1.5.2
```

安装apr：

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


make && make install
```

安装apr-util：

```bash
cd /usr/local/src/apr-util-1.5.4


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


make && make install
```

## 安装apache

安装：

```bash
cd /usr/local/src/httpd-2.4.27


./configure \   //这里的反斜杠是脱义字符，加上它我们可以把一行命令写成多行
--prefix=/usr/local/apache2.4 \
--with-apr=/usr/local/apr \
--with-apr-util=/usr/local/apr-util \
--enable-so \
--enable-mods-shared=most


make && make install
```

启动httpd\
：

```bash
/usr/local/apache/bin/apachectl start
```

apache命令：

* /usr/local/apache/bin/apachectl -M ：查看各种库静态库 /usr/local/apache/bin/httpd

  ，动态库 /usr/local/apache/modules/
* /usr/local/apache/bin/apachectl -l ：查看静态库以及apache工作模式
* /usr/local/apache/bin/apachectl -t ：查看配置文件有无语法错误，配置文件 /usr/local/apache/conf/httpd.conf
* /usr/local/apache/bin/apachectl graceful 加载配置文件

启动httpd时的警告

```
httpd: apr_sockaddr_info_get() failed for 【linux】
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName

解决方法\(问题在于主机名不匹配\)
警告1 ：在/etc/hosts中的127.0.0.1行后添加linux
警告2 ：在httpd的配置文件/usr/local/apache/conf/httpd.conf中的ServerName行中改为 ServerName linux:80
```

开机启动httpd

```
cp /usr/local/apache/bin/apachectl /etc/init.d/httpd

vim /etc/init.d/httpd
# 加入：
#chkconfig:345 61 61
#description:Apache httpd


# 开机启动
chkconfig --add httpd
chkconfig --level 345 httpd on
```

httpd的工作模式

```bash
/usr/local/apache/bin/apachectl -l
有prefork.c 为prefork模式
有worker.c 为worker模式

prefork模式使用多个子进程，每个子进程只有一个线程。每个进程在某个确定的时间只能维持一个连接。在大多数平台上，Prefork MPM在
效率上要比Worker MPM要高，但是内存使用大得多。prefork的无线程设计在某些情况下将比worker更有优势：它可以使用那些没有处理好线
程安全的第三方模块，并且对于那些线程调试困难的平台而言，它也更容易调试一些。

worker模式使用多个子进程，每个子进程有多个线程。每个线程在某个确定的时间只能维持一个连接。通常来说，在一个高流量的HTTP服务
器上，Worker MPM是个比较好的选择，因为Worker MPM的内存使用比Prefork MPM要低得多。但worker MPM也由不完善的地方，如果一个线程
崩溃，整个进程就会连同其所有线程一起"死掉"。由于线程共享内存空间，所以一个程序在运行时必须被系统识别为"每个线程都是安全的"。

Event MPM：以上两种稳定的MPM方式在非常繁忙的服务器应用下都有些不足。尽管HTTP的Keepalive方式能减少TCP连接数量和网络负载，但是
Keepalive需要和服务进程或者线程绑定，这就导致一个繁忙的服务器会耗光所有的线程。 Event MPM是解决这个问题的一种新模型，它把服务
进程从连接中分离出来。在服务器处理速度很快，同时具有非常高的点击率时，可用的线程数量就是关键的资源限 制，此时Event MPM方式是最
有效的。一个以Worker MPM方式工作的繁忙服务器能够承受每秒好几万次的访问量（例如在大型新闻服务站点的高峰时），而Event MPM可以用来
处理更高负载。值得注意的是，Event MPM不能在安全HTTP（HTTPS）访问下工作
```

> 总的来说，prefork方式速度要稍高于worker，然而它需要的cpu和memory资源也稍多于woker。
