httpd
httpd服务是由apache 推出的一款web service ,它是一款后台运行的服务程序,有几种工作模式供用户访问使用,功能强大。
首先我们来讲讲httpd服务的协议http
http: hyper text transfer protocol 超文本传输协议
http协议版本:
- HTTP / 0.9 : 早期版本,原型版本 (早期只能传输文本)
- HTTP / 1.0 : 第一广泛使用的版本,支持MIME
- MIME: Multipurpose Internet Mail Extesion 多用途网络邮件扩展 (就因为1.0增加了这项功能,后期HTTP协议可以做很多事情)
- HTTP / 1.1 : 增强了缓存功能 (现在做用的版本)
- HTTP / 2.0 : 下一阶段版本
常用端口信息:
- TCP 协议的 : 80 8080 (http 默认是80端口 httpds 默认是 443)
URI: Uniform Resource Identifier 统一资源标识符
- http 工作请求过程
- 建立连接(接收、拒绝请求)
- 接收请求
- 处理请求
- 访问资源
- 构建响应
- 发送响应
- 记录日志
httpd—-apache 的web services
特性:
高度模块化: 核心 core + 模块 modules
DSO : Dynamic Shared Object 动态共享对象
MPM:multi processing modules 多路进程模块
MPM的多路进程模块有三种:
prefork: 多进程模型,每个进程响应一个请求
工作模式: 一个主进程负责生成N个子进程,每个子进程处理一个用户请求,当无用户访问时,也会预留空闲进程等待用户连接
worker: 多进程多线程模型,一个进程生成N个线程,一个线程响应一个请求,也有预留空闲线程的特性
event :多进程多线程模型,工作模式大致和worker相同,只是增加了一个监听的子线程来管理keep-alive类型的线程当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力
httpd的配置
配置内有一项是监听的IP和端口项
Listen 80 如果没有指定IP的话代表监听所有IP地址的80端口.keep-alive 持久连接项,连接建立后,每个资源获取完成后不会断开,而是继续等待其它请求
KeepAlive Off 持久连接
MaxKeepAliveRequests 100 持久连接的最大请求数
KeepAliveTimeout 15 执久连接的超时时间
建意: 使用较短的持久连接时间MPM 多路处理模块
perfork(默认模块)95 # prefork MPM 96 # StartServers: number of server processes to start 97 # MinSpareServers: minimum number of server processes which are kept spare 98 # MaxSpareServers: maximum number of server processes which are kept spare 99 # ServerLimit: maximum value for MaxClients for the lifetime of the server 100 # MaxClients: maximum number of server processes allowed to start 101 # MaxRequestsPerChild: maximum number of requests a server process serves 102 <IfModule prefork.c> 103 StartServers 8 服务器启动时服务启动的进程数 104 MinSpareServers 5 最小空闲进程数 105 MaxSpareServers 20 最大空闲进程数 106 ServerLimit 256 为maxclients准备的进程数量最大值 107 MaxClients 256 最大进程数量 108 MaxRequestsPerChild 4000 一个服务器进程最多响应多少次的请求数 109 </IfModule>
worker
111 # worker MPM 112 # StartServers: initial number of server processes to start 113 # MaxClients: maximum number of simultaneous client connections 114 # MinSpareThreads: minimum number of worker threads which are kept spare 115 # MaxSpareThreads: maximum number of worker threads which are kept spare 116 # ThreadsPerChild: constant number of worker threads in each server process 117 # MaxRequestsPerChild: maximum number of requests a server process serves 118 <IfModule worker.c> 119 StartServers 4 服务器启动时启动多少个进程 120 MaxClients 300 服务器端最大启动的线程数量 121 MinSpareThreads 25 最小空闲线程数 122 MaxSpareThreads 75 最大空闲线程数 123 ThreadsPerChild 25 每个进程所能启进的线程 124 MaxRequestsPerChild 0 每个线程所响应的最大请求数量 (0表示无限制)
event 2.2的httpd event版本还不成熟 , 2.4的版本直接开发成模块了,不在配置文件内
DSO动态共享对象
配置指令实现模块加载
—- LoadModule 模块名称——模块路径 (路径可省略)
/etc/httpd/modules 是系统带有的模块,httpd -M可以查到当前使用的模块150 LoadModule auth_basic_module modules/mod_auth_basic.so 151 LoadModule auth_digest_module modules/mod_auth_digest.so 152 LoadModule authn_file_module modules/mod_authn_file.so 153 LoadModule authn_alias_module modules/mod_authn_alias.so 154 LoadModule authn_anon_module modules/mod_authn_anon.so 155 LoadModule authn_dbm_module modules/mod_authn_dbm.so 156 LoadModule authn_default_module modules/mod_authn_default.so 157 LoadModule authz_host_module modules/mod_authz_host.so 158 LoadModule authz_user_module modules/mod_authz_user.so 159 LoadModule authz_owner_module modules/mod_authz_owner.so 160 LoadModule authz_groupfile_module modules/mod_authz_groupfile.so 161 LoadModule authz_dbm_module modules/mod_authz_dbm.so 162 LoadModule authz_default_module modules/mod_authz_default.so 163 LoadModule ldap_module modules/mod_ldap.so 164 LoadModule authnz_ldap_module modules/mod_authnz_ldap.so 165 LoadModule include_module modules/mod_include.so 166 LoadModule log_config_module modules/mod_log_config.so 167 LoadModule logio_module modules/mod_logio.so 168 LoadModule env_module modules/mod_env.so 169 LoadModule ext_filter_module modules/mod_ext_filter.so 170 LoadModule mime_magic_module modules/mod_mime_magic.so 171 LoadModule expires_module modules/mod_expires.so 172 LoadModule deflate_module modules/mod_deflate.so 173 LoadModule headers_module modules/mod_headers.so 174 LoadModule usertrack_module modules/mod_usertrack.so 175 LoadModule setenvif_module modules/mod_setenvif.so 176 LoadModule mime_module modules/mod_mime.so 177 LoadModule dav_module modules/mod_dav.so 178 LoadModule status_module modules/mod_status.so 179 LoadModule autoindex_module modules/mod_autoindex.so 180 LoadModule info_module modules/mod_info.so 181 LoadModule dav_fs_module modules/mod_dav_fs.so 182 LoadModule vhost_alias_module modules/mod_vhost_alias.so 183 LoadModule negotiation_module modules/mod_negotiation.so 184 LoadModule dir_module modules/mod_dir.so 185 LoadModule actions_module modules/mod_actions.so 186 LoadModule speling_module modules/mod_speling.so 187 LoadModule userdir_module modules/mod_userdir.so 188 LoadModule alias_module modules/mod_alias.so 189 LoadModule substitute_module modules/mod_substitute.so 190 LoadModule rewrite_module modules/mod_rewrite.so 191 LoadModule proxy_module modules/mod_proxy.so 192 LoadModule proxy_balancer_module modules/mod_proxy_balancer.so 193 LoadModule proxy_ftp_module modules/mod_proxy_ftp.so 194 LoadModule proxy_http_module modules/mod_proxy_http.so 195 LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 196 LoadModule proxy_connect_module modules/mod_proxy_connect.so 197 LoadModule cache_module modules/mod_cache.so 198 LoadModule suexec_module modules/mod_suexec.so 199 LoadModule disk_cache_module modules/mod_disk_cache.so 200 LoadModule cgi_module modules/mod_cgi.so 201 LoadModule version_module modules/mod_version.so
定义“Main”server的文档默认路径,定义网站的根路径
DocumentRoot”/var/www/html” —- 这是httpd默认的路径,可以手动自己更改站点访问控制
可基于两种类型的路径指明对哪些资源进行访问控制文件系统路径
< Directory “/path”>
….
< /Directory>< File “/path/file”>
….
< /File>< FileMatch “PATTENR”>
….
< /FileMatch >URL路径:
< Location “”>
….
< /Location>< LocationMatch “PATTENR”>
….
< /LlocationMatch>
< FilesMatch “.(gif|jpe?g|png)$”>
< Files “?at.*”> 通配符
< Location /status>
< LocationMatch “/(extra|special)/data”>Directory 中基于来源地址实现访问控制
options
< Directory /var/www/html>
options 所有可用特性: Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGIMultiViews None , All
< /Directory>AllowOverride
与访问控制相关的哪些指令可以放在指定目录下的
.htaccess(由AccessFileName指定)文件中,覆盖之前的
配置指令
< Directory “/var/www/html”>
AllowOverride All: 所有指令都有效
AllowOverride None: .htaccess 文件无效
AllowOverride AuthConfig Indexes 除了AuthConfig和Indexes的其它指令都无法覆盖
< /Directory >基于来源地址的访问控制
< Directory “/var/www/html”>
Order allow,deny
Order deny,allow
deny from IP | IP/NETMASK | IP地址网络位
allow from IP | IP/NETMASK | IP地址网络位
定义默认主页面:
DirectoryIndex index.html index.html.var 在配置文档里这项是主义默认的主页面日志设定
错误日志:
ErrorLog logs/error_log 指向是 /var/log/httpd访问日志:
CustomLog logs/access_log combined
498 LogFormat “%h %l %u %t \”%r\” %>s %b \”%{Referer}i\” \”%{User-Agent}i\”” combined
499 LogFormat “%h %l %u %t \”%r\” %>s %b” common
500 LogFormat “%{Referer}i -> %U” referer
501 LogFormat “%{User-agent}i” agent%h: 客户端IP地址
%l : Remote logname -表示为空
%u: Remote user, 用户认证账号,一般情况下不用 -表示为空
%t : Time the request was received 服务器收到请求的时间
%r : First line of request , 请求报文的首行信息(method url version)
%>s:响应状态码
%b : 响应报文的大小,单位是字节,不包括响应报文首部
%{Referer}I :请求报文当中“referer”首部的值 当前页面的访问入口,从哪个页面
中的超链接跳转而来
%{User-Agent}i:请求报文当中”User-Agent”首部的值:即发出请求用到的应用程序
详情参考官方文档:http://httpd.apache.org/docs
路径别名 Alias
DocumentRoot "/var/www/html" Alias /URL/ "/PATH/TO/SOMEDIR" Alias /bbs/ "/bbs/htdocs" http://www.qq.com/bbs/index.html -->/forum/htdocs/bbs
设定默认字符集
AddDefaultCharset UTF-8GBK , GB2312 , GB18030 (国标)
基于用户的访问控制
第一步,认证质询: www-Authenticate 响应码为401,先拒绝客户端请求,并说明要求
客户提供账号和密码
第二步,客户认证:Authorization:客户端用户填入账号和密码后再次发送请求报文,认
证通过,则服务器发送响应的资源
认证类型:
basic:明文认证方案
digest:消息摘要认证方案
安全域:需要用户认证后方能访问的路径
应该通过名称对其进行标识,并用于告知用户认证的原因
用户的账号和密码存储于何处
虚拟账号:仅用于访问某服务时用到的认证标识
存储:
文本文件
SQL数据库
ladp
nis
basic认证:( 1 ) 定义安全域 < Directory ""> Options None AllowOverride None AuthType Basic AuthName "STRING" AuthUserFile "/PATH/TO/HTTPD_USER_PASSWD_FILE" AuthGroupFile"/PATH/TO/HTTPD_GROUP_FILE" Require user username1 username2 … </Directory> 允许账号文件中的所有用户登录访问 Require Valid-user 要提供:用户账号文件和组文件; 组文件:每一行定义一个组 GRP_NAME : user 1 user 2 user 3 …. 基于用户 : <Directory"/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administator Private" AuthUserFile "/etc/httpd/conf.d/htpasswd" Require valid-user </Directory> (2)提供账号和密码存储(文本文件) 使用htpasswd命令进程管理 htpasswd [ options ] passwordfile username -c :自动创建passwordfile,因此,仅应该在添加第一个用户时使用; -m :md5加密用户密码 -s :sha1加密用户密码: -D : 删除指定用户 基于用户 : <Directory"/www/htdocs/admin"> Options None AllowOverride None AuthType Basic AuthName "Administator Private" AuthUserFile "/etc/httpd/conf.d/htpasswd" AuthGroupFile"/etc/httpd/conf.d/.htgroup" (事先创建好这个目录文件/etc/httpd/conf.d/htgroup 文件内容 webadmin tom jerry 组名 , 组用户 或多个组用户… ) Require group webadmin </Directory>
13.虚拟主机
有三种实现方案:
基于IP:
为每个虚拟主机准备至少一个IP地址
基于port
为每个虚拟主机准备至少一个专用port: 实践中很少使用 基于port进行虚拟主机listen 端口得打开对应的端口
基于hostname:
为每个虚拟主机准备至少一个专用hostname
可混合使用上述三种方式中任意方式
注意:一般虚拟主机莫与中心主机混用,所以要使用虚拟主机先禁用中心主机
禁用中心主机:注释DocumentRoot
每个虚拟订机都有专用配置:
< VirtualHost “IP:PORT”>
serverName
DocumentRoot “”
< /VirtualHost>
serverAlias : 虚拟主机的别名
ErrorLog
CustomLog
< Directory “”>
< /Directory>示例1:基于Ip (示例操作之前提前创建好网站的目录 mkdir /vhosts/{web1,web2,web3,web4}/htdocs) <VirtualHost 172.16.100.6:80> serverName web1.qq.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 172.16.100.7:80> serverName web2.qq.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost> 示例2:基于port <VirtualHost 172.16.100.7:8080> serverName web2.qq.com DocumentRoot "/vhosts/web3/htdocs" </VirtualHost> 示例3:基于hostname <VirtualHost 172.16.100.6:80> serverName web1.qq.com DocumentRoot "/vhosts/web1/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:80> serverName web2.qq.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost> <VirtualHost 172.16.100.6:80> serverName web3.qq.com DocumentRoot "/vhosts/web2/htdocs" </VirtualHost> NameVirtualHost 172.16.100.6:80 这个示例需要DNS解析
14.使用mod_deflate模块压缩页面优化传输速度
适用场景:
(1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
(2) 压缩适于压缩的资源,例如文本文件LoadModule deflate_module modules/mod_deflate.so SetOutputFilter DEFLATE # Restrict compression to these MIME types AddOutputFilterByType DEFLATE text/plain AddOutputFilterByType DEFLATE text/html AddOutputFilterByType DEFLATE application/xhtml+xml AddOutputFilterByType DEFLATE text/xml AddOutputFilterByType DEFLATE application/xml AddOutputFilterByType DEFLATE application/x-javascript AddOutputFilterByType DEFLATE text/javascript AddOutputFilterByType DEFLATE text/css
#
http事务:
请求: request
响应: response
报文:
request 报文
< method>< request-URL>< version>
< headers>\r \n ,\r \n
<entity-body>
response报文
<version><status><reason-phrase>
<headers>\r\n , \r\n
<entity-boby>
Method:请求方法,标明客户端希望服务器对资源执行的动作
GET、HEAD、POST
GET: 从服务器获取一个资源;
HEAD: 只从服务器获取文档的响应首部;
POST: 向服务器发送要处理的数据
PUT : 将请求的主体部分存储在服务器上,向服务器上传数据。
DELETE :请求删除服务器上指定的文档
TRACE : 追踪请求到达服务器中间经过的代理服务器;
OPTIONS: 请求服务器返回对指定资源支持使用的请求方法;
Version:
HTTP/<major>.<minor> HTTP/1.1
Status:
三位数字:如 200, 301 , 302 , 404 , 502 ;标记请求处理过程中发生的情况
Reason-phrase
状态码所标记的状态的简要描述;
Headers:
每个请求或响应报文可包含任意个首部:版本更新个首部都有首部名称,后面跟一个冒号,
而后跟上一个可选空格,接着是一个值;
Entity-body: 请求时附加的数据或响应时附加的数据
200: 成功,请求数据通过响应报文的entity-body部分发送;OK
301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部 (永久跳转)
Location指明了资源现在所处的新位置; Moved Permanently
302: 响应报文Location指明资源临时新位置 Moved Temporarily (临时跳转)
304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变
,则通过响应此响应状态码通知客户端; Not Modified
401: 需要输入账号和密码认证方能访问资源; Unauthorized
403: 请求被禁止; Forbidden (被服务器拒绝访问 服务器要不deny掉客户IP或者服务器的权限rwx权限设置。服务不可访问,有可能selinux, iptables,rwx权限,httpd的order allow deny)
404: 服务器无法找到客户端请求的资源; Not Found (客户访问的地址输入错误,也有可能是服务器内部的页面跳转指向了一个错误地址)
500: 服务器内部错误; Internal Server Error
502: 代理服务器从后端服务器收到了一条伪响应,如无法连接到
网关; Bad Gateway
503 – 服务不可用,临时服务器维护或过载,服务器无法处理请求
504 – 网关超时