纸上得来终觉浅,绝知此事要躬行。
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
GlassFish
JBoss
Apache Tomcat
WebLogic
.Net
IIS
Mono
Base4
TNAPS Application Server
PHP
Zend Server
HHVM
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_dbm
mod_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