Loading... <p> 初识HTTP协议 <span style="font-family: Calibri"> </span></p> <hr /> <p><span style="font-family: Calibri"> </span></p> <p><span style="font-family: Calibri"> HTTP</span><span style="font-family: 宋体">(</span><span style="font-family: Calibri">hyper text transfer protocal</span><span style="font-family: 宋体">)作为互联网应用最广泛的协议,任何一个运维人员都无法回避它,</span><span style="font-family: Calibri">HTTP</span><span style="font-family: 宋体">的目的就是提供一种发布和接收</span><span style="font-family: Calibri">html</span><span style="font-family: 宋体">页面的方法,为了更好的理解</span><span style="font-family: Calibri">HTTP</span><span style="font-family: 宋体">协议,首先需要了解几个常识</span><span style="font-family: Calibri">:</span></p> <p><span style="font-family: Calibri"> </span><span style="font-family: Calibri">1</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">URL</span><span style="font-family: 宋体">(</span><span style="font-family: Calibri">Uniform Resource Locator</span><span style="font-family: 宋体">)统一资源定位符,用于描述某个服务器上某个特定资源的位置,也就是通常我们见到的网址。</span></p> <p><span style="font-family: Calibri"> </span><span style="font-family: Calibri">2</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">HTML</span><span style="font-family: 宋体">(</span><span style="font-family: Calibri">Hyper Text Markup Language</span><span style="font-family: 宋体">)超文本标记语言,</span><span style="font-family: Calibri">HTML </span><span style="font-family: 宋体">语言是为了能把存放在一台电脑中的文本或图形与另一台电脑中的文本或图形方便地联系在一起,形成有机的整体,人们不用考虑具体信息是在当前电脑上还是在网络的其它电脑上。这样,你只要使用鼠标在某一文档中点取一个图标,</span><span style="font-family: Calibri">Internet</span><span style="font-family: 宋体">就会马上转到与此图标相关的内容上去。</span></p> <p><span style="font-family: Calibri"> </span><span style="font-family: Calibri">3</span><span style="font-family: 宋体">、</span><span style="font-family: Calibri">TCP</span><span style="font-family: 宋体">(</span><span style="font-family:">Transmission Control Protocol</span><span style="font-family: 宋体">)传输控制协议,是面向连接的协议,也就是说通讯前要建立虚拟链接,而</span><span style="font-family: Calibri">HTTP</span><span style="font-family: 宋体">的协议就是通过</span><span style="font-family: Calibri">TCP</span><span style="font-family: 宋体">来实现的。</span></p> <p><span style="font-family: Calibri"> </span><span style="font-family: Calibri">HTTP</span><span style="font-family: 宋体">的工作机制:就是基于</span><span style="font-family: Calibri">B/S</span><span style="font-family: 宋体">(浏览器</span><span style="font-family: Calibri">/</span><span style="font-family: 宋体">服务器)架构,由浏览器(即客户端)发起</span><span style="font-family: Calibri">http</span><span style="font-family: 宋体">请求</span><span style="font-family: Calibri">—-></span><span style="font-family: 宋体">服务器响应</span><span style="font-family: Calibri">http</span><span style="font-family: 宋体">请求。</span></p> <p><span style="font-family: 宋体"> 一次完整的http请求过程如下</span></p> <p><span style="font-family: 宋体"><img title="1452330730743380.jpg" alt="绘图1.jpg" src="//cto.wang/usr/uploads/2016/07/20160703180710-91.jpg" /></span></p> <p><span style="font-family: 宋体"><br /></span></p> <p><span style="font-family: 宋体"></span></p> <p><span style="font-family: Calibri"> 常见的HTTP服务器程序以及应用程序服务器</span></p> <hr /> <p> </p> <p> 常见的http服务器程序:</p> <p> httpd(apache)</p> <p> nginx</p> <p> lighthttpd</p> <p> 常见的应用程序服务器:</p> <p> IIS(microsoft)</p> <p> tomcat</p> <p> jetty</p> <p> jboss</p> <p> weblogic</p> <p> webshpere(IBM)</p> <p> </p> <p>httpd的功能特性</p> <hr /> <p style="text-indent: 0em"> <span style="font-family: 宋体"> httpd主要有以下特性</span></p> <p style="text-indent: 0em"><span style="font-family: 宋体"> 高度模块化:core + modules<br /> DSO: Dynamic Shared Object,动态共享库<br /> MPM:Multipath Processing Modules,多道处理模块<br /> prefork:多进程模型,每个进程响应一个请求;一个主进程:负责生成n个子进程,子进程也称为工作进程,每个子 进程处理一个用户请求;即便没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;<br /> worker:多线程模型,每个线程响应一个请求; 一个主进程:生成多个子进程,每个子进程负责生个多个线程,每个线程响应一个请求;<br /> event:事件驱动模型,每个线程响应n个请求; 一个主进程:生成m个子进程,每个进程直接n个请求;<br /> </span></p> <p style="text-indent: 0em"><span style="font-family: Calibri"> 同时支持以下功能</span></p> <p style="text-indent: 0em"> 1、虚拟主机<br /> 2、 IP、Port、FQDN<br /> 3、CGI:Common Gateway Interface,通用网关接口;<br /> 4、 反向代理<br /> 5、 负载均衡<br /> 6、路径别名<span style="font-family: Calibri"></span><br /> 7、丰富的用户认证机制<br /> 8、basic<br /> 9、 digest<br /> 10、支持第三方模块</p> <p> </p> <p>httpd的安装与配置</p> <hr /> <p> yum安装httpd</p> <pre class="brush:bash;toolbar:false">yum install -y httpd service httpd start</pre> <p><span style="font-family: 宋体"> yum安装的httpd的默认工作目录(根目录):/etc/httpd</span></p> <p><span style="font-family: 宋体"> <br /> 配置文件:<br /> 主配置文件:/etc/httpd/conf/httpd.conf<br /> 分段配置文件:/etc/httpd/conf.d/*.conf<br /> 服务脚本:/etc/rc.d/init.d/httpd<br /> 脚本的配置文件:/etc/sysconfig/httpd<br /> 模块文件目录:/etc/</span><span style="font-family: 宋体">httpd/modules –> /usr/lib64/httpd/modules<br /> 主程序文件:/usr/sbin/httpd (prefork)<br /> /usr/sbin/httpd.worker (worker)<br /> /usr/sbin/httpd.event (event)<br /> 日志文</span><span style="font-family: 宋体">件目录</span><span style="font-family: 宋体">:/var/log/httpd<br /> access_log: 访问日志文件<br /> error_log: 错误日志<br /> 站点文档目录:/var/www/html</span></p> <p> </p> <p>httpd的十八般武艺</p> <hr /> <p> 1、指定监听端口</p> <pre class="brush:bash;toolbar:false">Listen 80</pre> <p> (1) IP省略时表示监听本机上所有可用的IP地址;<br /> (2) Listen指令可以出现多次,用于指明多个不同的监听端口或套接字</p> <p>2、持久连接的相关配置</p> <pre class="brush:bash;toolbar:false">KeepAlive Off MaxKeepAliveRequests 100 KeepAliveTimeout 15</pre> <p> 持久连接:连接建立后,每个资源获取结束不会断开连接而是继续等待其他资源的请求并完成传输</p> <p> 非持久连接:每个资源都是单独通过专用的连接进行获取的</p> <p>3、并发请求模式的不同实现</p> <p> httpd-2.2 不支持同时编译多个不同的MPM,rpm安装的httpd-2.2提供了三个文件分别用于实现提供对不同的MPM的支持;确认方法:</p> <pre class="brush:bash;toolbar:false">ps aux | grep httpd</pre> <p> 默认为/usr/sbin/httpd,其为prefork; <br /> 查看模块列表:</p> <pre class="brush:bash;toolbar:false">httpd -l #查看静态编译的模块 httpd -M #查看所有模块,包括静态编译和DSO模块</pre> <p>4、DSO动态装卸载模块的实现</p> <pre class="brush:bash;toolbar:false"># 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</pre> <p> 要想启用httpd的摸个模块只需要将前面的#号去掉即可,是不是很方便</p> <p>5、定义“main server”的文档页面路径</p> <p> 文档路径映射:<br /> DocumentRoot指向的路径为URL起始的位置:/var/www/html/</p> <p>6、站点访问控制</p> <p> 访问控制机制:<br /> 1、基于来源地址<br /> 2、基于账号</p> <p>7、Directory中的访问控制定义</p> <p> 1、 Options<br /> Indexes: 当访问的路径下无默认主页面文件存在,且没有指定具体要访问的资源时,会将此路径下的所有资源以列表呈现给用户;非常危险,不建议使用;<br /> FollowSymLinks:如果某页面文件是为指向DocumentRoot之外路径上的其它文件时,将直接显示目标文件的内容;<br /> None: none<br /> All: 所有的都启用;</p> <p> 2、 基于来源地址访问控制<br /> Order: 检查次序<br /> Order Allow Deny:只有明确Allow的来源地址,才允许访问,其它的均为Deny<br /> Order Deny Allow: <br /> Allow from:允许访问的来源地址<br /> Deny from:拒绝访问的来源地址</p> <p>8、定义默认主页面</p> <pre class="brush:bash;toolbar:false">DirectoryIndex index.html index.php</pre> <p> 自左向右,查找首次匹配到的文件就将其作为主页面</p> <p>9、配置日志</p> <p> 错误日志:<br /> ErrorLog logs/error_log<br /> LogLevel warn</p> <p> 访问日志:要定义日志格式<br /> LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined<br /> CustomLog logs/access_log combined</p> <p> %h: Remote host,客户端主机<br /> %l: Remote logname (from identd, if supplied). 客户用户通过identd登录时使用名称;一般为-;<br /> %u: Remote user (from auth; may be bogus if return status (%s) is 401),用户认证登录的名字;无登录机制一般-;<br /> %t: Time the request was received (standard english format),收到客户端请求时的时间;<br /> \": 显示引号本身,而不作为引用符号;<br /> %r:First line of request,请求报文的首行<br /> <method> <url> <version><br /> %>s:响应状态状态码<br /> %b: Size of response in bytes, excluding HTTP headers,响应报文的大小,单位为字节;不包含首部信息;<br /> %{Referer}i:记录Http首部Referer对应的值;即访问入口,从哪个页面跳转至此页面;<br /> %{User-Agent}i:记录http首部User-Agent对应的值;即浏览器类型;</p> <p>10、路径别名</p> <pre class="brush:bash;toolbar:false">Alias /icons/ "/var/www/icons/" <Directory "/var/www/icons"> Options Indexes MultiViews FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory></pre> <p>11、设定默认字符集</p> <pre class="brush:bash;toolbar:false">AddDefaultCharset UTF-8 #常用的字符集:GBK GB2312 GB18030</pre> <p>12、基于用户的访问控制</p> <p> http协议支持的认证方式:<br /> basic:基本BASE64basic,认证机制的实现</p> <p> 1、定义安全域</p> <pre class="brush:bash;toolbar:false"><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></pre> <p> 2、提供用户的帐号文件</p> <p> htpasswd [ -c ] [ -m ] [ -D ] passwdfile username<br /> -c: 添加第一用户时创建此文件;<br /> -m: 以md5格式加密用户密码存放;<br /> -s: 以sha格式加密用户密码存放;<br /> -D:删除指定用户</p> <p> 3、组认证</p> <pre class="brush:bash;toolbar:false"><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></pre> <p> </p> <p>13、虚拟主机的三种实现方式</p> <p> httpd三种类型的虚拟主机:<br /> 基于IP<br /> 基于Port<br /> 基于FQDN</p> <p> 定义虚拟主机的方法:</p> <pre class="brush:bash;toolbar:false"><VirtualHost "IP:PORT"> ServerName ServerAlias DocumentRoot </VirtualHost></pre> <p>14、内置的status页面</p> <pre class="brush:bash;toolbar:false"><Location /server-status> SetHandler server-status Order deny,allow Deny from all Allow from 172.16.0.0/16 </Location></pre> <p>15、使用mod_deflate模块压缩页面优化带宽</p> <p> 适用场景:<br /> 1、节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;<br /> 2、压缩适于压缩的资源,例如文件文件;</p> <pre class="brush:bash;toolbar:false">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</pre> <p>16、https的实现方法</p> <p> 配置httpd支持https:<br /> 1 、为服务器申请数字证书;<br /> (a) 创建私有CA</p> <p> 生成私钥文件</p> <pre class="brush:bash;toolbar:false">openssl genrsa -out private/cakey.pem 2048</pre> <p> 生成自签证书</p> <pre class="brush:bash;toolbar:false">spenssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 10000</pre> <p> 提供辅助文件</p> <pre class="brush:bash;toolbar:false">touch index.txt echo 01 > /etc/pki/CA/serial</pre> <p> (b) 在服务器创建证书签署请求</p> <p> 生成私钥在/etc/httpd/ssl/</p> <pre class="brush:bash;toolbar:false">(umask 077 openssl genrsa -out httpd.key)</pre> <p> 生成证书签署请求</p> <pre class="brush:bash;toolbar:false">openssl -req -new -key httpd.key -out httpd.csr</pre> <p> (c) CA签证</p> <p> 获取证书签署请求</p> <p> 签证证书</p> <pre class="brush:bash;toolbar:false">openssl ca -in httpd.csr -out -days 3665</pre> <p> 2、 配置httpd支持使用ssl,及使用的证书;</p> <pre class="brush:bash;toolbar:false">yum -y install mod_ssl</pre> <p> 配置文件:/etc/httpd/conf.d/ssl.conf</p> <pre class="brush:bash;toolbar:false">DocumentRoot ServerName SSLCertificateFile SSLCertificateKeyFile</pre> <p> 3、测试基于https访问相应的主机;</p> <p>17、httpd自带的工具程序</p> <p> htpasswd: basic认证基于文件实现时,用到的账号密码文件生成工具;<br /> apachectl:httpd自带的服务控制脚本,支持start, stop;<br /> apxs:由httpd-devel包提供的,扩展httpd使用第三方模块的工具;<br /> rotatelogs:日志滚动工具;<br /> suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户运行;</p> <p>18、httpd压力测试工具</p> <p> ab [OPTIONS] URL<br /> -n: 总的请求数<br /> -c:模拟的并发数<br /> -k: 以持久连接模式测试</p> <p> 以上就是httpd 的十八般武艺,或许你会觉得不以为然,但是别忘了,这些都是基本功,只有基本功扎实了,你的江湖路才能走的更加坦然。</p> <p> </p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信