运维架构之httpd
运维架构之httpd
Web Service
传输层:提供进程地址
Port number
tcp:传输控制协议,面向连接,通信前需建立虚拟链路,结束后拆除;0-65535
udp:用户数据报协议,无连接;0-65535
IANA
0-1023:众所周知,永久分配给固定应用使用;22/tcp(ssh)、80/tcp(http)、443/tcp(https)
1024-41951:注册端口,分配给程序员注册为某服务使用;11211/udp、tcp(memcached)、3306/tcp(mysql)
41952+:客户端程序随机使用的端口;动态端口、私有端口;其范围定义:/proc/sys/net/ipv4/ip_local_port_range
Socket:IPC的一种实现,允许位于不同主机(甚至同一主机)上的不同进程之间进行通信;数据交换;Socket API
SOCK_STREAM:tcp套接字
SOCK_DGRAM:udp套接字
SOCK_RAM:裸套接字
TCP协议的特性
建立连接,三次握手
将数据打包成段,校验和(CRC-32)
确认、重传、超时
排序、逻辑序号
流量控制,滑动窗口算法
拥塞控制:慢启动,拥塞避免算法
Socket Domain(根据其所使用的地址)
AF_INET:Address Family,IPv4
AF_INET6:IPv6
AF_UNIX:同一主机上不同进程通信时使用
每类套接字都至少提供了两种Socket,流、数据报
流:可靠地传递,面向连接,无边界
数据报:不可靠地传递,有边界
套接字相关的系统调用
socket():创建一个套接字
bind():绑定
listen():监听
accept():接收请求
connect():请求连接建立
write():发送数据
read():接收数据
send()、recv()、sendto()、recvfrom()
http:hyper text transfer protocol
html:编程语言,超文本标记语言
CSS:Cascading Style Sheet
js:javascript
MIME:Multipurpose Internet Mail Extension
工作机制
http请求
http响应
Web资源,web resource
静态文件:jpg、gif、html、txt、js、css、mp3、avi
动态文件:php、jsp
媒体
媒体类型(MIME类型):major/minor
text/html
text/plain
image/jpeg
image/gif
URI:Uniform Resource Identifier
URL:Uniform Resource Locator,用于描述某服务器上某特定资源的位置
Scheme://Server:Port/path/to/resource
URN:Uniform Resource Naming
http协议版本
HTTP/0.9:原型版本,功能简陋
HTTP/1.0:第一个广泛使用的版本,支持MIME
HTTP/1.1:增强了缓存功能
HTTP/2.0:
一次完整的http请求过程
- 建立或处理连接,接收请求或拒绝请求
-
接收请求
接收来自于网络的请求报文中对某资源的一次请求的过程
并发访问响应模型(Web I/O)
单进程I/O结构:只启动一个进程处理用户请求,且一次只处理一个,多个请求串行响应
多进程I/O结构:并行启动多个进程,每个进程响应一个请求
复用I/O结构:一个进程响应多个请求
多线程模型:一个进程生成多个线程,每个线程响应一个用户请求
事件驱动:event-driven
复用的多进程I/O结构:启动多个进程,每个进程响应多个请求
-
处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息
元数据:请求数据首部
<method><URL><VERSION>
Host:请求的主机名称
Connection
-
访问资源:获取请求报文中请求的资源
web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统某路径下,称为DocRoot
web服务器资源路径映射方式
docroot
alias
虚拟主机docroot
用户家目录docroot
-
构建响应报文
资源的MIME类型
显式分类
魔法分类
协商分类
URL重定向
web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径
- 发送响应报文
- 记录日志
http服务器程序
httpd(apache)
nginx
lighttpd
应用程序服务器
IIS
tomcat,jetty,jboss,resin
webshpere,weblogic,oc4j
httpd的安装配置和使用
httpd:apache
httpd的特性
高度模块化,core+modules
DSO:Dynamic Shared Object
MPM:Multipath Processing Modules
prefork:多进程模型,每个进程响应一个请求
一个主进程负责生成多个子进程,子进程称为工作进程,主进程负责监听套接字,每个子进程处理一个用户请求,即便没有用户请求,也会预先生成多个空闲进程(≤1024),随时等待请求到达
worker:多线程模型(多进程生成,一个进程生成多个线程),一个线程响应一个请求
event:事件驱动模型,一个线程响应多个请求
安装方式
rpm
编译安装
CentOS6
程序环境
配置文件
/etc/httpd/conf/httpd.conf
/etc/httpd/conf.d/*.conf
服务脚本
/etc/rc.d/init.d/httpd
配置文件:/etc/sysconfig/httpd
主程序文件
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
日志文件
/var/log/httpd
access_log:访问日志
error_log:错误日志
站点文档目录
/var/www/html
模块文件路径
/usr/lib64/httpd/modules
配置文件的组成
Section 1:Global Environment
Section 2:”Main” server configuration
Section 3:Virtual Hosts
配置格式:directive value
directive:不区分大小写
value:为路径时,取决于文件系统
常用配置
-
修改监听的IP和端口
Listen [IP:]PORT
省略IP表示监听本机的所有IP,Listen可重复出现多次
-
持久连接
Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成
如何断开?
数量限制:100
时间限制:可配置
副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应
折中:使用较短的持久连接时间
httpd-2.4支持ms级持久时间
非持久连接
KeepAlive On|Off
MaxKeepAliveRequests n
KeepAliveTimeout n
测试:telnet HOST PORT
GET /URL HTTP/1.1
Host:HOSTNAME or IP
-
MPM,Multipath Process Modules,多道处理模块
prefork、worker、event
httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个,rpm安装的包提供三个二进制程序文件,分别用于实现不同MPM机制的支持
确认方法:ps aux | grep httpd
默认为/usr/sbin/httpd,其使用prefork
查看模块列表
查看静态编译的模块
httpd -l
查看静态编译及动态装载的模块
httpd -M
更换使用的httpd程序
/etc/sysconfig/httpd
HTTPD=
重启服务生效
prefork的配置
<IfModule prefork.c>
StartServers 8
服务器进程启动时启动的进程数MinSpareServers 5
最小空闲进程数MaxSpareServers 20
最大ServerLimit 256
为MaxClients指定的在其生命周期内的最大值MaxClients 256
最大并发请求数MaxRequestsPerChild 4000
一个服务器进程能响应的最大请求数</IfModule>
worker的配置
<IfModule worker.c>
StartServers 4
服务器进程启动时启动的进程数MaxClients 300
服务器端最大启动的线程数MinSpareThreads 25
最小空闲线程数MaxSpareThreads 75
最大ThreadsPerChild 25
MaxRequestsPerChild 0
一个服务器进程能响应的最大请求数</IfModule>
PV、UV
PV:Page View
UV:User View
独立IP量
-
DSO
配置指令实现模块加载
LoadModule <mod_name> <mod_path>
模块路径可使用相对地址,相对于ServerRoot(/etc/httpd)而言,/etc/httpd/modules
-
定义”Main” server的文档页面路径
DocumentRoot
文档路径映射
DocumentRoot指向的路径为URL路径的起始位置
DocumentRoot “/var/www/html”
test/index.html –> http://HOST:PORT/test/index.html
-
站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制
文件系统路径
<Directory “”> </Directory>
<File “”> </File>
<FileMatch “正则表达式”> </FileMatch>
URL路径
<Location “”> </Location>
<LocationMatch “”> </Location>
访问控制机制
基于来源地址
基于用户账号密码
-
Directory中基于来源地址实现访问控制
-
Options
可用值:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
Indexes:索引
FollowSymLinks:允许跟踪符号链接文件
- AllowOverride
-
基于来源地址的访问控制机制
Order allow,deny
检查次序,前为例外,后为默认机制Order deny,allow
Allow from all
Deny from all
来源地址
IP地址
NetAddr
172.16
172.16.0.0
172.16.0.0/16
172.16.0.0/255.255.0.0
-
-
定义默认主页面
DirectoryIndex index.html index.html.var
-
日志设定
错误日志
ErrorLog logs/error_log
LogLevel warn
debug, info, notice, warn, error, crit,
alert, emerg.访问日志
CustomLog logs/access_log combined
LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
%h:客户端IP地址
%l:Remote logname (from identd, if supplied). -表示为空
%u:Remote user(from auth; may be bogus if return status (%s) is 401)
%t:Time the request was received (standard english format)
%r:First line of request,请求报文的首行信息
%s:响应状态码
%b:响应报文的大小,单位为byte,不包含响应报文首部
%{Referer}i:请求报文中”referer”首部的值,当前资源的访问入口,及从哪个页面中的超链接跳转而来
%{User-Agent}i:请求报文中”User-Agent”首部的值,及发出请求用到的应用程序
详情:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
-
路径别名
Alias /URL/ “PATH/TO/SOMEDIR/”
Alias /bbs/ “/forum/htdocs”
http: //www.123.com/bbs/index.html
–> /forum/htdocs/bbs/
-
设定默认字符集
AddDefaultCharset UTF-8
GBK、GB2312、GB18030
-
基于用户的访问控制
认证质询
WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码
认证
Authorization:客户端用户填入账号和密码后再次发送请求报文,认证通过,则服务器发送响应的资源
认证方法
basic:明文
digest:消息摘要
安全域:需要用户通过认证后才能访问的路径
应该通过名称对其进行标识,并用于告知用户认证的原因
用户的账号和密码存储于何处
虚拟账号:仅用于访问某服务时用到的认证标识
存储
文本文件
SQL数据库
ldap
nis
basic认证
-
定义安全域
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “STRING”
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
Require user username1 username2 …
</Directory>
允许账号文件中的所有用户登录访问
Require valid-user
-
提供账号和密码存储
使用htpasswd命令进行管理
htpasswd [options] passwordfile username
-c:自动创建passwordfile,因此,仅应该在添加第一个用户时使用
-m:md5加密用户密码
-s:sha1加密用户密码
-D:删除指定用户
-
实现基于组进行认证
<Directory “”>
Options None
AllowOverride None
AuthType Basic
AuthName “STRING”
AuthUserFile “/PATH/TO/HTTPD_USER_PASSWD_FILE”
AuthGroupFile “/PATH/TO/HTTPD_GROUP_PASSWD_FILE”
Require group group1 group2…
</Directory>
要提供用户账号文件和组文件
组文件:每行定义一个组
GRP_NAME:user1 user2…
-
-
虚拟主机
三种实现方案
基于IP
为每个虚拟主机准备至少一个IP地址
基于port
为每个虚拟主机准备至少一个专用port,实践中少用
基于hostname
为每个虚拟主机准备至少一个专用hostname
可混合使用三种方式中任意方式
一般虚拟主机不要与中心主机混用,要使用虚拟主机,先禁用中心主机
禁用中心主机:注释DocumentRoot
每个虚拟主机都有专用配置
<VirtualHost “IP:PORT”>
ServerName
DocumentRoot “”
<Directory “”>
</Directory>
</VirtualHost>
ServerAlias:虚拟主机的别名
ErrorLog
CustomLog
-
内置的status页面
<Location /server-status>
SetHandler server-status
Order deny,allow
Deny from all
Allow from .example.com
</Location>
http协议和httpd的配置
URL:Uniform Resource Locator
URL方案:scheme
服务器地址:ip:port
资源路径
<Scheme>://<user>:<password>@<Server>:<Port>/<path/to/resource>;<params>?<query>#<frag>
params:参数
query:查询
frag:锚定符
相对URL
绝对URL
http协议
http/0.9,http/1.0,http/1.1,http/2.0
http协议:stateless
服务器无法持续追踪访问者来源
cookie,session
http事务
请求:request
响应:response
报文语法格式
request报文
<method> <request-URL> <version>
<headers>
<entity-body>
response报文
<version> <status> <reason-phrase>
<headers>
<entity-body>
method:请求方法,标明客户端希望服务器对资源执行的动作
GET、HEAD、POST、PUT、DELETE、OPTIONS、TRACE
version
HTTP/<major>.<minor>
status
三位数字:如200、301、302、404、502;标记请求过程中发生的情况
reason-phrase
状态码所标记的状态的简要描述
headers
每个请求或响应报文可包含任意个首部,每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是值
entity-body:请求时附加的数据或响应时附加的数据
method(方法)
GET:从服务器获取一个资源
HEAD:只从服务器获取文档的响应首部
POST:向服务器发送服务器要处理的数据
PUT:将请求的主体部分直接存储在服务器上
DELETE:请求删除服务器上指定的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法
协议查看或分析工具:tcpdump、tshark、wireshark
status(状态码)
1xx:100-101,信息提示
2xx:200-206,成功类的信息
3xx:300-305,重定向
4xx:400-415,错误类信息,客户端错误
5xx:500-505,错误类信息,服务器端错误
常用状态码
200:成功响应,请求的所有数据通过响应报文的entity-body部分发送,OK
301:请求的URL指向的资源已经被删除,但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
302:与301相似,但在响应报文中指定的为资源现在所处的临时新位置;Found
304:客户端发出了条件式请求,但服务器上的资源未曾发生变化,则通过响应此响应状态码通知客户端;Not Modified
401:需要输入账号和密码才能访问资源,Unauthorized
403:请求被禁止;Forbidden
404:服务器无法找到客户端请求的资源;Not Found
500:服务器内部错误;Internal Server Error
502:代理服务器从后端服务器收到一条伪响应;Bad Gateway
headers
格式
Name: Value
首部的分类
通用首部
Date:报文的创建时间
Connection:连接状态,keepalive、close
Via:显示报文经过的中间节点
Cache-Control:控制缓存
Pragma
请求首部
Accept:通知服务器自己能够接受的媒体类型
Accept-Charset:接受的字符集
Accept-Encoding:接受的编码格式
Accept-Language:接受的语言
Client-IP
Host:请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源
User-Agent:客户端代理,浏览器类型
条件式请求首部
Expect
If-Modified-Since:自从指定的时间后,请求的资源是否发生过修改
If-UnModified-Since
If-None-Match:本地缓存中存储的文档的Etag是否与服务器文档的Etag不匹配
If-Match
安全请求首部
Authorization:向服务器发送认证信息,如账号密码
Cookie:客户端向服务器发送cookie
Cookie2
代理请求首部
Proxy-Authorization:向代理服务器认证
响应首部
信息性
Age:响应持续时长
Server:服务器程序软件名称和版本
协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型
Vary:服务器查看的其他首部列表
安全响应首部
Set-Cookie:向客户端设置Cookie
Set-Cookie2
WWW-Authenticate:来自服务器对客户端的质询认证表单
实体首部
Allow:列出对此实体可使用的请求方法
Location:告知客户端真正的实体位于何处
Content-Encoding
Content-Language
Content-Length:实体的长度
Content-Location:实体真正所处位置
Content-Type:实体的对象类型
缓存相关
Etag:实体的扩展标签
Expires:实体的过期时间
Last-Modified:最后一次修改的时间
扩展首部
httpd-2.2
curl命令
curl是基于URL语法在命令行方式下工作的文件传输工具,支持FTP、SFTP、HTTP、HTTPS、GOPHER、TELNET、DICT、FILE、LDAP等协议,支持HTTPS认证,支持HTTP的POST、PUT等方法、FTP上传
kerberos认证,HTTP上传,代理服务器,Cookie,用户名/密码认证
上传下载断点续传,http代理服务器管道,IPv6
socks5代理服务器,通过http代理服务器上传文件到FTP服务器等
curl [option] URL
-A/–user-agent:设置用户代理发送给服务器
–basic:使用http基本认证
-e/–referer URL:来源地址
–cacert FILE:CA证书
–compressed:要求返回的压缩格式
-H/–header <line>:自定义头部信息传递给服务器
-I/–head:只显示响应报文首部信息
–limit-rate:设置传输速度
-u/–user <user[:password]>:设置服务器的用户名和密码
-0/–http1.0:使用HTTP1.0
elinks
elinks [option] URL
-dump:不进入交互模式,而直接将URL的内容输出至标准输出
使用mod_deflate模块压缩页面优化传输速度
适用场景
节约带宽,额外消耗CPU,较老浏览器可能不支持
压缩适于压缩的资源,如文本文件
https
http over ssl = https 443/tcp
SSL会话的简化过程
- 客户端发送可供选择的加密方式,并向服务器请求证书
- 服务器端发送证书以及选定的加密方式给客户端
-
客户端取得证书并进行证书验证
如果信任给其发证书的CA
a、验证证书来源的合法性,用CA的公钥解密证书上的数字签名
b、验证证书内容的合法性,完整性校验
c、检查证书的有效期限
d、检查证书是否被吊销
e、证书拥有者的名字,与访问的目标主机要一致
- 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
-
服务器用此密钥加密用户请求的资源,响应给客户端
SSL会话是基于IP地址创建,所以单IP的主机上,仅可以使用一个https虚拟主机
配置httpd支持https
-
测试:通过私建CA发证书
a、创建私有CA
b、在服务器创建证书签署请求
c、CA签证
-
配置httpd支持使用ssl及使用的证书
yum install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLCertificateFile
SSLCertificateKeyFile
-
测试基于https访问响应的主机
openssl s_client [-connect host:port] [-cert filename] [CApath directory] [-CAfile filename]
httpd自带的工具程序
htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具
apachectl:httpd自带的服务控制脚本,支持start、stop
apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具
rotatelogs:日志滚动工具
access.log –>
access.log,access.1.log
access.log,access.1.log,access.2.log
suexec:访问某些有特殊权限设置的资源时,临时切换至指定用户进行
ab:apache benchmark
httpd压力测试工具
ab
ab [options] URL
-n:总的请求数
-c:模拟的并发数
-k:以持久连接模式测试
ulimit -n:调整当前用户所同时打开的文件数
webbench
http_load
jmeter
loadrunner
tcpcopy
httpd-2.4
新特性
- MPM支持运行DSO机制,以模块形式按需加载
- 支持event MPM
- 支持异步读写
- 支持每模块及每个目录分别使用各自的日志级别
- 每请求配置:<If>
- 增强版的表达式分析器
- 支持ms级的keepalive timeout
- 基于FQDN的虚拟主机不再需要NameVirtualHost指令
- 支持用户自定义变量
新模块
mod_proxy_fcgi
mod_ratelimit
mod_remoteip
修改了一些配置机制
不再支持使用Order,Deny,Allow来做基于IP的访问控制机制
安装httpd-2.4
-
CentOS6
httpd依赖于apr,apr-util,[apr-icon]
apr:apache portable runtime
编译安装步骤
1.4+版的apr和apr-util
前提:安装开发环境,安装pcre-devel
yum groupinstall “Development Tools” “Server Platform Development”
-
apr
./configure –prefix=/usr/local/apr
make && make install
-
apr-util
./configure –prefix=/usr/local/apr-util –with=/usr/local/apr
make && make install
-
groupadd -r apache
useradd -r -g apache apache
./configure –prefix=/usr/local/apache –sysconf=/etc/httpd2.4 –enable-so –enable-ssl –enable-cgi –enable-rewrite –with-zlib –with-pcre –with-apr=/usr/local/apr –with-apr-util=/usr/local/apr-util –enable-modules=most –enable-mpms-shared=all –with-mpm=prefork
make && make install
-
启动服务
apachectl
-
-
CentOS7
配置文件
主配置文件:/etc/httpd/conf/httpd.conf
模块配置文件:/etc/httpd/conf.modules.d/*.conf
辅助配置文件:/etc/httpd/conf.d/*.conf
mpm:以DSO机制提供,配置文件00-mpm.conf
服务控制:systemctl {start|stop|restart|status|reload} httpd.service
配置
-
切换使用MPM
LoadModule mpm_NAME_module modules/mod_mpm_NAME.so
NAME:prefork、event、worker
- 修改”Main”Server的DocumentRoot
-
基于IP的访问控制法则
允许所有主机访问:Require all granted
拒绝所有主机访问:Require all deny
控制特定IP访问
Require ip IPADDR:授权指定来源地址的主机访问
Require not ip IPADDR:拒绝指定来源地址的主机访问
IPADDR
IP:192.168.100.100
Net/Mask:192.168.100.0/255.255.255.0
Net/Length:192.168.100.0/24
Net:192.168.100
控制特定主机访问
Require host HOSTNAME
Require not host HOSTNAME
HOSTNAME
FQDN:特定主机
DOMAIN:指定域内的所有主机
<RequireAll>
Require all granted
Require not ip IPADDR
</RequireAll>
-
虚拟主机
基于IP、Port和FQDN都支持
基于FQDN的不再需要NameVirtualHost指令
-
ssl
启用模块:LoadModule ssl_module modules/mod_ssl.so
-
服务脚本
/etc/rc.d/init.d/httpd
本文摘自http://www.178linux.com/100298
-
有待验证!