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

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

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

ps auxf |grep httpd

结果如下:
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配置,如下:
httpd
重启服务,分别用ps和pstree查看:
httpd
可以看到,启动了一个主控进程,负责生成和回收子进程,一共生成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的扩展配置文件。
主配置文件配置如下:
httpd

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

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

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

在/var/www/html下创建目录can,在can下创建henan.html内容如下:
httpd
我们用下面命令访问:

curl http://172.18.250.11

的到的是我们的主页:
httpd
然后访问我们新建的网页:

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

就是我们刚刚创建的网站:
httpd
现在实现访问控制,只不允许centos6访问,其地址为172.18.250.22,需要修改配置文件如下:
httpd
分别在centos7和centos6上访问,结果如下:
centos7:
httpd
centos6:
httpd
可以看到6被禁止访问,

也可以使用requieany来进行控制只允许centos7进行访问,修改配置文件如下:
httpd
centos7:
httpd
centos6:
httpd
centos5:
httpd
这是两种实现基于源地址实现访问控制,requireall是实现黑名单控制,默认都允许,写入的都是not ip
requireany是实现白名单控制,写入的都是被允许的,默认不被允许。
3.基于用户的访问控制
基于用户的访问控制有两种方式,basic:明文 digest:消息摘要认证,我们这里只说一下basic认证
首先修改配置文件如下:
httpd
其中项的意思如下:

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

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

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

然后重启服务,使用浏览器访问http://172.18.250.11/can/html,会弹出下面的对话框:
httpd
使用lzy登陆,发现登陆不成功,依然让输入密码,使用can登陆,发现登陆成功,内容如下:
httpd

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.基于端口的虚拟主机

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章