第十周博客作业

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
下一篇 2018-05-26

相关推荐