第十周博客作业

1、Centos系统下实现httpd-2.2的安装,并分别实现prefork、worker、event等几种工作方式
2、简述request报文请求方法和状态响应码
3、详细描述httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例

1、Centos系统下实现httpd-2.2的安装,并分别实现prefork、worker、event等几种工作方式

(1)什么是MPM

Apache HTTP 服务器被设计为一个功能强大,并且灵活的 web 服务器, 可以在很多平台与环境中工作。不同平台和不同的环境往往需要不同 的特性,或可能以不同的方式实现相同的特性最有效率。Apache 通过模块化的设计来适应各种环境。这种设计允许网站管理员通过在 编译时或运行时,选择哪些模块将会加载在服务器中,来选择服务器特性。

Apache 2.0 扩展此模块化设计到最基本的 web 服务器功能。 它提供了可以选择的多处理模块(MPM),用来绑定到网络端口上,接受请求, 以及调度子进程处理请求。

扩展到这一级别的服务器模块化设计,带来两个重要的好处:

  • Apache 能更优雅,更高效率的支持不同的平台。尤其是 Apache 的 Windows 版本现在更有效率了,因为 mpm_winnt 能使用原生网络特性取代在 Apache 1.3 中使用的 POSIX 层。它也可以扩展到其它平台 来使用专用的 MPM。
  • Apache 能更好的为有特殊要求的站点定制。例如,要求 更高伸缩性的站点可以选择使用线程的 MPM,即 workerevent; 需要可靠性或者与旧软件兼容的站点可以使用 prefork

在用户看来,MPM 很像其它 Apache 模块。主要是区别是,在任何时间, 必须有一个,而且只有一个 MPM 加载到服务器中。

(2)MPM的三个模型:

prefork:多进程模型,一个进程响应一个请求;(两级进程模型,父进程管理子进程,每一个子进程相应一个请求)。

优点:稳定可靠、执行效率高,任何一个进程的崩溃不会影响其它请求.

缺点:在大并发的时候对服务器资源消耗严重.

3

worker:多进程多线程模型,一个线程响应一个请求;(三级进程模型,父进程管理子进程,子进程通过线程响应用户请求;每个线程处理一个用户请求);

优点:在高并发的情况下,对服务器的资源消耗相对prefork模型要小很多.

缺点:执行效率、稳定性都不如prefork模型.linux不是个原生支持线程的操作系统,经测试发现worker模型在linux上面的综合表现不如prefork模型.。

4

event:事件驱动模型,一个进程响应n个请求;(两级线程模型,父进程管理子进程,子进程通过event-drivern机制直接响应n个请求)。

5

(3)httpd-2.2的安装

[root@bogon ~]# yum install httpd -y     #CentOS6 yum源安装httpd-2.2.15

http://www.178linux.com/97967              #参见以前博客CentOS7 编译安装httpd-2.4.27

安装后启动:

[root@bogon ~]# service iptables stop      # CentOS6关闭防火墙

[root@bogon ~]# vim /etc/selinux/config   #   CentOS6关闭SELINUX

SELINUX=disabled

[root@bogon ~]# service httpd  start        #CentOS6启动httpd服务

[root@localhost ~]# systemctl stop firewalld      #CentOS7关闭防火墙  

[root@bogon ~]# vim /etc/selinux/config   #   CentOS7关闭SELINUX

SELINUX=disabled

[root@localhost ~]# systemctl start httpd           # CentOS7启动httpd服务

 

(4)实现prefork工作方式

CentOS6 :配置方法

安装完成后,httpd的默认运行模式为prefork,查看其运行模式为:

[root@bogon ~]#httpd -M | grep mpm

10

在查看或修改其对应prefork配置:

[root@bogon ~]# vim /etc/httpd/conf/httpd.conf

12

