分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > 代码编程

httpd

发布时间:2023-09-06 02:19责任编辑:顾先生关键词:http
1.资源请求

1.资源与事务

一个网页中包含很多资源,这些资源包括动态资源和静态资源,所谓静态资源就是存储在http服务器本地,不需要任何操作,http服务器可以直接提供给用户,当用户请求静态资源时,http服务器访问自己的存储空间,将用户请求的静态资源直接发送给用户。而所谓的动态资源,则是由服务器运行一段程序,将程序运行的结果发送给用户。当用户访问网站页面时,这些页面每一个页面都有真多资源,每一个资源都会被单独请求,用户请求资源,服务器将用户请求的资源发送给用户,每个资源的request和response组成了一个http事务。
1.资源请求过程
资源请求过程包含下面7步
1.建立连接:用户请求建立连接,服务器回应允许接收请求或者拒绝请求
2.接收请求:接收用户对某一资源的特定请求
3.处理请求:对用户的请求报文进行解析,获得获取用户请求资源的方法
4.访问资源
5.构建响应报文
6.发送响应报文
7.记录日志

2.请求报文与响应报文格式

无论是请求报文还是响应报文,都应该由3部分构成,分别是起始行,首部,主体,只是请求报文的主体可以为空。
1.起始行

 ???????????method: 请求方法,标明客户端希望服务器对资源执行的动作 ???????????????????GET:从服务器获取一个资源; ???????????????????HEAD:只从服务器获取文档的响应首部; ???????????????????POST:向服务器发送要处理的数据; ???????????????????PUT:将请求的主体部分存储在服务器上; ???????????????????DELETE:请求删除服务器上指定的文档; ???????????????????TRACE:追踪请求到达服务器中间经过的代理服务器; ???????????????????OPTIONS:请求服务器返回对指定资源支持使用的请求方法; ???????????version: ???????????????????HTTP/<major>.<minor> ???????????status: ???????????????????三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况; ???????????reason-phrase: ???????????????????状态码所标记的状态的简要描述

2.首部
首部分为下面四种:

 ???????????????????通用首部: ???????????????????????Date: 报文的创建时间 ???????????????????????Connection:连接状态,如keep-alive, close ???????????????????????Via:显示报文经过的中间节点 ???????????????????????Cache-Control:控制缓存 ???????????????????????Pragma: ???????????????????请求首部: ???????????????????????Accept:通过服务器自己可接受的媒体类型; ???????????????????????Accept-Charset: ???????????????????????Accept-Encoding:接受编码格式,如gzip ???????????????????????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:最后一次修改的时间

3.主体
主体就是请求的内容或者是响应的内容。

3.MIME机制

超文本传输协议http只能用来传输文本,但是我们日常浏览的网页几乎没有是纯文本的网页,我们日常请求的资源还包含图片,视频等等,这些都是不能直接传输的,需要采用base64进行编码成二进制之后才能进行传输,但是传输之后我们不能判断其格式,这里就需要用到MIME,采用大格式和小格式组合就是major/minor的方法,例如一个文本格式,text/html,text/txt,图片格式:image/jpg,这种方法,在我们传输之后,个以根据其格式,使用相应的程序来打开,这样我们的http协议就能传输其他非文本格式了。

2.配置httpd

1.安装httpd

安装httpd的命令很简单:

yum -y install httpd

2.配置MPM模块

MPM的配置文件在/etc/httpd/conf.modules.d/00-mpm.conf中,我们可以看到httpd支持三种MPM:

1.prefork:多进程模型,每个进程响应一个请求;
一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
n个子进程:每个子进程处理一个请求;
工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;

 ?<IfModule prefork.c> ???StartServers 10 启动服务时开启几个子进程 ????MinSpareServers 5 最少的空闲进程数 ???MaxSpareServers 10 最多的空闲进程数 ???MaxRequestWorkers ?256 最多的并发请求数 ???</IfModule>

修改如上,使用下面命令查看:

ps auxf |grep httpd

结果如下:

可以看到启动了一个主控进程负责生成和回收子进程,重启生成10个子进程。
2.worker:多进程多线程模型,每线程处理一个用户请求;
一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
多个子进程:每个子进程负责生成多个线程;
每个线程:负责响应用户请求;
并发响应数量:m * n
m:子进程数量
n:每个子进程所能创建的最大线程数量;

 ???<IfModule worker.c> ???ServerLimit ????????16 ??最大的进程数 ???StartServers ????????8 ??启动服务时开启几个子进程 ?????MaxRequestWorkers ?150 ??最多的并发请求数 ???MinSpareThreads ????25 ?最少空闲的线程数 ???MaxSpareThreads ????300 ?最多空闲的线程数 ???ThreadsPerChild ????25 ??每个子进程的线程数 ???</IfModule>

将prefork配置注释掉,开启worker配置,如下:

重启服务,分别用ps和pstree查看:

可以看到,启动了一个主控进程,负责生成和回收子进程,一共生成8个子进程,没个子进程又生成了26个线程,一个用于响应请求,其他25个是空闲的子进程。
3.event:事件驱动模型,多进程模型,每个进程响应多个请求;
一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
子进程:基于事件驱动机制直接响应多个请求;
并发响应数量:m ?* n
m:子进程数量
n:每个子进程响应的并发请求;
event以后再说,prefork是http默认的。

