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,即
worker
或event
; 需要可靠性或者与旧软件兼容的站点可以使用prefork
。
在用户看来,MPM 很像其它 Apache 模块。主要是区别是,在任何时间, 必须有一个,而且只有一个 MPM 加载到服务器中。
(2)MPM的三个模型:
prefork:多进程模型,一个进程响应一个请求;(两级进程模型,父进程管理子进程,每一个子进程相应一个请求)。
优点:稳定可靠、执行效率高,任何一个进程的崩溃不会影响其它请求.
缺点:在大并发的时候对服务器资源消耗严重.
worker:多进程多线程模型,一个线程响应一个请求;(三级进程模型,父进程管理子进程,子进程通过线程响应用户请求;每个线程处理一个用户请求);
优点:在高并发的情况下,对服务器的资源消耗相对prefork模型要小很多.
缺点:执行效率、稳定性都不如prefork模型.linux不是个原生支持线程的操作系统,经测试发现worker模型在linux上面的综合表现不如prefork模型.。
event:事件驱动模型,一个进程响应n个请求;(两级线程模型,父进程管理子进程,子进程通过event-drivern机制直接响应n个请求)。
(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
在查看或修改其对应prefork配置:
[root@bogon ~]# vim /etc/httpd/conf/httpd.conf
StartServers: 默认启动的工作进程数;
MinSpareServers: 最少空闲进程数;
MaxSpareServers: 最大空闲进程数;
ServerLimit: 最大活动进程数;
MaxRequestWorkers: 并发请求的最大数;
MaxConnectionsPerChild: 每个子进程在生命周期内所能够服务的最多请求个数,然后被杀死 0表示不限定
启动httpd服务并查看相关的进程状态:
[root@bogon ~]# ps aux | grep httpd
查看其中已经启动了八个子进程
使用ab工具对相应的URL进行压力测试并观察进程的状况:
[root@bogon ~]# ab -n 100000 -c 10 http://172.16.15.12/index.html
(5)实现worker工作方式
CentOS6 :配置方法
[root@bogon ~]# vim /etc/sysconfig/httpd #编辑配置文件
在查看或修改其对应worker配置:
[root@bogon ~]# vim /etc/httpd/conf/httpd.conf
StartServers: 默认启动的工作进程数; MaxClients: 最大连接数; MinSpareThreads: 最小线程数; MaxSpareThreads: 最大线程数; ThreadsPerChild:每个子进程可生成的线程数; MaxRequestsPerChild: 单个子进程累计最多处理到少个请求,默认0,不限制的意思,可能会导致内存泄露,超过该值则退出重启apach
启动httpd服务并查看相关的进程状态:
[root@bogon ~]# service httpd restart
[root@bogon ~]# ps aux | grep httpd
查看其中已经启动了3个进程
使用ab工具对相应的URL进行压力测试并观察进程的状况:
[root@localhost ~]# ab -n 100000 -c 10 http://172.16.15.12/index.html
(6)实现event工作方式
http-2.2的event模式还处于测试阶段,因此不建议在生产环境上运行,httpd-2.4的event模式为正式版可在生产环境上部署。
CentOS6 :配置方法
[root@bogon ~]# vim /etc/sysconfig/httpd #编辑配置文件
在查看添加其对应event配置:
[root@bogon ~]# vim /etc/httpd/conf/httpd.conf
StartServers: 默认启动的工作进程数;
MinSpareThreads:最小线程数;
MaxSpareThreads: 最大线程数;
ThreadsPerChild:每个子进程可生成的线程数;
MaxRequestsPerChild: 单个子进程累计最多处理到少个请求,默认0,不限制的意思,可能会导致内存泄露,超过该值则退出重启apach
启动httpd服务并查看相关的进程状态:
[root@bogon ~]# service httpd restart
[root@bogon ~]# ps aux | grep httpd
查看其中已经启动了3个进程
使用ab工具对相应的URL进行压力测试并观察进程的状况:
(7)在Centos 7上设置mpm三个模式:
httpd-2.4 修改mpm
[root@ns1 ~]# vim /etc/httpd/conf.modules.d/00-mpm.conf
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请求步骤
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/*.conf
、Include 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
添加监听端口
重启服务并查看端口:
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# ss -tnl
2、使用长连接
1)首先http是无状态的,持久连接是tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行;
2) 使用数量限制和时间限制来断开连接控制;
3) 当对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应,较好的解决方案是设置使用较短的持久连接时长,以及较少的请求数量;
创建配置文件:
[root@localhost ~]# vim /etc/httpd/conf/conf.d/keepalive.conf
KeepAlive on #启用长连接
KeepAliveTimeout 15 # 持续时长15秒
MaxKeepAliveRequests 100 #最大请求数量100个资源
[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 #配置文件
[root@localhost ~]# httpd -t #检查语法
Syntax OK
[root@localhost ~]# systemctl restart httpd #重启服务
测试网页:
(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””>
只允许172.16.15网段的主机访问
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