Apache httpd 入门实战(1)--概念及安装
Apache httpd 是 Apache 软件基金会的一个开源的 Web 服务器,可以在大多数计算机操作系统中运行,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件之一。本文主要介绍其基本概念及安装,文中所使用到的软件版本:httpd 2.4.55、apr 1.7.2、apr-util 1.6.3、pcre 8.43、CentOS 7.9.2009。
1、Apache 概念
1.1、简介
Apache httpd 起初由伊利诺伊大学香槟分校的国家超级电脑应用中心(NCSA)开发,经过多次修改,成为世界上最流行的 Web 服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache 的特点是简单、速度快、性能稳定,并可做代理服务器来使用。
本来它只用于小型或试验 Internet 网络,后来逐步扩充到各种 Unix 系统中,尤其对 Linux 的支持相当完美。Apache 有多种特性,可以支持SSL技术,支持多个虚拟主机。Apache 是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个 Apache Web 站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。世界上很多著名的网站如Amazon、Yahoo!、W3 Consortium、Financial Times 等都是 Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、Linux系统平台上)以及它的可移植性等方面。
Apache httpd 的诞生极富有戏剧性。当 NCSA WWW 服务器项目停顿后,那些使用 NCSA WWW 服务器的人们开始交换他们用于该服务器的补丁程序,他们也很快认识到成立管理这些补丁程序的组织是必要的。就这样,诞生了Apache Group,后来这个团体在 NCSA 的基础上创建了 Apache httpd。
1.2、多处理模块(MPM)
Apache httpd 被设计为功能强大且灵活的 Web 服务器,可以在各种不同环境中的多种平台上工作。不同的平台和环境通常需要不同的功能,或者可能具有不同的方式来最有效地实现相同的功能。Apache httpd 通过其模块化设计一直适应各种环境。通过这种设计,网站管理员可以通过选择在编译时或运行时加载哪些模块来选择服务器中将包含哪些功能。
Apache httpd 2.0 将此模块化设计扩展到 Web 服务器的最基本功能。该服务器随附了多种选择的多处理模块(MPM),这些模块负责绑定到计算机上的网络端口,接受请求并调度子代来处理请求。
将模块化设计扩展到服务器的这一级别有两个重要的好处:
- Apache httpd 可以更干净,更有效地支持各种操作系统。特别是,服务器的 Windows 版本现在更加高效,因为它 mpm_winnt 可以使用本机联网功能代替 Apache httpd 1.3 中使用的 POSIX 层。此好处还扩展到了实现专用 MPM 的其他操作系统。
- 可以针对特定站点的需求更好地定制服务器。例如,需要大量可伸缩性的站点可以选择使用 worker 或 event,而需要稳定性或与旧版软件兼容的站点可以使用 prefork。
下表列出了各种操作系统的默认 MPM。如果您在编译时没有其他选择,则将选择该 MPM。
网络软件 | mpm_netware |
OS / 2 | mpmt_os2 |
Unix 系统 | prefork,worker或 event,取决于平台功能 |
视窗 | mpm_winnt |
在这里,“Unix” 用于表示类似 Unix 的操作系统,例如 Linux,BSD,Solaris,Mac OS X 等。
对于 Unix,关于安装哪个 MPM 的决定基于两个问题:
1、系统是否支持线程?
2、系统是否支持线程安全轮询(特别是 kqueue 和 epoll 函数)?
如果两个问题的答案均为“是”,则默认 MPM 为 event。
如果#1的答案为“是”,而#2的答案为“否”,则默认值为 worker。
如果两个问题的答案均为“否”,则默认 MPM 为 prefork。
实际上,这意味着默认值几乎始终为 event,因为所有现代操作系统都支持这两个功能。
编译的时候可以通过 --with-mpm 参数指定 mpm;安装完成后可通过 bin/httpd -V |grep -i "Server MPM" 命令查看当前使用的 mpm。
1.2.1、prefork
Aapache httpd 在启动之初,就预先派生一些子进程,然后等待请求过来;每个子进程只有一个线程,在一个时间点内,只能处理一个请求。
优点:成熟稳定,兼容所有模块,线程安全性高。
缺点:不适合处理高并发请求;一个进程相对占用更多的系统资源,消耗更多的内存。
1.2.2、worker
使用多进程和多线程的混合模式,也预先派生几个子进程(数量远少于 prefork 派生的);每个子进程创建多个线程,包括一个监听线程;每个请求会被分配一个线程来服务。
优点:占据更少的内存,适合高并发的场景。
缺点:必须考虑线程安全的问题,使用 keep-alive 长连接的时候,某个线程会被一直占用,即使没有收到请求,需要等待到超时才会释放;一个线程出现问题也会导致同一进程下的线程出现问题。
1.2.3、event
类似于 worker 的工作模式,最大区别是它解决了 keep-alive 场景下,长期被占用的线程的资源的浪费问题;event 模式下,会有一个专门的线程来管理这些 keep-alive 类型的线程,当有真实的请求过来的时候,将请求传递给服务线程,执行完毕又允许它释放。
2、安装
2.1、依赖软件安装
2.1.1、pcre 安装
官网(http://www.pcre.org/)下载 pcre,解压并安装:
unzip pcre-8.43.zip cd pcre-8.43 ./configure --prefix=/fop/soft/pcre-8.43 make make install
安装完成后需把 pcre 的 bin 目录添加到 PATH 的环境变量中:
PATH=$PATH:/home/mongo/soft/pcre-8.43/bin export PATH
2.1.2、APR 和 APR-Util 下载
官网(https://apr.apache.org/)下载 APR 和 APR-Util,然后解压到 httpd 源码目录的 srclib 目录下,解压后的目录需要把版本号去除:
APR 和 APR-Util 只需把源码放到指定目录,不需要单独编译及安装。
2.1.3、OpenSSL 安装
如果不需要配置 https,则该步不需要;OpenSSL 的安装可参考:OpenSSL 介绍(1)--概念及安装。这里安装在 /home/mongo/soft/openssl-1.1.1s 目录下。
2.2、httpd 安装
官网(https://httpd.apache.org/download.cgi)下载 httpd,解压后参考 2.1.2 的方法把 APR 和 APR-Util 的源码放到 srclib 目录下;然后编译安装:
cd httpd-2.4.55 ./configure --prefix=/home/mongo/soft/httpd-2.4.55 --with-included-apr --enable-ssl --with-ssl=/home/mongo/soft/openssl-1.1.1s make make install
安装完成后需把 OpenSSL 的 libssl 和 libcrypto 包拷贝到 httpd 安装目录的 lib 下:
cp /home/mongo/soft/openssl-1.1.1s/lib/libssl.so.1.1 /home/mongo/soft/httpd-2.4.55/lib/ cp /home/mongo/soft/openssl-1.1.1s/lib/libcrypto.so.1.1 /home/mongo/soft/httpd-2.4.55/lib/
2.3、启动
编辑 conf/httpd.conf 文件:
Listen 8080 ServerName 10.49.196.33:8080
执行命令:
bin/apachectl
启动后访问 8080 端口:
2.4、停止及重启
bin/apachectl -k stop #停止
bin/apachectl -k restart #重启
2.5、错误处理
2.5.1、fatal error: expat.h: No such file or directory
make 时可能会报:
fatal error: expat.h: No such file or directory
这是由于系统中缺少 expat-devel,安装下即可:
yum install expat-devel
2.5.2、error: Did not find working script at pcre-config
configure 时可能会报:
configure: error: Did not find working script at pcre-config
找不到 pcre-config 命令,需把 pcre 的 bin 目录添加到 PATH 的环境变量中:
PATH=$PATH:$PCRE_HOME/bin
export PATH
2.5.3、Cannot load modules/mod_ssl.so into server
启动 httpd 时可能会报:
httpd: Syntax error on line 133 of /home/mongo/soft/httpd-2.4.55/conf/httpd.conf: Cannot load modules/mod_ssl.so into server: libssl.so.1.1: cannot open shared object file: No such file or directory
OpenSSL 相关的包找不到,需把 OpenSSL 的 libssl 和 libcrypto 包拷贝到 httpd 安装目录的 lib 下:
cp $OPNESSL_HOME/lib/libssl.so.1.1 $HTTPD_HOME/lib/ cp $OPNESSL_HOME/lib/libcrypto.so.1.1 $HTTPD_HOME/lib/