StartServers: 默认启动的工作进程数;
MinSpareServers: 最少空闲进程数;
MaxSpareServers: 最大空闲进程数;
ServerLimit: 最大活动进程数;
MaxRequestWorkers: 并发请求的最大数;
MaxConnectionsPerChild: 每个子进程在生命周期内所能够服务的最多请求个数,然后被杀死  0表示不限定

启动httpd服务并查看相关的进程状态:

[root@bogon ~]# ps aux | grep httpd

33

查看其中已经启动了八个子进程

使用ab工具对相应的URL进行压力测试并观察进程的状况:

[root@bogon ~]# ab -n 100000 -c 10 http://172.16.15.12/index.html

3

 

 

(5)实现worker工作方式

CentOS6 :配置方法

[root@bogon ~]# vim /etc/sysconfig/httpd  #编辑配置文件

37

 

在查看或修改其对应worker配置:

[root@bogon ~]# vim /etc/httpd/conf/httpd.conf 

38

StartServers: 默认启动的工作进程数; 
MaxClients: 最大连接数; 
MinSpareThreads: 最小线程数; 
MaxSpareThreads: 最大线程数; 
ThreadsPerChild:每个子进程可生成的线程数;
MaxRequestsPerChild: 单个子进程累计最多处理到少个请求,默认0,不限制的意思,可能会导致内存泄露,超过该值则退出重启apach

启动httpd服务并查看相关的进程状态:

[root@bogon ~]# service httpd restart

[root@bogon ~]# ps aux | grep httpd

6

查看其中已经启动了3个进程

使用ab工具对相应的URL进行压力测试并观察进程的状况:

[root@localhost ~]# ab -n 100000 -c 10 http://172.16.15.12/index.html
2

(6)实现event工作方式

http-2.2的event模式还处于测试阶段,因此不建议在生产环境上运行,httpd-2.4的event模式为正式版可在生产环境上部署。

CentOS6 :配置方法

[root@bogon ~]# vim /etc/sysconfig/httpd  #编辑配置文件

10

在查看添加其对应event配置:

[root@bogon ~]# vim /etc/httpd/conf/httpd.conf

13

StartServers: 默认启动的工作进程数;

MinSpareThreads:最小线程数;

MaxSpareThreads: 最大线程数;

ThreadsPerChild:每个子进程可生成的线程数;

MaxRequestsPerChild: 单个子进程累计最多处理到少个请求,默认0,不限制的意思,可能会导致内存泄露,超过该值则退出重启apach

启动httpd服务并查看相关的进程状态:

[root@bogon ~]# service httpd restart

[root@bogon ~]# ps aux | grep httpd

11

查看其中已经启动了3个进程

使用ab工具对相应的URL进行压力测试并观察进程的状况:

1

(7)在Centos 7上设置mpm三个模式: 
httpd-2.4 修改mpm 
[root@ns1 ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf

31

2、简述request报文请求方法和状态响应码

(1)http事物

http事务有请求(request)和响应(response)

报文语法格式:

 

request报文   : <method><request-URL><version>

                                               <headers>

                                              <entity-body>

 

response报文  : <version><status><reason-phrase>     # 版本信息 ;  #  三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况; #状态码所标记的状态的简要描述;

                                          < headers>                                       #  每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值,即Name:Value;

                                           <entity-body>                                 #请求时附加的数据或响应时附加的数据;

(2)http请求步骤

1)、建立或处理连接,web浏览器和web服务器建立相应的TCP连接。
2)、发送请求:web浏览器向web服务器发送http请求,如:GET/sample/hello.jsp HTTP/1.1。
3)、处理请求:用于对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
4)、访问资源,访问获取请求报文中请求的资源;
5)、构建响应报文;
6)、发送响应报文;
7)、记录请求日志;

 (3)request报文请求方法

method(方法):

GET:从服务器获取一个资源;

HEAD:只从服务器获取文档的响应首部;

POST:向服务器发送要处理的数据;

PUT:将请求的主体部分存储在服务器上;

DELETE:请求删除服务器上指定的文档;

TRACE:追踪请求到达服务器中间经过的代理服务器;

OPTIONS:请求服务器返回对指定资源支持使用的请求方法;

注意:DELETE非常危险

协议查看或分析的工具:

tcpdump, tshark, wireshark

(4) 状态响应码

status(状态码):

1xx:100-101, 信息提示;

2xx:200-206, 成功

3xx:300-305, 重定向

4xx:400-415, 错误类信息,客户端错误

5xx:500-505, 错误类信息,服务器端错误

 

常用的状态响应码:

200:成功,请求的所有数据通过响应报文的entity-body部分发送;OK

301:请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently

302:与301相似,但在响应报文中通过Location指明资源现在所处临时新位置; Found

304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified

401:需要输入账号和密码认证方能访问资源;Unauthorized

403:请求被禁止;Forbidden

404:服务器无法找到客户端请求的资源;Not Found

500:服务器内部错误;Internal Server Error

502:代理服务器从后端服务器收到了一条伪响应;Bad Gateway

3、详细描述httpd虚拟主机、站点访问控制、基于用户的访问控制、持久链接等应用配置实例

(1)http服务器的配置文件

   httpd服务的主配置文件通常为httpd根目录下的conf/httpd.conf文件,通过yum安装的httpd服务的主配置路径通常如下:

http2.2和http2.4主配置文件路径:/etc/httpd/conf/httpd.conf

 主配置文件的格式大体分为三部分:     

                            ### Section 1: Global Environment                #全局配置段

                            ### Section 2: ‘Main’ server configuration             #主服务器配置

                            ### Section 3: Virtual Hosts           #虚拟主机配置

在httpd-2.4版本中删除了相应的描述,不过大体与httpd-2.2相同。

