一、Centos7系统下实现httpd-2.2的安装,并分别实现prefork、worker、event等几种工做方式html
preforkapache
prefork是一个两级进程模型,非线程的模式,其实经过由父进程管理建立子进程,子进程响应的相应的请求的方式来运行的。以prefork模式运行的httpd,在启动之际就预派生fork了一些子进程,而后等待请求。每一个子进程只有一个线程,在一个时间点内只能处理一个请求。 优势:成熟、稳定、兼容全部新老模块。进程之间彻底独立,无须担忧线程安全的问题。 缺点:一个进程相对会占用更多的系统资源,消耗更多的内存。不适合处理高并发请求,因其会把请求放进队列中,一直等到有可用进程才会处理相应的请求。
workervim
worker是一个三级结构、多进程多线程的模式,其在启动时也预先fork了几个子进程,每一个子进程可以生产若干个服务线程和若干个监听线程,每一个服务线程处理一个请求,监听线程负责接入请求并将其传递给服务线程处理和应答。线程比起进程会更轻量,由于线程一般会共享父进程的内存空间,所以内存的占用会减小些,在高并发的场景下表现比prefork模式好。 优势:占用内存少,高并发性能更优秀。 缺点:当一个线程出现问题的时候会致使同一进程下的线程也会出现问题。在keep-alive长链接的方式下,某个线程会被一直占用,即便中间没有请求,也须要等待到超时才会被释放。
event安全
event模式是最新的运行模式,在httpd-2.4中已是稳定可用的模式。其运行原理与worker相似,区别在于,event模式解决了在keep-alive模式下,线程被长期占用直到超时,从而致使资源浪费的问题。 在event模块中,有一个专门的线程来管理这些keep-alive类型的线程,当接收到真实的请求时,会将请求传递给服务线程,执行完毕后,会将对应的服务线程释放,这样就能实现线程的异步非阻塞。
[root@silassu ~]#systemctl stop firewalld.service [root@silassu ~]#setenforce 0
准备安装环境服务器
[root@silassu ~]# yum groupinstall "Development Tools" "ServerPlatform Development" -y
下载并解压安装包网络
[root@silassu ~]#wget http://archive.apache.org/dist/httpd/httpd-2.2.34.tar.gz [root@silassu ~]# tar xf httpd-2.2.34.tar.gz [root@silassu ~]# ls httpd-2.2.34 httpd-2.2.34.tar.gz
进入对应的解压缩目录开始编译安装多线程
[root@silassu httpd-2.2.34]#./configure --prefix=/usr/local/httpd-2.2.34 -with-mpm=prefork [root@silassu httpd-2.2.34]# make && make install
软连接到对应的目录中并发
[root@silassu ~]# ln -sv /usr/local/httpd-2.2.34/ /usr/local/httpd ‘/usr/local/httpd’ -> ‘/usr/local/httpd-2.2.34/’
设定环境变量dom
[root@silassu ~]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/httpd/bin [root@silassu ~]# PATH="$PATH:/usr/local/httpd/bin" [root@silassu ~]# vim /etc/profile.d/httpd.sh [root@silasszl conf]# cat /etc/profile.d/httpd.sh export PATH="$PATH:/usr/local/httpd/bin" [root@silassu ~]# source /etc/profile.d/httpd.sh
调整权限curl
[root@silassu ~]# useradd -M -s /sbin/nologin httpd [root@silassu ~]# chown -R httpd.httpd /usr/local/httpd [root@silassu ~]# chown -R httpd.httpd /usr/local/httpd-2.2.34/
编辑unit文件使用systemctl 管理启动httpd
[root@silassu conf]# vim /usr/lib/systemd/system/httpd.service [root@silassu conf]# cat /usr/lib/systemd/system/httpd.service [Unit] Description=The httpd service After=network.target [Service] Type=forking ExecStart=/usr/local/httpd-2.2.34/bin/apachectl start ExecStop=/usr/local/httpd-2.2.34/bin/apachectl stop ExecRestart=/usr/local/httpd-2.2.34/bin/apachectl restart PrivateTmp=true [Install] WantedBy=multi-user.target
启动服务
[root@silassu conf]# systemctl daemon-reload [root@silassu conf]# systemctl start httpd.service [root@silassu conf]# ps aux |grep httpd root 10938 0.0 0.1 49292 1928 ? Ss 15:28 0:00 /usr/local/httpd-2.2.34/bin/httpd -k start daemon 10939 0.0 0.0 49428 1300 ? S 15:28 0:00 /usr/local/httpd-2.2.34/bin/httpd -k start daemon 10940 0.0 0.0 49428 1300 ? S 15:28 0:00 /usr/local/httpd-2.2.34/bin/httpd -k start daemon 10941 0.0 0.0 49428 1300 ? S 15:28 0:00 /usr/local/httpd-2.2.34/bin/httpd -k start daemon 10942 0.0 0.0 49428 1300 ? S 15:28 0:00 /usr/local/httpd-2.2.34/bin/httpd -k start daemon 10943 0.0 0.0 49428 1300 ? S 15:28 0:00 /usr/local/httpd-2.2.34/bin/httpd -k start root 10949 0.0 0.0 112660 964 pts/0 R+ 15:28 0:00 grep --color=auto httpd
在编译安装的时候对应作模式变动便可,当前为prefork模式
./configure -prefix=/usr/local/httpd -with-mpm=worker ./configure -prefix=/usr/local/httpd -with-mpm=event
二、简述request报文请求方法和状态响应码
request报文的请求方法:
状态响应码:
经常使用的状态响应码:
三、详细描述httpd虚拟主机、站点访问控制、基于用户的访问控制、持久连接等应用配置实例
虚拟主机
一个物理服务器能够有多个站点,每一个站点可经过一个或者多个虚拟主机来实现; httpd有三种类型的虚拟主机 基于IP:为每一个虚拟主机准备至少一个IP地址; 基于PORT:为每一个虚拟主机使用至少一个独立的PORT; 基于FQDN(ServerName):为每一个虚拟主机使用至少一个FQDN; 注意: 1.通常虚拟主机不要与中心主机混用;要使用虚拟主机,得先禁用"main"主机,禁用方法: 注释中心主机的DocumentRoot指令便可. 2.配置VirtualHost,在httpd2.2中,NameVirtualHost这一项需启用,2.2以上版本不须要.
实例
1)基于IP地址
增长两个ip地址,确保网络能ping通
[root@silassu ~]#ip addr add 192.168.2.103/24 dev ens33 [root@silassu ~]#ip addr add 192.168.2.104/24 dev ens33
建立两个虚拟主机的数据目录并输入数据
[root@silassu html]#mkdir -p /var/www/html/103 [root@silassu html]#mkdir -p /var/www/html/204 [root@silassu html]#echo "hello,ip address is "192.168.2.103"" > /var/www/html/103/index.html [root@silassu html]#echo "hello,ip address is "192.168.2.104"" > /var/www/html/104/index.html
编辑配置文件,修改虚拟主机和权限
[root@silassu ~]# vim /etc/httpd/conf.d/virtualhost.conf [root@silassu ~]# cat /etc/httpd/conf.d/virtualhost.conf <VirtualHost 192.168.2.103:80> DocumentRoot "/var/www/html/103" ServerName www.EAPDomain103.com <Directory "/var/www/html/103"> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.2.104:80> DocumentRoot "/var/www/html/104" ServerName www.EAPDomain104.com <Directory "/var/www/html/104"> AllowOverride None Require all granted </Directory> </VirtualHost>
测试语法并重启httpd服务,而后测试对应结果
[root@silassu ~]#httpd -t Syntax OK [root@silassu ~]#systemctl restart httpd.service [root@silassu ~]#curl 192.168.2.103 hello,ip address is 192.168.2.103 [root@silassu ~]#curl 192.168.2.104 hello,ip address is 192.168.2.104
2)基于端口号
建立基于端口的目录和索引文件
[root@silassu ~]#mkdir -p /var/www/html/8086 [root@silassu ~]#mkdir -p /var/www/html/8088 [root@silassu ~]#echo "hi,the ip Port is '8086'" >/var/www/html/8086/index.html [root@silassu ~]#echo "hi,the ip Port is '8088'" >/var/www/html/8088/index.html
修改配置文件端口号及相关配置
[root@silassu ~]# vim /etc/httpd/conf.d/virtualhost.conf [root@silassu ~]# cat /etc/httpd/conf.d/virtualhost.conf Listen 8086 Listen 8088 <VirtualHost 192.168.2.100:8086> DocumentRoot "/var/www/html/8086" ServerName "www.EAPDomain.com" <Directory "/var/www/html/8086"> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.2.100:8088> DocumentRoot "/var/www/html/8088" ServerName "www.EAPDomain.com" <Directory "/var/www/html/8088"> AllowOverride None Require all granted </Directory> </VirtualHost>
测试语法并重启httpd服务,而后测试对应结果
[root@silassu ~]#httpd -t Syntax OK [root@silassu ~]#systemctl restart httpd.service [root@silassu ~]#curl 192.168.2.100:8086 hi,the ip Port is '8086' [root@silassu ~]#curl 192.168.2.100:8088 hi,the ip Port is '8088'
3)基于主机域名
建立基于主机域名的目录和索引文件
[root@silassu ~]#mkdir -p /var/www/html/EAPDomain [root@silassu ~]#mkdir -p /var/www/html/EDomain [root@silassu ~]#echo "domain name is 'www.EAPDomain.com'" >/var/www/html/EAPDomain/index.html [root@silassu ~]#echo "domain name is 'www.EDomain.com'" >/var/www/html/EDomain/index.html
修改主配置文件相关配置
[root@silassu ~]# vim /etc/httpd/conf.d/virtualhost.conf [root@silassu ~]# cat /etc/httpd/conf.d/virtualhost.conf <VirtualHost 192.168.2.100:80> DocumentRoot "/var/www/html/EAPDomain" ServerName www.EAPDomain.com <Directory "/var/www/html/EAPDomain"> AllowOverride None Require all granted </Directory> </VirtualHost> <VirtualHost 192.168.2.100:80> DocumentRoot "/var/www/html/EDomain" ServerName www.EDomain.com <Directory "/var/www/html/EDomain"> AllowOverride None Require all granted </Directory> </VirtualHost>
更改本地hosts文件对应关系或自建DNS作对应修改
[root@silassu named]#vim /etc/hosts [root@silassu named]#cat /etc/hosts 192.168.2.100 www.EAPDomain.com www.EDomain.com
测试语法并重启httpd服务,而后测试对应结果
[root@silassu ~]#httpd -t Syntax OK [root@silassu ~]#systemctl restart httpd.service [root@silassu named]#curl www.EAPDomain.com domain name is 'www.EAPDomain.com' [root@silassu named]#curl www.EDomain.com domain name is 'www.EDomain.com'
站点访问控制
可基于来源地址或者基于帐号两种访问控制机制;定义的方式有两种: 文件系统路径:<Directory ""> ... </Directory> URL路径:<Location ""> ... </Location> <Directory>中“基于源地址”实现访问控制: (1) Options后跟1个或多个以空白字符分隔的“选项”列表; Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;做为下载站点时才使用;不然,不使用此选项; FollowSymLinks:容许跟踪符号连接文件所指向的源文件; None:都禁止; All:都容许; Includes:容许启用服务器包含; SymLinksifOwnerMatch:比FollowSymLinks在限制上更为严格的机制;表示只有原文件的属主和连接文件的属主相同时,才容许跟踪; ExecCGI:容许执行cgi脚本; MultiViews:容许执行内容协商;很是消耗资源且不×××全; (2) AllowOverride:与访问控制相关的哪些指令能够放在.htaccess文件(每一个目录即网站目录下均可以有一个,指令放在此文件中表示当前目录下的配置文件都无效,所在目录下的这个隐藏文件生效)中; All: 全部指令均可放在这个隐藏文件中; None:这个隐藏文件中什么指令都不放;或给个指定列表,文件信息、根认证相关的信息,限制可放进这个隐藏文件中;会使网站资源解析时性能影响很是大; (3) http-2.2中基于IP地址的访问控制是利用Allow和Deny来实现的;order:定义生效次序;写在后面的表示默认法则;
实例
禁止ip:192.168.2.33访问
修改虚拟主机配置文件
[root@silassu ~]#vim /etc/httpd/conf.d/virtualhost.conf [root@silassu ~]#cat /etc/httpd/conf.d/virtualhost.conf <VirtualHost 192.168.2.103:80> Servername www.EAPDomain.io DocumentRoot "/var/www/html/EAPDomain" <Directory "/var/www/html/EAPDomain"> Options None AllowOverride None Require all granted </Directory> Customlog "logs/EAPDomain_access_log" combined </VirtualHost> LISTEN 8080 <VirtualHost 192.168.2.104:8080> Servername www.EDomain.io DocumentRoot "/var/www/html/EDomain" <Directory "/var/www/html/EDomain"> Options None AllowOverride None <RequireAll> require all granted require not ip 192.168.2.33 </RequireAll> </Directory> Customlog "logs/EDomain_access_log" combined </VirtualHost>
重启httpd服务,而后在主机192.168.2.33上检测结果
[root@silassu ~]# systemctl restart httpd.service [root@silassu ~]# curl http://192.168.2.103 <h1>EAPDomain</h1> [root@silassu ~]# curl http://192.168.2.104:8080 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"><html><head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title>Apache HTTP Server Test Page powered by CentOS</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
基于用户的访问控制
对于网站中的一些资源,须要只对特定的用户开放,能够经过用户的访问控制来实现.有质询和认证两种方式. 质询:服务器用401响应码拒绝客户端请求,并说明要求客户端提供帐号和密码 认证:客户端用户填入帐号和密码后再次发送请求报文,认证经过时,则服务器发送响应的资源.有basic基本认证和digest摘要认证两种.这里以basic认证作实验. 登录使用的帐号为虚拟帐号而非系统的帐号,并且httpd是明文传输的,因此使用htpasswd命令来建立帐号文件格式以下: htpasswd [options] /PATH/TO/HTTPD_PASSWD_FILE username -c:自动建立此处指定的文件,所以,仅应该在此文件不存在时使用 -m:md5格式加密 -s: sha格式加密 -D:删除指定用户
实例
建立密码帐户和容许访问的用户
[root@silassu ~]#htpasswd -c /tmp/test.users tom [root@silassu ~]#htpasswd -m /tmp/test.users jerry [root@silassu ~]#htpasswd -m /tmp/test.users obama
把存放密码的文件移动到httpd目录下,且保存为隐藏文件
[root@silassu ~]#mv /tmp/test.users /etc/httpd/conf.d/.htpasswd
建立测试主页面
[root@silassu conf.d]#mkdir -p /var/www/html/testusers [root@silassu conf.d]#echo "Testusers Area" > /var/www/html/testusers/index.html
建立模块化文件而且作对应配置
[root@silassu conf.d]#vim /etc/httpd/conf.d/testusers.conf <Directory "/var/www/html/testusers"> Options None AllowOverride None AuthType basic AuthName "Test Area,pls enter your username and password" AuthUserFile "/etc/httpd/conf.d/.htpasswd" Require user tom jerry obama #Require valid-user </Directory>
编辑配置文件
[root@silassu ~]# vim /etc/httpd/conf.d/text.conf [root@silassu ~]# cat /etc/httpd/conf.d/text.conf DocumentRoot "/var/www/html/testusers" <Directory "/var/www/html/testusers"> AllowOverride None # Allow open access: Require all granted </Directory>
测试语法并重启httpd服务,而后测试
[root@silassu conf.d]#httpd -t Syntax OK [root@silassu conf.d]#systemctl restart httpd.service
持久链接
Persistent Connection:tcp链接创建后,每一个资源获取完成后不全断开链接,而是继续等待其余资源请求的进行;可是总归要断开,如何断开?能够经过对链接数量和时间限制来控制;好比:限制100个链接,超过100个后会断开最早的链接;限制链接60秒后没有进行任何操做则断开; 反作用:对并发访问量较大的服务器,长链接机制会使得后续某些请求没法获得正常响应; 折衷的改进办法:使用较短的持久链接时长,以及较少的请求数量; 持久链接的相关参数: KeepAlive Off|On #关闭或打开持久链接 MaxKeepAliveRequserts 100 #最大持久链接请求数量 KeepAliveTimeout 15 #链接时长,单位秒;httpd-2.4支持毫秒
实例
建立模块化进行对应设置
[root@silassu ~]#vim /etc/httpd/conf.d/keepalive.conf [root@silassu ~]#cat /etc/httpd/conf.d/keepalive.conf KeepAlive On KeepAliveTimeout 35 MaxKeepAliveRequests 100
测试语法并重启httpd服务,而后测试
[root@silassu conf.d]#httpd -t Syntax OK [root@silassu conf.d]#systemctl restart httpd.service