httpd
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了httpd相关的知识,希望对你有一定的参考价值。
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 apache
Group apache 用户和组
ServerAdmin [email protected] 服务器管理员账号
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 指定访问类型为Basic
AuthUserFile "/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的主要内容,如果未能解决你的问题,请参考以下文章
httpd.service 的作业失败,因为控制进程以错误代码退出。有关详细信息,请参阅“systemctl status httpd.service”和“journalctl -xe”