另外除了主配置文件之外,也存在着其他的配置目录路径,通常在主配置文件中会使用Include conf.d/*.confInclude conf.modules.d/*.conf(httpd-2.4)类似的语句去调用对应的目录下的配置文件,其路径格式为相对路径,根目录由主配置文件中的Serverroot决定。

(2)httpd服务的基础配置

1、修改监听的IP和PORT

格式: Listen  [IP:]PORT

1)省略IP表示为0.0.0.0;

2) Listen指令可重复出现多次;例如:  Listen  80  、  Listen  8080

3) 修改监听socket,重启服务进程方可生效;

4)若限制其必须通过ssl通信时,protocol需定义为https;

编辑配置文件

[root@localhost ~]# vim /etc/httpd/conf/httpd.conf

添加监听端口

30

重启服务并查看端口:

[root@localhost ~]# systemctl restart httpd

[root@localhost ~]# ss -tnl

32

2、使用长连接

1)首先http是无状态的,持久连接是tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行;

2) 使用数量限制和时间限制来断开连接控制;

3) 当对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应,较好的解决方案是设置使用较短的持久连接时长,以及较少的请求数量;

创建配置文件:

[root@localhost ~]# vim  /etc/httpd/conf/conf.d/keepalive.conf

            KeepAlive on                    #启用长连接

        KeepAliveTimeout 15           # 持续时长15秒

        MaxKeepAliveRequests 100             #最大请求数量100个资源

1

[root@localhost ~]#  httpd –t               #  检查语法错误

 

 

3、定义中心服务器’Main’ server的文档页面路径

文档路径映射:  DoucmentRoot指向的路径为URL路径的起始位置,其相当于站点URL的根路径;

   (服务器文件系统路径) /web/host1/index.html  ——映射——>  (网页)  /index.html   

在httpd服务的主配置文件中,默认情况下DocumentRoot "/var/www/html"定义了默认web站点目录的路径。

如需自定义默认的目录,需要找如下格式进行添加:

httpd-2.2配置:
<Directory “/PATH/TO/FILE”>
Options Indexes FollowSymLinks
AllowOverride None
Order allow,deny
Allow from all
</Directory>

httpd-2.4配置:
<Directory “/PATH/TO/FILE”>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

               

创建主站数据目录:[root@ns1 ~]# mkdir /data/web/www -pv

                                       mkdir: 已创建目录 “/data”

                                       mkdir: 已创建目录 “/data/web”

                                       mkdir: 已创建目录 “/data/web/www”       

                                   [root@ns1 ~]# vim /data/web/www/test.html    #编辑测试页

                                                       <html>
                                                                 <head>
                                                                           test.page
                                                                 </head>
                                                           <body>
                                                                 <h1>test.page</h1>

                                                          </body>
                                                      </html>

                              [root@ns1 ~]# vim /etc/httpd/conf/httpd.conf       #配置文件

5

[root@localhost ~]# httpd -t                                  #检查语法
Syntax OK
[root@localhost ~]# systemctl restart httpd        #重启服务

测试网页:

6

 

 

(3)httpd的访问控制

1) 可基于两种机制指明对哪些资源进行何种访问控制

基于系统路径控制:

                    <Directory  "/PATH/TO/SOMEDIR">系统路径
                    ...
                    </Directory>

基于文件使用控制:

                    <File  "">针对某些文件使用
                    ...
                    </File>

                    <FileMatch  "PATTERN">
                    ...
                    </FileMatch>

基于URL路径控制: <location “”>…

                    <LocationMatch "">模式
                    ...
                    </LocationMatch>

2)基于Directory中的访问控制

  • options 包括以下可选参数:
Indexes: 允许目录浏览,当客户仅指定要访问的目录,但没有指定要访问的文件,且目录下不存在默认文档时,显示该目录中的文件及子目录列表索引
MultiViews:允许内容协商的多重视图,允许返回指定的访问目录下的相关联的文件
All:包含了除MultiViews之外的所有特性,如没有指定options,默认为All
ExecCG:允许在该目录下执行CGI脚本
FollowSymLink:允许跟踪符号链接到源文件
Includes:允许服务器端包含功能
IncludesNoExec:允许服务器端包含功能,但禁止执行CGI脚本
None:不调用options参数
  • AllowOverride选项用于定义每个目录下.htaccess文件中的指令类型,但通常设置None。

基于来源地址的访问控制

order和allow、deny
order:定义生效次序;写在后面的表示默认法则;
order Allow Deny:Allow的来源地址允许访问,其余都拒绝。
order Deny Allow:deny的来源地址拒绝访问,其余都允许。
Allow from:允许访问的来源地址(白名单)
Deny from:拒绝访问的来源地址(黑名单)

来源地址格式:    IP  NetAddr:172.16
                      172.16.0.0
                      172.16.0.0/16
                      172.16.0.0/255.255.0.0

Httpd-2.2控制页面资源允许所有来源的主机可访问

<Directory””>   #配置地方
…
Oder allow,deny
Allow from all
<Directory””>

<Directory””>   #配置地方
…
Requlre all granted
<Directory””>

1

只允许172.16.15网段的主机访问

2

Httpd-2.4控制页面资源拒绝所有来源的主机可访问

<Directory””>   #配置地方
…
Oder allow,deny
Deny from all
<Directory””>
<Directory””>   #配置地方
…
Requlre all denied
<Directory””>

基于ip可控制:

Require Ip IP地址或网络地址

Require not Ip IP地址或网络地址

基于主机名控制

Require host 主机名或域名地址

Require not host 主机名或域名

(4)基于用户的访问控制

            认证质询:WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;

            认证:Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;

                认证方式有两种:
                    basic:明文
                    digest:消息摘要认证

            安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;

            用户的账号和密码存放于何处?
                虚拟账号:仅用于访问某服务时用到的认证标识

                存储:
                    文本文件;
                    SQL数据库;
                    ldap目录存储;

            basic认证配置示例:
                <1> 定义安全域
                    <Directory "">
                        Options None
                        AllowOverride None
                        AuthType Basic
                        AuthName "String“
                        AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                        Require  user  username1  username2 ...
                    </Directory>

                    允许账号文件中的所有用户登录访问:
                        Require  valid-user

                <2> 提供账号和密码存储(文本文件)
                    使用专用命令完成此类文件的创建及用户管理
                        htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 
                            -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
                            -m:md5格式加密
                            -s: sha格式加密
                            -D:删除指定用户
                            -b 批模式添加用户

                另外:基于组账号进行认证;
                    <1> 定义安全域
                        <Directory "">
                            Options None
                            AllowOverride None
                            AuthType Basic
                            AuthName "String“
                            AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
                            AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
                            Require  group  grpname1  grpname2 ...
                        </Directory>

                    <2> 创建用户账号和组账号文件;

                        组文件:每一行定义一个组
                            GRP_NAME: username1  username2  

(5)虚拟主机

            站点标识: socket
                IP相同,但端口不同;
                IP不同,但端口均为默认端口;
                FQDN不同;请求报文中首部
                    Host: www.baidu.com 

            有三种实现方案:

            基于ip:
                    为每个虚拟主机准备至少一个ip地址;

            基于port:
                    为每个虚拟主机使用至少一个独立的port;

            基于FQDN:
                    为每个虚拟主机使用至少一个FQDN;

            注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用'main'主机;
                禁用方法:注释中心主机的DocumentRoot指令即可;

            虚拟主机的配置方法:

基于IP的虚拟主机示例:

                <VirtualHost 172.16.100.7:80>
                    ServerName www.b.net
                    DocumentRoot "/www/b.net/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.8:80>
                    ServerName www.c.org
                    DocumentRoot "/www/c.org/htdocs"
                </VirtualHost>

                基于端口的虚拟主机:
                <VirtualHost 172.16.100.6:80>
                    ServerName www.a.com
                    DocumentRoot "/www/a.com/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.6:808>
                    ServerName www.b.net
                    DocumentRoot "/www/b.net/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.6:8080>
                    ServerName www.c.org
                    DocumentRoot "/www/c.org/htdocs"
                </VirtualHost>

                基于FQDN的虚拟主机:
                NameVirtualHost 172.16.100.6:80

                <VirtualHost 172.16.100.6:80>
                    ServerName www.a.com
                    DocumentRoot "/www/a.com/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.6:80>
                    ServerName www.b.net
                    DocumentRoot "/www/b.net/htdocs"
                </VirtualHost>

                <VirtualHost 172.16.100.6:80>
                    ServerName www.c.org
                    DocumentRoot "/www/c.org/htdocs"
                </VirtualHost>                                            
                
注意:如果是http-2.2 则使用基于FQDN的虚拟主机时,需要事先使用如下指令:NameVirtusalHost Ip:port        
 

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/99402

(0)
上一篇 2018-05-26 15:26
下一篇 2018-05-26 17:19

相关推荐

  • 第四周课程总结

    sed高级编辑命令模式空间相当于正在处理数据的这块空间保持空间相当于仓库,临时存放暂时没有处理完的半成品的空间P(大写):打印模式空间开端至\n内容,并追加到默认输出之前(即只打印第一行)h: 把模式空间中的内容覆盖至保持空间中H:把模式空间中的内容追加至保持空间中g: 从保持空间取出数据覆盖至模式空间G:从保持空间取出内容追加至模式空间x: 把模式空间中的…

    Linux笔记 2018-04-22
  • HTTP服务和APACHE

    http协议 Httpd介绍 Htdtpd2.2配置 Httpd2.4配置 编译安装http

    2018-06-19
  • 文件权限

    介绍了修改文件权限的方法,umask和三种特殊权限以及acl控制访问表

    2018-04-04
  • 初识Linux集群

    Linux cluster基础与lvs简单介绍

    2018-06-24
  • Linux 第一週作業 (6.18–6.24)

    计算机的组成及其功能
    罗列Linux的发行版
    Linux的哲学思想
    一些簡單命令
    如何在Linux系统上获取命令的帮助信息
    Linux发行版的基础目录名称命名法则及功用规定

    Linux笔记 2018-06-23