3.站点访问控制常见机制

1.URL
URI是统一资源标识符,包括URN(统一资源命名)和URL(统一资源定位符),URL用于用于描述某服务器某特定资源位置。
2.基于源地址实现访问控制
httpd的主配置文件的位置是/etc/httpd/conf/httpd.conf,同时还有扩展配置文件,路径是/etc/httpd/conf.d,这个目录下的所有文件都是httpd的扩展配置文件。
主配置文件配置如下:

listen 80 ???????????????????????????????????????表示监听80端口Include conf.modules.d/\*.conf ?????表示子配置文件User apacheGroup apache ??????????????????????????????用户和组ServerAdmin root@localhost ???????服务器管理员账号ServerName www.can.com:80 ????主机名DocumentRoot "/var/www/html" ???网页地址切根到此处

我们建新的网页在子配置文件中写:

Options Indexes FollowSymlinks Indexes如果开启,则访问的目录下如果没有index.html,index.php,则会将目录下的文件名列出,followsymlinks,如果开启,可以访问软链接,这里开启。Require all granted 允许所有访问ALlowOverride none当服务器找到一个.htaccess文件(由其指定AccessFileName)时,它需要知道该文件中声明的哪些指令可以覆盖先前的配置指令。这里关掉

在/var/www/html下创建目录can,在can下创建henan.html内容如下:

我们用下面命令访问:

curl http://172.18.250.11

的到的是我们的主页:

然后访问我们新建的网页:

curl http://172.18.250.11/can/henan.html

就是我们刚刚创建的网站:

现在实现访问控制,只不允许centos6访问,其地址为172.18.250.22,需要修改配置文件如下:

分别在centos7和centos6上访问,结果如下:
centos7:

centos6:

可以看到6被禁止访问,

也可以使用requieany来进行控制只允许centos7进行访问,修改配置文件如下:

centos7:

centos6:

centos5:

这是两种实现基于源地址实现访问控制,requireall是实现黑名单控制,默认都允许,写入的都是not ip
requireany是实现白名单控制,写入的都是被允许的,默认不被允许。
3.基于用户的访问控制
基于用户的访问控制有两种方式,basic:明文 digest:消息摘要认证,我们这里只说一下basic认证
首先修改配置文件如下:

其中项的意思如下:

AuthType Basic ????????指定访问类型为BasicAuthUserFile "/etc/httpd/conf/.htpasswd" ?指定用户名和密码的存放位置Require user can ???指定允许哪些用户访问Require valid-user ??指定能浏览的用户都能访问,这里注释掉,不用

然后用下面命令创建一些用户:

 htpasswd -b -m -c /etc/httpd/conf/.htpasswd can centos-b 使用命令行给定的密码-m使用MD5sum加密密码-c生成用户名密码存放文件

然后重启服务,使用浏览器访问http://172.18.250.11/can/html,会弹出下面的对话框:

使用lzy登陆,发现登陆不成功,依然让输入密码,使用can登陆,发现登陆成功,内容如下:

4.虚拟主机

所谓虚拟主机就是在一台主机上虚拟化出多台主机,在每台虚拟主机都可以部署一个站点,因为客户端在请求服务器是是通过socket来连接服务器的,而这种socket文件又分为三种,一种是基于IPv4的socket文件,一种是基于本机的socket文件,这种基于本机的socket文件用于本机客户端访问主机时使用,还有一种是基于ipv6的socket文件,而客户端和服务器在传送报文时是基于tcp/ip协议,我们的数据首先被分割成数据段,这些数据段会首先在传输层使用tcp协议进行封装,加上源端口和目的端口以及其他tcp首部信息,而后到网络层,数据段会被ip协议进行封装成数据包,在这里会加上源ip地址以及目的ip地址以及其他的首部信息,随后数据会到数据链路层,在这里数据会被封装成数据帧,加上源mac地址以及目的mac地址,还有其他的帧头帧尾信息,之后数据帧会到物理层,数据变成了比特流,然后传输出去,所以在网络上访问数据,就要有一个端口,还要有一个ip地址,所以两种基于ip的socket文件需要有一个ip地址,还要有一个端口号,还要有主机名,这三部分组成了socket文件,但是我们在本机访问,如果还要进行tcp/ip的封装与解封装无疑是在白白浪费内核资源,就有了第三种本地socket文件,但一旦在网络上访问,就必须使用两种基于ip的socket文件。所有构建虚拟主机有三种方式,分别是基于ip的虚拟主机,基于端口的虚拟主机,还有基于域名的虚拟主机,相对而言,基于端口的虚拟主机最廉价但是用户在访问时需要记住一个端口号,这是最不可取的,而基于ip的有特别昂贵,相对而言基于主机名的虚拟主机还是很不错的,下面是三种虚拟主机的具体配置:
1.基于端口的虚拟主机

httpd

原文地址:http://blog.51cto.com/13412442/2307088

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved