Apache ——飞机中的战斗机
Apache在互联网中浏览网页都需要使用HTTP(超文本传输协议),而Apache只是HTTP协议的一个实现程序 , HTTPD作为其主程序运行,目前常用有两个版本CentOS6(httpd 2.2)、CentOS7 (httpd 2.4)。
一次完整的HTTP请求(事务):
1)Client请求网页资源、与Server建立连接(三次握手)、Server处理请求(允许或拒绝)。
2) 如果Server接受来自Client的请求,则根据Apache的多进程处理模型(MPM),挑选一个子进程或线程根据http Request 报文中的Headers 进行分析处理。
3)Server根据Requestheaders中定义的方法(method)去访问并获取资源。
4)构建响应报文(Http Response),使用MIME编码方式将不同的资源类型编码,也可能是重定向资源。
5)发送响应报文, 到此步骤如果是短连接方式,一次http请求的过程就完成了,如果是长连接方式则继续请求资源。
6)记录日志。
Http Request报文:
Method 表示Client对资源的请求方法,常见的有:
Get 下载资源
Put 将请求报文中的”entity-body” 上传到服务器上
Head 从服务器获取请求资源的响应头部
Delete 在服务器上删除资源
Options 请求资源可使用的Method
Trace 追踪请求到达中间经过的代理服务器
Request-URL 表示资源在网络中的位置
格式:
协议://用户名:密码@域名:端口号/目录/文件名.文件后缀?参数=值#标志
Http_Version表示HTTP协议使用的版本号,通常为:
http/1.0
http/1.1
Headers包含请求或响应资源时需要协商的信息
通用首部:
Data 创建时间
Connection 连接状态是否为长连接
Via 显示报文经过的中间节点,是否存在代理
Cache-control 控制缓存
请求首部:
Accept-charset Client表示自己能接受的字符编码
Accept-Encoding Client表示自己能接收的编码格式
Accept-Language Client表示自己能接受的语言
信息类请求:
Client-IP 客户端IP地址
Host 表示请求服务器的名称和端口
Referer 告诉服务器Client是从哪个连接跳转过来的
User-Agent 表示客户端代理程序
Http Response 报文:
Version 为http协议的版本
Status 为本次响应结果的状态码
1XX: 100-101 信息类的响应码
2XX:200-206 成功类的响应码
200 成功,OK
3XX: 300-305 重定向类的响应码
301 请求的资源已被删除,永久重定向
302 请求的资源已被删除,临时重定向
4XX: 400-415 错误类信息,客户端错误
401 需要认证,提供用户名、密码
404 请求的网页不存在
403 请求被禁止,Forbiden
5XX:500-505 错误类信息,服务端错误
500 服务器内部错误
Reason-phrase 为本次响应码的简要短语
Headers 响应头部
信息类:
Age 资源的有效时间
Server 服务器的软件名称
协商首部:
Accept-ranges: 服务器可接受的请求范围
Vary:服务器查看其它首部列表
安全响应首部:
Set-Cookie 向客户端设置Cookie
Set-Cookie2 向客户端设置Cookie2
长、短连接
通常一个网页包含多个资源,如果每个资源都需要一次建立连接、HTTP Request、Response 、拆除连接,这就叫短连接,这种方式比较浪费资源。
长连接,此方式建立连接后可以进行多次请求、响应资源。 但如果在高并发模式下,使用长连接,而用户又不请求资源因长连接方式占用着进程,别人也请求不了资源。
KeepAlive Off|ON ON表示开启长连接、OFF表示关闭
MaxKeepAliveRequests 100 限制进程当请求量到100时,需要重新建立连接
KeepAliveTimeout 15 限制进程当超时15秒后,需要重新建立连接
修改Apahce 服务器为长连接方式:
# vim/etc/httpd/conf/httpd.conf
KeepAlive on
MaxKeepaliveRequests 100
KeepAliveTimeOut10
长连接测试,可以对资源进行多次请求,连接不会断:
# telnet172.16.1.50 80
Trying 172.16.1.50...
Connected to 172.16.1.50.
Escape character is '^]'.
GET / HTTP/1.1
HOST:172.16.1.50
HTTP/1.1 200 OK
Date: Tue, 22 May 2018 11:50:49 GMT
Server: Apache/2.4.33 (Unix)
Last-Modified: Tue, 22 May 2018 01:25:57 GMT
ETag: "11-56cc14cd527d5"
Accept-Ranges: bytes
Content-Length: 17
Content-Type: text/html
hello httpd 2.4
GET / HTTP/1.1
HOST:172.16.1.50
HTTP/1.1 200 OK
Date: Tue, 22 May 2018 11:51:02 GMT
Server: Apache/2.4.33 (Unix)
Last-Modified: Tue, 22 May 2018 01:25:57 GMT
ETag: "11-56cc14cd527d5"
Accept-Ranges: bytes
Content-Length: 17
Content-Type: text/html
hello httpd 2.4
Connection closed by foreign host.
# vim/etc/httpd/conf/httpd.conf
KeepAlive OFF
# !sys
systemctl restart httpd
短连接测试,一次连接只能有一个请求:
# telnet172.16.1.50 80
Trying 172.16.1.50...
Connected to 172.16.1.50.
Escape character is '^]'.
GET / HTTP/1.1
HOST:172.16.1.50
HTTP/1.1 200 OK
Date: Tue, 22 May 2018 11:54:26 GMT
Server: Apache/2.4.33 (Unix)
Last-Modified: Tue, 22 May 2018 01:25:57 GMT
ETag: "11-56cc14cd527d5"
Accept-Ranges: bytes
Content-Length: 17
Connection: close
Content-Type: text/html
hello httpd 2.4
Connection closed by foreign host.
MPM (Multi-Processing Module) 多进程模型
1. perfork MPM
Perfork模型通过预先启动进程,由一个单独的控制进程(父进程)负责产生子进程,这些子进程用于监听请求并作出应答。并且Apache总是试图保持一些备用的(spare)或者是空闲的子进程用于迎接即将到来的请求。这样客户端就不需要在得到服务前等候子进程的产生,减少频繁创建、销毁进程的开销。
优点:响应速度快、稳定
缺点:进程占用系统资源过多、不适合高并发环境。
Apache中的配置方式:
# vim/etc/httpd/conf/httpd.conf
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild4000
StartServers 表示预先启动的进程数,不包含主进程
MinSpareServers 表示最少空闲进程数
MaxSpareServers 表示最多空闲进程数
ServerLimit 用于限制MaxClient
MaxClient 表示能处理最大并发请求数
MaxRequestsPerChild 限制进程处理多少个请求之后自动销毁,值为0 表示永不销毁
2. wokerMPM
woker模型使用多进程和多线程的混合方式,也需要由主进程事先fork创建子进程(数量少),每个子进程可以建立ThreadsPerChild数量的服务线程和一个监听线程,该监听线程监听接入请求并将其传递给服务线程处理和应答。
之所以不完全使用多线程是因为线程之间内存共享,如果一个线程挂了,整个进程都挂了,所以还需要使用多进程,这样一个进程奔溃也只影响一部分内容。
优点:使用线程方式占用资源少,线程之间共享内存,支持更高的并发。
缺点:线程共享,稳定性差; 在长连接模式下
Apache中的配置方式:
# vim/etc/httpd/conf/httpd.conf
StartServers 4
MaxClients 300
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild0
StartServers 表示启动的进程数
MaxClient 表示能处理最大并发请求数
MiniSpareThreads 表示最少空闲的线程数
MaxSpareThreads 表示最大空闲的线程数
ThreadsPerChild 表示每个进程拥有对最大线程数
MaxRequestsPerChild 表示限制进程处理多少个请求之后自动销毁,值为0 表示永不销毁
3. event MPM
这个是Apache中最新的模式,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力。
event MPM在遇到某些不兼容的模块时,会失效,将会回退到worker模式,一个工作线程处理一个请求。官方自带的模块,全部是支持event MPM的。
Apache中的配置方式:
# vim/etc/httpd/conf/httpd.conf
StartServers 3
MinSpareThreads 75
MaxSpareThreads 250
ThreadsPerChild 25
MaxRequestWorkers 400
MaxConnectionsPerChild 0
想知道当前HTTPD工作在什么MPM模型下,使用以下命令查看
Httpd –M | grep mpm
Gzip 、DEFLATE
DEFLATE是一个无专利的压缩算法,它可以实现无损数据压缩,有众多开源的实现算法。该标准的实施库大多数人用的是zlib的。zlib库提供用于压缩和解压缩使用DEFLATE/INFLATE的数据。zlib库还提供了一种数据格式,混淆的命名ZLIB,它包装DEFLATE压缩数据,具有报头和校验和。
GZIP是使用DEFLATE进行压缩数据的另一个压缩库。事实上,GZIP的大多数实现实际使用zlib库的内部进行DEFLATE/ INFLATE压缩操作。GZIP产生其自己的数据格式,混淆的命名GZIP,它包装DEFLATE压缩数据,具有报头和校验和。
客户端与服务器使用Accept-Encoding和Content-Encoding标头完成协商压缩方式。有两种常用的HTTP压缩:DEFLATE和GZIP。
Apache2.2加载模块
Vim/etc/httpd/conf/httpd.conf
LoadModule deflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
Apache2.4 加载模块
Vim /etc/httpd/conf.modules.d/00-base.conf
LoadModuledeflate_module modules/mod_deflate.so
LoadModule headers_module modules/mod_headers.so
DEFLATE 配置方式:
# vim/etc/httpd/conf/httpd.conf
SetOutPutFilter DEFLATE
SetEnvIfNoCaseRequest_URL .(?:gif|jpe?g|png)$ no-gzip dont-vary
SetEnvIfNocaseRequest_URL .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
SetEnvIfNoCase Request_URI .(?:pdf|doc|avi|mov|mp3|rm)$ no-gzip dont-vary
AddOutPutFilterByTypeDEFLATE text/*
AddOutPutFilterByTypeDEFLATE application/x-javascript application/xml application/x-javascript
DeflateCompressionLevel9
# !sys
systemctlrestart httpd
按F12打开Google浏览器的调试功能:
关闭压缩功能:
#
# SetOutPutFilter DEFLATE
# SetEnvIfNoCaseRequest_URL .(?:gif|jpe?g|png)$ no-gzip dont-vary
# SetEnvIfNocaseRequest_URL .(?:exe|t?gz|zip|bz2|sit|rar)$ no-gzip dont-vary
# SetEnvIfNoCase Request_URI .(?:pdf|doc|avi|mov|mp3|rm)$ no-gzip dont-vary
# AddOutPutFilterByType DEFLATE text/*
# AddOutPutFilterByTypeDEFLATE application/x-javascript application/xml application/x-javascript
# DeflateCompressionLevel9
#
#
systemctlrestart httpd
关闭Deflate功能后,发现响应头部已经没有gzip字样,并且响应大小也从276变为465了
装载模块 mod_gzip
可能需要自己编译,另外编译过程依赖httpd-devel包 ,因为需要APSX
Gzip配置方式:
# mod_gzip
mod_gzip_on Yes
mod_gzip_dechunk Yes
mod_gzip_item_include file .(html?|txt|css|js|php|pl)$
mod_gzip_item_include handler ^cgi-script$
mod_gzip_item_include mime ^text/.*
mod_gzip_item_include mime ^application/x-javascript.*
mod_gzip_item_exclude rspheader ^Content-Encoding:.*gzip.*
Httpd配置文件组成:
/etc/httpd/conf/httpd.conf #主配置文件
/etc/httpd/conf.d/*.conf #额外提供的配置文件
# grep 'Section'/etc/httpd/conf/httpd.conf
### Section 1: Global Environment 定义全局环境变量
### Section 2: 'Main' server configuration 定义Main Server站点
### Section 3: Virtual Hosts 定义虚拟主机,与Main Server冲突
站点访问控制:
在httpd中可基于两种类型的路径指明对哪些资源进行访问控制。
基于文件系统中的路径控制:
…
基于URL路径控制:
…
在、中可使用指令:
Options用于设定在定义的资源中,可使用选项
OptionsNone ALL IndexesFollowSymLinks SymLinksIfOwnerMatch…
None 表示不使用任何选项
ALL 表示使用所有选项
Indexes 表示使用”索引”,当目录中没有”DirectoryIndex”定义的主页时,是否列出文件索引,在创建文件下载站点时有用。如果不生效,则将welcome页面删除。
FollowSymLinks 表示如果在网站目录中有符号链接文件,是否跟踪
SymLinksIfOwnerMatch 表示符号链接的属主是本人时才跟踪
基于源IP对资源做访问控制:
Httpd2.2:
白名单,只允许被Allow from 匹配的地址访问
Oderallow,deny
Allowfromip/net
黑名单,被Deny from匹配的地址都无权访问资源
Oderdeny,allow
DenyfromIPADDR
IPADDR:
172.16.1.1 定义单个IP
172.16.0.0 根据地址主类自动判断网段掩码
172.16.0.0/16
172.16.0.0/255.255.0.0
Httpd2.4:
Require all granted 允许所有人访问
Require all deny 拒绝所有人访问
Require ipIPADDR 允许制定IP地址能访问
IPADDR:
172.16.1.1 定义单个IP
172.16.0.0 根据地址主类自动判断网段掩码
172.16.0.0/16
172.16.0.0/255.255.0.0
注意:在Httpd2.4中,每个目录都需要明确授权,否则是无法访问的
基于账号、密码做访问控制:
Basic——账号、密码明文传输方式认证:
AuthType Basic
AuthName “ DOMAIN_NAME” #提示用户,此资源为什么需要认证
AuthUserFile“/PATH/TO/USER_FILE ” #用户、密码文件存放位置
Require user USERNAME1USERNAME2 #允许那个用户访问
Require valid-user #允许AuthUserFile中所有有效用户访问
另外还可以基于组对用户控制:
AuthType Basic
AuthNmae “DOMAIN_NAME”
AuthUserFile “/PATH/TO/GROUP_FILE”
AuthGrupFile “/PATH/TO/GROUP_FILE”
Requiregroup group_name1group_name2
GroupFile 定义格式:
组名:用户名1用户名2
UserFile需要使用htpasswd 命令生成:
htpasswd-c -m /etc/httpd/conf/.htaccess USER_NAME
-c 表示首次需要创建该文件,添加用户则不需要此选项
-m 表示存放的密码使用md5加密存放
-s 表示存放的密码使用sha1加密存放
-D 表示删除指定用户
Degist——账号、密码密文方式传输认证:
AuthType Degist
AuthName “DOMAIN_NAME”
AuthUserFile “/PATH/TO/USER_FILE”
Require user USER_NAME1 USER_NAME2
USER_FILE需要使用htdigst命令生成:
Usage:htdigest [-c] passwordfile DOMAIN_NAMEusername
注意:DOMAIN_NAME要与配置文件中定义的AuthName匹配,否则验证无法通过
路径别名
Alias用于在Apache 定义URL与本地文件系统中资源的映射关系。
Usage :Alias/URL /PATH/TO/SOMEDIR/
/URL 表示以根为起始位置的访问入口
/PATH/TO/SOMEDIR/ 本地资源的路径,路径结尾有/ ,最后URL后也接/
例如:
Alias/doc /usr/share/doc
Alias/doc/ /usr/share/doc/
Optiosnindexes FollowSymlinks
Requireall granted
设置默认字符集
AddDefaultCharset UTF-8
Server-status
Apache 内置的状态页。
SetHandler server-status
Order deny,allow
Deny from all
Allow from localhost
日志:
错误日志: /var/log/httpd/error_log
访问日志:/var/log/httpd/access_log
日志中的内容都由一下配置定义:
ErrorLog "logs/error_log"
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog "logs/access_log" combined
ErrorLog 用于设定访问日志的存放路径
LogForat用于自定义日志格式,在Apache2.4中还支持在模块定义日志功能
%h ClientIP
%l Client 远程登录名字 来自Identd
%u 认证时Client使用的认证名字
%t Client访问的时间
%r Request报文的第一行
%>s 记录最终请求的状态码(如果有重定向)
%b 传送资源的大小
%{Referer}i 表示访问的来源,上一个链接
%{User-Agent}i 表示用户使用的Agent信息(浏览器)
CustomLog 用于设定访问日志的存放路径与日志格式
虚拟主机:
注意:使用虚拟主机时,最好把Main Server停用,否则会冲突.
#DocumentRoot/var/www/html
定义虚拟主机的三种方式:
基于IP(前提是主机有多个IP地址):
Httpd2.4中定义虚拟主机:
Httpd2.2中不需要Require all grantd
DocumentRoot /www/vhdocs1/
DirectoryIndex index.htmlindex.php
Requireall grantd
DocumentRoot /www/vhdocs2/
DirectoryIndex index.htmlindex.php
Requireall grantd
基于端口:
Httpd2.4中定义虚拟主机:
Httpd2.2中不需要Require all grantd
Listen 80
Listen 8080
DocumentRoot /www/vhdocs1/
DirectoryIndex index.htmlindex.php
Requireall grantd
DocumentRoot /www/vhdocs2/
DirectoryIndex index.htmlindex.php
Requireall grantd
基于域名:
Httpd2.2中还需要启用一条命令:
NameVirtualHost*:80
不需要Require allgrantd
Httpd2.4定义方式:
DocumentRoot /www/vhdocs1/
ServerName www.jying.com
DirectoryIndex index.htmlindex.php
Requireall grantd
DocumentRoot /www/vhdocs2/
ServerName web.jying.com
DirectoryIndex index.htmlindex.php
Requireall grantd
页:
[1]