初识HTTP协议
HTTP(hypertext transfer protocal)作为互联网应用最广泛的协议,任何一个运维人员都无法回避它,HTTP的目的就是提供一种发布和接收html页面的方法,为了更好的理解HTTP协议,首先需要了解几个常识:
1、URL(Uniform Resource Locator)统一资源定位符,用于描述某个服务器上某个特定资源的位置,也就是通常我们见到的网址。
2、HTML(Hyper Text Markup Language)超文本标记语言,HTML 语言是为了能把存放在一台电脑中的文本或图形与另一台电脑中的文本或图形方便地联系在一起,形成有机的整体,人们不用考虑具体信息是在当前电脑上还是在网络的其它电脑上。这样,你只要使用鼠标在某一文档中点取一个图标,Internet就会马上转到与此图标相关的内容上去。
3、TCP(TransmissionControl Protocol)传输控制协议,是面向连接的协议,也就是说通讯前要建立虚拟链接,而HTTP的协议就是通过TCP来实现的。
HTTP的工作机制:就是基于B/S(浏览器/服务器)架构,由浏览器(即客户端)发起http请求—->服务器响应http请求。
一次完整的http请求过程如下
常见的HTTP服务器程序以及应用程序服务器
常见的http服务器程序:
httpd(apache)
nginx
lighthttpd
常见的应用程序服务器:
IIS(microsoft)
tomcat
jetty
jboss
weblogic
webshpere(IBM)
httpd的功能特性
httpd主要有以下特性
高度模块化:core + modules DSO: DynamicShared Object,动态共享库 MPM:Multipath Processing Modules,多道处理模块 prefork:多进程模型,每个进程响应一个请求;一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个; worker:多线程模型,每个线程响应一个请求; 一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求; event:事件驱动模型,每个线程响应n个请求; 一个主进程:生成m个子进程,每个进程直接n个请求;
同时支持以下功能
1、虚拟主机 2、 IP、Port、FQDN 3、CGI:Common Gateway Interface,通用网关接口; 4、 反向代理 5、 负载均衡 6、路径别名 7、丰富的用户认证机制 8、basic 9、 digest 10、支持第三方模块
httpd的安装与配置
yum安装httpd
1 2 | yum install -y httpd service httpd start |
yum安装的httpd的默认工作目录(根目录):/etc/httpd
配置文件: 主配置文件:/etc/httpd/conf/httpd.conf 分段配置文件:/etc/httpd/conf.d/*.conf 服务脚本:/etc/rc.d/init.d/httpd 脚本的配置文件:/etc/sysconfig/httpd 模块文件目录:/etc/httpd/modules –> /usr/lib64/httpd/modules 主程序文件:/usr/sbin/httpd (prefork) /usr/sbin/httpd.worker(worker) /usr/sbin/httpd.event(event) 日志文件目录:/var/log/httpd access_log:访问日志文件 error_log:错误日志 站点文档目录:/var/www/html
httpd的十八般武艺
1、指定监听端口
1 | Listen 80 |
(1)IP省略时表示监听本机上所有可用的IP地址; (2) Listen指令可以出现多次,用于指明多个不同的监听端口或套接字
2、持久连接的相关配置
1 2 3 | KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 15 |
持久连接:连接建立后,每个资源获取结束不会断开连接而是继续等待其他资源的请求并完成传输
非持久连接:每个资源都是单独通过专用的连接进行获取的
3、并发请求模式的不同实现
httpd-2.2 不支持同时编译多个不同的MPM,rpm安装的httpd-2.2提供了三个文件分别用于实现提供对不同的MPM的支持;确认方法:
1 | ps aux | grep httpd |
默认为/usr/sbin/httpd,其为prefork; 查看模块列表:
1 2 | httpd -l #查看静态编译的模块 httpd -M #查看所有模块,包括静态编译和DSO模块 |
4、DSO动态装卸载模块的实现
1 2 3 4 5 6 7 8 9 10 11 | # The following modules are not loaded by default: #LoadModule asis_module modules/mod_asis.so #LoadModule authn_dbd_module modules/mod_authn_dbd.so #LoadModule cern_meta_module modules/mod_cern_meta.so #LoadModule cgid_module modules/mod_cgid.so #LoadModule dbd_module modules/mod_dbd.so #LoadModule dumpio_module modules/mod_dumpio.so #LoadModule filter_module modules/mod_filter.so #LoadModule ident_module modules/mod_ident.so #LoadModule log_forensic_module modules/mod_log_forensic.so #LoadModule unique_id_module modules/mod_unique_id.so |
要想启用httpd的摸个模块只需要将前面的#号去掉即可,是不是很方便
5、定义“main server”的文档页面路径
文档路径映射: DocumentRoot指向的路径为URL起始的位置:/var/www/html/
6、站点访问控制
访问控制机制: 1、基于来源地址 2、基于账号
7、Directory中的访问控制定义
1、 Options Indexes:当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用; FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文件时,将直接显示目标文件的内容; None:none All:所有的都启用;
2、基于来源地址访问控制 Order:检查次序 OrderAllow Deny:只有明确Allow的来源地址,才允许访问,其它的均为Deny OrderDeny Allow: Allowfrom:允许访问的来源地址 Denyfrom:拒绝访问的来源地址
8、定义默认主页面
1 | DirectoryIndex index.html index.php |
自左向右,查找首次匹配到的文件就将其作为主页面
9、配置日志
错误日志: ErrorLoglogs/error_log LogLevelwarn
访问日志:要定义日志格式 LogFormat"%h %l %u %t \"%r\" %>s %b \"%{Referer}i\"\"%{User-Agent}i\"" combined CustomLoglogs/access_log combined
%h:Remote host,客户端主机 %l:Remote logname (from identd, if supplied). 客户用户通过identd登录时使用名称;一般为-; %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,请求报文的首行 <method><url> <version> %>s:响应状态状态码 %b:Size of response in bytes, excluding HTTP headers,响应报文的大小,单位为字节;不包含首部信息; %{Referer}i:记录Http首部Referer对应的值;即访问入口,从哪个页面跳转至此页面; %{User-Agent}i:记录http首部User-Agent对应的值;即浏览器类型;
10、路径别名
1 2 3 4 5 6 7 | Alias /icons/ "/var/www/icons/" <Directory "/var/www/icons"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory> |
11、设定默认字符集
1 | AddDefaultCharset UTF-8 #常用的字符集:GBK GB2312 GB18030 |
12、基于用户的访问控制
http协议支持的认证方式: basic:基本BASE64basic,认证机制的实现
1、定义安全域
1 2 3 4 5 6 7 8 | <Directory "/data/web/html/employee"> Options None AllowOverride None AuthType Basic AuthName "Employee Infomation, only for employee" AuthUserFile /etc/httpd/users/.htpasswd Require user tom jerry </Directory> |
2、提供用户的帐号文件
htpasswd[ -c ] [ -m ] [ -D ] passwdfile username -c:添加第一用户时创建此文件; -m:以md5格式加密用户密码存放; -s:以sha格式加密用户密码存放; -D:删除指定用户
3、组认证
1 2 3 4 5 6 7 8 9 | <Directory "/data/web/html/employee"> Options None AllowOverride None AuthType Basic AuthName "Employee Infomation, only for employee" AuthUserFile /etc/httpd/users/.htpasswd AuthGroupFile /etc/httpd/users/.htgroup Require group GRP1 GRP2 ... </Directory> |
13、虚拟主机的三种实现方式
httpd三种类型的虚拟主机: 基于IP 基于Port 基于FQDN
定义虚拟主机的方法:
1 2 3 4 5 | <VirtualHost "IP:PORT"> ServerName ServerAlias DocumentRoot </VirtualHost> |
14、内置的status页面
1 2 3 4 5 6 | <Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 172.16.0.0/16 </Location> |
15、使用mod_deflate模块压缩页面优化带宽
适用场景: 1、节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持; 2、压缩适于压缩的资源,例如文件文件;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | SetOutputFilter DEFLATE # mod_deflate configuration # 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 # Level of compression (Highest 9 - Lowest 1) DeflateCompressionLevel 9 # Netscape 4.x has some problems. BrowserMatch ^Mozilla/4 gzip-only-text/html # Netscape 4.06-4.08 have some more problems BrowserMatch ^Mozilla/4\.0[678] no-gzip # MSIE masquerades as Netscape, but it is fine BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html |
16、https的实现方法
配置httpd支持https: 1 、为服务器申请数字证书; (a)创建私有CA
生成私钥文件
1 | openssl genrsa -out private/cakey.pem 2048 |
生成自签证书
1 | spenssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 10000 |
提供辅助文件
1 2 | touch index.txt echo 01 > /etc/pki/CA/serial |
(b) 在服务器创建证书签署请求
生成私钥在/etc/httpd/ssl/
1 | (umask 077 openssl genrsa -out httpd.key) |
生成证书签署请求
1 | openssl -req -new -key httpd.key -out httpd.csr |
(c) CA签证
获取证书签署请求
签证证书
1 | openssl ca -in httpd.csr -out -days 3665 |
2、配置httpd支持使用ssl,及使用的证书;
1 | yum -y install mod_ssl |
配置文件:/etc/httpd/conf.d/ssl.conf
1 2 3 4 | DocumentRoot ServerName SSLCertificateFile SSLCertificateKeyFile |
3、测试基于https访问相应的主机;
17、httpd自带的工具程序
htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具; apachectl:httpd自带的服务控制脚本,支持start, stop; apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具; rotatelogs:日志滚动工具; suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行;
18、httpd压力测试工具
ab[OPTIONS] URL -n:总的请求数 -c:模拟的并发数 -k:以持久连接模式测试
以上就是httpd 的十八般武艺,或许你会觉得不以为然,但是别忘了,这些都是基本功,只有基本功扎实了,你的江湖路才能走的更加坦然