纸上得来终觉浅,绝知此事要躬行。

1. Web服务器和应用服务器
1.1 Web服务器
Web服务器只负责处理HTTP协议,只是简单的通过响应HTML页面来处理HTTP请求。
(1) httpd(Apache)
简述
Apache HTTP Server是Apache软件基金会的一个开放源码的网页服务器,可以在大多数计算机操作系统中运行,由于其多平台和安全性被广泛使用,是最流行的Web服务器端软件之一。它快速、可靠并且可通过简单的API扩展,将Perl/Python等解释器编译到服务器中。
特性
- 支持通用网关接口
- 集成代理服务器模块
- 提供用户会话过程的跟踪
- 支持安全
Socket层(SSL) - 支持多种方式的
HTTP认证 - 支持最新的
HTTP/1.1通信协议 - 支持基于 IP 和基于域名的虚拟主机
(2) IIS
- 简述
IIS是Internet Information Services的缩写,意为互联网信息服务,是由微软公司提供的基于运行Microsoft Windows的互联网基本服务。IIS是一种Web服务组件,其中包括Web服务器(网页浏览)、FTP服务器(文件传输)、NNTP服务器(新闻服务)和SMTP服务器(邮件发送)。
- 缺点
IIS的安全脆弱性曾长时间被业内诟病,一旦IIS出现远程执行漏洞威胁将会非常严重。
(3) Lighttpd
- 简述
Lighttpd是一个德国人领导的开源Web服务器软件,也是最流行的Apache服务器替代者。
- 优点
Lighttpd是一个单线程的针对大量持续连接做出专门优化的Web服务器(这正是多数高流量网站需要的)。Lighttpd支持FastCGI、HTTP服务器端压缩、mod-rewrite和其他众多有用的功能。- 尽管
Lighttpd拥有Apache的绝大多数功能,但它仍然保持轻量级(仅1MB)并且可以与Apache使用相同的配置。
(4) Nginx
- 简述
Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强。Nginx对静态页面的支持相当出色,轻量且免费。Nginx不支持CGI,但是支持更灵活的FastCGI。
- 优点
Nginx可以在大多数Unix/Linux/MacOS上编译运行,并有Windows移植版Nginx是一个很强大的高性能Web和反向代理服务器- 在连接高并发的情况下,
Nginx是Apache服务器不错的替代品
1.2 应用服务器
应用服务器一般是用来处理动态请求的服务器。应用服务器一般也支持
HTTP协议,因此界限没这么清晰。但是应用服务器的HTTP协议部分仅仅是支持,一般不会做特别优化,所以很少有见Tomcat直接暴露给外面,而是和Nginx、httpd(Apache)等配合,只让Tomcat处理JSP和Servlet部分。
Java
GlassFishJBossApache TomcatWebLogic
.Net
IISMonoBase4TNAPS Application Server
PHP
Zend ServerHHVM
2. httpd服务的历史
httpd(Apache)的历史就是Web服务器的发展历史。
**Apache 1.x**(1995 年)
- (1) 支持更多平台
- (2) 支持动态共享对象
- 能够在多种平台上支持以动态共享对象(
DSO)的方式加载模块。 - 这样是服务器更加灵活的工作,同时也使
Apache的内容消耗量有所下降,从而响应更多请求连接。 - 但是,因为频繁的加载模块会使服务器的效率变低。
- 能够在多种平台上支持以动态共享对象(
- (3) 增加
APACI和APXS脚本- 通过
APACI脚本用户可以在编译Apache的时候指定各种参数或安装布局,从而降低安装难度。
- 通过
- (4) 增加和增强了模块功能
- 代理模块更容易使用
- 支持以
CONNECT方式连接 - 别名和重定向开始支持正则表达式
- 引入
mod_negotiation模块以支持当时最新的HTTP/1.1协议
**Apache 2.0/2.2**(2002 年)
- (1) 加强了
Apache的跨平台移植能力 - (2) 支持多路处理模块(
MPM)- 提高了服务器的性能和稳定性,而且改善
Apache可扩展性 - 而在支持
POSIX线程的UNIX/Linux系统上,可以使用混合的多进程、多线程模型运行
- 提高了服务器的性能和稳定性,而且改善
- (3) 改变了原本的
API接口- 增加了新的调用方式以提高模块性能
- (4) 模块功能的增强
mod_ssl作为官方模块正式引入到Apache中- 新增
mod_auth_ldap可以使LDAP数据库进行认证 - 代理模块重写,并且提供了过滤功能的结构优势
- (5) 授权/认证模块的变动
mod_auth模块被分为mod_auth_basic和mod_authn_file模块mod_auth_dbm模块更名为mod_authn_dbmmod_access模块更名为mod_authz_host- 新增
mod_authn_alias模块用于简化身份认证配置 - 新增
htcacheclean工具来清除mod_disk_cache模块使用的缓冲存储区 - 新增
mod_proxy_balancer模块来为mod_proxy提供负载均衡服务 - 更新了正则表达式库的支持
- 通过
mod_dbd和apr_dbd框架支持SQL数据库使用
**Apache 2.3/2.4**(2008 年)
- 增强多路处理模块(
MPM)mpm模块将不再是只能选择一种mpm编译进内核,而是全部编译并根据配置文件进行配置
KeepAliveTimeout支持毫秒为单位- 减轻服务器负担
- 内存使用量减少
- 使得
Apache能在有限的内存中处理更多请求连接
- 使得
- 新增表达式解析器
- 新增大量模块
mod_lua对LUA语言的支持mod_ratelimit提供客户端限速功能mod_proxy_fcgi提供了FastCGI的支持mod_proxy_scgi提供了SCGI网关的支持mod_allowmethods更深入的限制HTTP连接方式event模块不再是测试模块,以及可以运行在生产平台了
FastkCGI加入到守护进程中
3. httpd服务的特性
服务特性DSO
- 简述
DSO是动态共享模块(Dynamic Shared Object)的缩写httpd具有高度模块化:core + modules- 我们可以更加灵活的对
httpd服务进行自己的个人定制和特性化
- 优点
- 在
httpd.conf配置文件中使用LoadModule来完成模块的加载,使用更加灵活 - 使用
DSO与apxs(Apache扩展)可以将新模块快速加入服务器,无须重新编译 - 通过
DSO模块的扩展和不同配置,可以在一个服务器运行多个副本提供不同的功能
- 在
- 缺点
DSO受操作系统的限制,加载时需要进行符号解析,因此启动时间需要加载- 更换平台后,所以模块都必须在此平台上重新编译,否则无法使用
服务特性MPM
- 简述
MPM是混合多进程模型(Multipath Processing Modules)的缩写
prefork- 多进程模型:每个进程响应一个请求
- 一个主进程负责生成
n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求。即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个(这个数据可以设置)。 c10k问题
worker- 多线程模型:每个线程响应一个请求
- 一个主进程生成
m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求 m进程和n线程:m*n
event- 事件驱动模型:基于事件回调(异步)完成,每个线程响应 n 个请求
- 一个主进程生成
m个子进程,每个进程处理n个请求 m*n
功能特性
- 虚拟主机
- 日志控制
- 身份认证
- 性能调整
- 别名和重命名
- 数据库连接管理
- 服务器安全设置
- 代理服务器和缓存
- 元信息和内容协商
SSL安全套接字CGI/FastCGI接口
4. httpd安装
4.1 二进制程序安装
# 查询RPM包信息
$ rpm -qi httpd-2.4.6-67.el7.centos.6.x86_64.rpm
# 安装RPM包
$ rpm -ivh httpd-2.4.6-67.el7.centos.6.x86_64.rpm
# 卸载RPM包
$ rpm -e httpd-2.4.6-67.el7.centos.6.x86_64.rpm
# 推荐使用yum安装
$ yum install -y httpd
# 如果使用的LFS可以使用已经编译好的包安装
$ wget http://archive.apache.org/dist/httpd/binaries/linux/httpd-2.0.50-i686-pc-linux-gnu.tar.gz
$ tar -zxvf httpd-2.0.50-i686-pc-linux-gnu.tar.gz
$ cd httpd-2.0.50
# 安装到指定目录并启动
$ ./install-bindist.sh /usr/local/apache2.0.50
$ ./httpd start
4.2 源代码编译安装
为了方便源代码安装,可以使用
Apache Toolbox工具图形化安装httpd服务。
- (1) 下载
# 下载安装包并进行校验
$ wget http://archive.apache.org/dist/httpd/httpd-2.4.29.tar.bz2
$ wget http://archive.apache.org/dist/httpd/httpd-2.4.29.tar.bz2.md5
$ md5sum -c httpd-2.4.29.tar.bz2.md5
httpd-2.4.29.tar.bz2: 确定
# 解压
$ tar -xjvpf httpd-2.4.29.tar.bz2 -C /usr/src
$ cd /usr/src/httpd-2.4.29
- (2) 编译需求
# 编译要求
# 1. 空间需求(存放源码目录至少70MB,安装目录至少20MB)
# 2. 编译器需求(GCC编译器)
# 3. 时间需求(ntp服务同步)
# 4. 工具包需求(apr/apr-util)
# 5. APACI
$ ntpdate stdtime.gor.hk
$ hwclock -w
- (3) configure 脚本
# 常用配置
# ./configure -h 可以查看更多参数选项信息
--prefix=/apache_patch: 指定Apache安装位置
--enable-module=so: 启用so模块,让Apache可以通过DSO方式加载模块
--enable-mods-shared=all: 以共享方式编译全部的模块,不包括核心模块
--enable-modules=all/most: 以静态方式编码全部的模块
--with-mpm=worker: 让Apache以worker方式运行
# 手动编译事例
$ CC="gcc" \
> ./configure --enable-modules="mod_proxy mod_so mod_authn_dbd"
- (4) 编译安装
# 加速安装,一个CPU可以使用-j3,之后每增加一个+2
$ make -j9
$ make install
- (5) 清除调试符号
$ strip /usr/local/apache2/bin/httpd