Apache部署详解

 1、Centos7系统下实现httpd-2.2的安装,并分别实现prefork、worker、event等几种工作方式
准备安装环境
[root@node1 ~]# yum groupinstall "Development Tools" "ServerPlatform Development" -y
#下载并解压安装包
[root@node1 apache]# tar -xf httpd-2.2.32.tar.gz
[root@node1 apache]# ls
httpd-2.2.32  httpd-2.2.32.tar.gz
#编译安装httpd_2.2.32
[root@node1 httpd-2.2.32]# ./configure -prefix=/usr/local/httpd -with-mpm=prefork
[root@node1 httpd-2.2.32]# make
[root@node1 httpd-2.2.32]# make install
#设定环境变量
[root@node1 conf]# PATH="$PATH:/usr/local/httpd/bin"
[root@node1 conf]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/usr/local/httpd/bin
[root@node1 conf]# vim /etc/profile.d/httpd.sh 
export PATH="$PATH:/usr/local/httpd/bin"
[root@node1 conf]# source /etc/profile.d/httpd.sh    #把httpd的命令添加到系统环境中
#调整权限
[root@node1 conf]# useradd -M -s /sbin/nologin httpd
[root@node1 conf]# chown -R httpd:httpd /usr/local/httpd/
#编辑unit文件使用systemctl 管理启动httpd
[root@node1 conf]# vim /usr/lib/systemd/system/httpd.service
[Unit]
Description=The httpd service
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/httpd/bin/apachectl start
ExecStop=/usr/local/httpd/bin/apachectl stop
ExecRestart=/usr/local/httpd/bin/apachectl restart
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#启动服务
[root@node1 conf]# systemctl daemon-reload 
[root@node1 conf]# systemctl start httpd.service
[root@node1 conf]# ps aux |grep httpd
root      55254  0.0  0.1  49364  1964 ?        Ss   16:51   0:00 /usr/local/httpd/bin/httpd -k start
daemon    55255  0.0  0.2  51448  2040 ?        S    16:51   0:00 /usr/local/httpd/bin/httpd -k start
daemon    55256  0.0  0.1  51448  1344 ?        S    16:51   0:00 /usr/local/httpd/bin/httpd -k start
daemon    55257  0.0  0.1  51448  1344 ?        S    16:51   0:00 /usr/local/httpd/bin/httpd -k start
daemon    55258  0.0  0.1  51448  1344 ?        S    16:51   0:00 /usr/local/httpd/bin/httpd -k start
daemon    55259  0.0  0.1  51448  1344 ?        S    16:51   0:00 /usr/local/httpd/bin/httpd -k start
daemon    55285  0.0  0.1  51448  1344 ?        S    16:52   0:00 /usr/local/httpd/bin/httpd -k start
root      55308  0.0  0.0 112648   956 pts/2    R+   16:53   0:00 grep --color=auto httpd
[root@node1 conf]# httpd -M|grep mpm
Syntax OK
 mpm_prefork_module (static)

prefork:多进程模型,每个进程响应一个请求;
    一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
    n个子进程:每个子进程处理一个请求;
    工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
worker:多进程多线程模型,每线程处理一个用户请求;
    一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
    多个子进程:每个子进程负责生成多个线程;
    每个线程:负责响应用户请求;
    并发响应数量:m*n
        m:子进程数量
        n:每个子进程所能创建的最大线程数量;
event:事件驱动模型,多进程模型,每个进程响应多个请求;
    一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
    子进程:基于事件驱动机制直接响应多个请求;
    
 2、简述request报文请求方法和状态响应码 
 http事务就是http协议的一次请求和响应的过程;http请求是由请求者发出的request报文定义的,响应是由response报文定义的,而请求报文和响应报文都有固定的格式;
报文语法格式:

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

  <entity-body>

response报文
  <version> <status> <reason-phrase>
  <headers>

  <entity-body>
展开说明:
method: 请求方法(标明客户端希望服务器对资源执行的动作)
如下为常用method的解释:

请求方法 解释
GET:从服务器获取一个资源
HEAD:只从服务器获取文档的响应首部
POST:向服务器发送要处理的数据
PUT:将请求的主体部分存储在服务器上
DELETE:请求删除服务器上指定的文档
TRACE:追踪请求到达服务器中间经过的代理服务器
OPTIONS:请求服务器返回对指定资源支持使用的请求方法
version:HTTPD的版本号
HTTP/<major>.<minor>,由主版本和次版本号组成

status(状态码):
1xx:100-101, (额外)信息提示类的状态码;
2xx:200-206, 成功类的状态码;
3xx:300-305, 重定向类的状态码;没有把请求的页面响应给客户端,而是重定向到其它地方,或是无需获取此资源;
4xx:400-415, 错误类信息,客户端的错误类的状态码;例如请求不存在的资源;
5xx:500-505, 错误类信息,服务器端错误类的状态码;例如服务器内部的问题,因为资源有语法错误运行部成功,无法响应,不是资源不存在;

headers:首部(每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值)
 格式为:Name: Value,常见的首部格式如下:
1.通用首部:
Date: 报文的创建时间
Connection:连接状态,如keep-alive, close
Via:显示报文经过的中间节点
Cache-Control:控制缓存
Pragma: no-cache.相当于Cache-Control: no-cache

2.请求首部:
Accept:通过服务器自己可接受的媒体类型;
Accept-Charset:浏览器指明自己接收的字符集
Accept-Encoding:接受编码格式,如gzip
Accept-Language:接受的语言
Client-IP: 客户端ip地址
Host: 请求的服务器名称和端口号
Referer:包含当前正在请求的资源的上一级资源;
User-Agent:客户端代理

条件式请求首部:
Expect:服务器指明该实体什么时候过期.
If-Modified-Since:自从指定的时间之后,请求的资源是否发生过修改
If-Unmodified-Since:自从指定的时间之后,请求的资源是否没有修改
If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的
If-Match:Etag没改变,才执行请求

安全请求首部:
Authorization:向服务器发送认证信息,如账号和密码
Cookie: 客户端向服务器发送cookie

代理请求首部:
Proxy-Authorization: 向代理服务器认证
3.响应首部:

信息性首部:
Age:响应持续时长,即资源的有效期;
Server:服务器程序软件名称和版本;

协商首部:某资源有多种表示方法时使用
Accept-Ranges:服务器可接受的请求范围类型;
Vary:服务器查看的其它首部列表;值会发生变化时就放在此首部;

安全响应首部:
Set-Cookie:向客户端设置cookie;用来标识客户端身份;
Set-Cookie2: 向客户端设置cookie版本2的信息;
WWW-Authenticate:来自服务器的对客户端的质询认证表单;当客户端请求资源时,资源要求认证;
4.实体首部:提供实体内容的大量信息;

跟内容格式相关:
Allow: 列出对此实体可使用的请求方法;
Location:告诉客户端真正的实体位于何处,在重定向时使用,响应码为301或302;
Content-Encoding: 内容的编码格式;
Content-Language: 内容使用的语言;
Content-Length: 主体的长度;
Content-Location: 实体真正所处位置;
Content-Type:主体的对象类型;如多媒体的类型等;
Content-Range:在整个资源中此实体表示的字节范围;

跟缓存相关:
ETag:资源实体的扩展标签;基于标签做请求时使用;
Expires:实体内容的过期时间;
Last-Modified:最后一次修改的时间;此时间只是推算出来的,可能不准确;

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

虚拟Web主机
    在同一台服务器中运行多个Web站点,其中每一个站点并不独立占用一台真正的计算机 
httpd支持的虚拟主机类型
    1、基于域名的虚拟主机
    2、基于IP地址的虚拟主机
    3、基于端口的虚拟主机
第1步:基于ip的虚拟主机
需求:
    1:构建2个虚拟Web站点:
    www.benet.com,IP地址为 192.168.32.132 
    /var/www/html/ilinux,IP地址为 192.168.32.150
    2:在浏览器中访问这两个域名时,分别显示不同的内容
[root@node1 ~]#systemctl stop firewalld
[root@node1 ~]#setenforce 0
[root@node1 conf.d]# mkdir /opt/accp            #创建虚拟主机的文件夹目录
[root@node1 conf.d]# mkdir /opt/benet
[root@node1 ~]# echo "<h1>welcome accp</h1>" > /opt/accp/index.html 
[root@node1 ~]# echo "<h1>welcome benet</h1>" > /var/www/html/iunixindex.html 
[root@node1 ~]#cd /etc/httpd/conf.d
[root@node1 conf.d]# vim vhost.conf
listen 80
<VirtualHost 192.168.32.132:80>                 #定义虚拟主机,给定IP地址
    ServerAdmin admin@accp.com               #定义此虚拟主机的IP地址
    DocumentRoot /var/www/html/ilinux                     #定义虚拟主机的归属目录
    ServerName www.ilinux.io                   #定义域名
    ErrorLog logs/accp.com-error_log                  #错误日志
    CustomLog logs/    accp.com-access_log common
        <Directory "/var/www/html/ilinux">                           #定义虚拟主机的目录权限
            options none
            AllowOverride None
            Require all granted
        </Directory>
</VirtualHost>

<VirtualHost 192.168.32.150:80>
    ServerAdmin admin@benet.com
    DocumentRoot /var/www/html/iunix
    ServerName www.iunix.io  
    ErrorLog logs/benet.com-error_log
    CustomLog logs/benet.com-access_log common
        <Directory "/var/www/html/iunix">
            options none
            AllowOverride None
            Require all granted
        </Directory>
</VirtualHost>
[root@node1 conf.d]# systemctl restart httpd.service
[root@node1 conf.d]# systemctl stop firewalld
[root@node1 ~]# curl http://192.168.32.132
<h1>ilinux</h1>
[root@node1 ~]# curl http://192.168.32.150
<h1>iunix</h1> 

第2步:基于端口地址的虚拟主机

[root@node1 conf.d]# vim vhost.conf 
listen 80
listen 8080
<VirtualHost 192.168.32.132:80>
    ServerAdmin admin@accp.com
    DocumentRoot /var/www/html/ilinux
    ServerName www.ilinux.io
    ErrorLog logs/accp.com-error_log
    CustomLog logs/accp.com-access_log common
        <Directory "/var/www/html/ilinux">
            options none
            AllowOverride None
            Require all granted
        </Directory>
</VirtualHost>
<VirtualHost 192.168.32.132:8080>
    ServerAdmin admin@benet.com
    DocumentRoot /var/www/html/iunix
    ServerName www.iunix.io
    ErrorLog logs/benet.com-error_log
    CustomLog logs/benet.com-access_log common
        <Directory "/var/www/html/iunix">
            options none
            AllowOverride None
            Require all granted
        </Directory>
</VirtualHost>
[root@node1 conf.d]#systemctl restart httpd.service 
[root@node1 ~]# curl http://192.168.32.132:80
<h1>ilinux</h1>
[root@node1 ~]# curl http://192.168.32.132:8080
<h1>iunix</h1>

第3步:基于域名的虚拟主机

[root@node1 conf.d]# vim vhost.conf 
Listen 80
<VirtualHost 192.168.32.132:80>
ServerAdmin admin@accp.com
DocumentRoot www.ilinux.io
ServerName /var/www/html/ilinux
ErrorLog logs/accp.com-error_log
CustomLog logs/accp.com-access_log common
</VirtualHost>
<Directory "/var/www/html/ilinux">
options none
AllowOverride None
Require all granted
</Directory>

<VirtualHost 192.168.32.132:80>
ServerAdmin admin@benet.com
DocumentRoot /var/www/html/iunix
ServerName www.iunix.io
ErrorLog logs/benet.com-error_log
CustomLog logs/benet.com-access_log common
</VirtualHost>
<Directory "/var/www/html/iunix">
options none
AllowOverride None
Require all granted
</Directory>
[root@node1 conf.d]# vi /etc/hosts  添加如下ip和域名的对应关系
192.168.32.132 www.ilinux.io
192.168.32.132 www.iunix.io

[root@node1 ~]#curl http://www.ilinux.io
<h1>ilinux</h1>
[root@node1 ~]#curl http:www.iunix.io
<h1>iunix</h1>

站点路径访问控制

可基于来源地址或者基于账号两种访问控制机制;定义的方式有两种:
文件系统路径:<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:定义生效次序;写在后面的表示默认法则;如:
      <Directory  "/PATH/TO/FILE">
          Options Indexes FollowSymLinks
          AllowOverride None
          Order allow, deny
          Allow  from  IP | NetAddr
          Deny  from  IP | NetAddr
      </Directory>
httpd-2.4中基于Ip地址访问的控制是利用Require实现,如:

      <Directory  "/PATH/TO/FILE">
         AllowOverride none
         Options none
         <RequireAll>
            Require ip IP | NetAddr #允许访问的IP或网段
            Require not ip IP | NetAddr #拒绝访问的Ip或网段
         </RequireAll>
      </Directory>
实例:
#修改上诉虚拟主机配置文件
[root@node1 ~]# vim /etc/httpd/conf.d/virtualhost.conf
<VirtualHost 192.168.32.132:80>
 Servername www.ilinux.io
 DocumentRoot "/var/www/html/ilinux"
 <Directory "/var/www/html/ilinux">
 Options None
 AllowOverride None
 Require all granted
 </Directory>
 Customlog "logs/ilinux_access_log" combined
</VirtualHost>
LISTEN 8080
<VirtualHost 192.168.32.150:8080>
 Servername www.iunix.io
 DocumentRoot "/var/www/html/iunix"
 <Directory "/var/www/html/iunix">
 Options None
 AllowOverride None
 <RequireAll>
 require all granted
 require not ip 192.168.32.129
 </RequireAll>
 </Directory>
 Customlog "logs/unix_access_log" combined
</VirtualHost>
#重启服务
[root@node1 ~]# systemctl restart httpd.service
##在主机192.168.32.129上检测
[root@node1 ~]# curl http://192.168.32.132   #可以访问
<h1>ilinux</h1>

基于用户的访问控制:

对于网站中的一些资源,需要只对特定的用户开放,可以通过用户的访问控制来实现.有质询和认证两种方式.
质询:服务器用401响应码拒绝客户端请求,并说明要求客户端提供账号和密码
认证:客户端用户填入账号和密码后再次发送请求报文,认证通过时,则服务器发送响应的资源.有basic基本认证和digest摘要认证两种.这里以basic认证做实验.
basic认证的配置格式如下:

<Directory "/somepath/to/file">  # 需要访问控制的文件路径
    Options None
    AllowOverride None
    AuthType Basic   # 认证方式
    AuthName "String“   #认证提示信息
    AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"   #认证用户的文件路径
    Require  user  username1  username2 ...   #允许访问的用户
</Directory>
#  Require  valid-user  表示允许所有AuthUserFile 文件中所以的账号
#  AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"  基于用户组做访问控制
#  Require  group  grpname1  grpname2 ... 同上
登陆使用的账号为虚拟账号而非系统的账号,而且httpd是明文传输的,所以使用htpasswd命令来创建账号文件格式如下:
htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 
        -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用
        -m:md5格式加密
        -s: sha格式加密
        -D:删除指定用户
实例
#创建密码账户和允许访问的用户
[root@node1 ~]# htpasswd -c /tmp/text.users tom
[root@node1 ~]# htpasswd -m /tmp/text.users wuwuwu
[root@node1 tmp]# htpasswd -m /tmp/text.users 123456
#把存放密码的文件移动到httpd目录下,且保存为隐藏文件
[root@node1 ~]# mv /tmp/text.users /etc/httpd/conf.d/.htpasswd
#创建站点主页面
[root@node1 ~]# mkdir /var/www/html/text
[root@node1 ~]# echo "1212121" > /var/www/html/text/index.html
#创建模块化文件并且做对应配置
[root@www ~]# vim /etc/httpd/conf.d/text.conf
<Directory "var/www/html/text">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "please enter the user"
        AuthUserFile "/etc/httpd/conf.d/.htpasswd"
        Require user tom wuwuwu jjj
</Directory>
#测试语法错误并重启
[root@node1 ~]# httpd -t
Syntax OK
[root@node1 ~]# systemctl restart httpd.service
验证


持久连接相关:

Persistent Connection:tcp连接建立后,每个资源获取完成后不全断开连接,而是继续等待其他资源请求的进行;但是总归要断开,如何断开?可以通过对连接数量和时间限制来控制;比如:限制100个连接,超过100个后会断开最先的连接;限制连接60秒后没有进行任何操作则断开;

副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
折衷的改进办法:使用较短的持久连接时长,以及较少的请求数量;
持久连接的相关参数:
KeepAlive Off|On                           #关闭或打开持久连接
MaxKeepAliveRequserts 100         #最大持久连接请求数量
KeepAliveTimeout 15                    #连接时长,单位秒;httpd-2.4支持毫秒
测试:
telnet WEB_SERVER_IP PORT
GET  /URL  HTTP/1.1
Host:WEB_SERVER_IP
实例:
[root@node1 ~]# vim /etc/httpd/conf.d/keepalive.conf
keepalive  On
KeepAliveTimeout  15
MaxKeepAliveRequests  100
[root@node1 ~]# netstat -tnl|grep 23     #监听23端口
tcp        0      0 :::23                       :::*                        LISTEN    
[root@node1 ~]# telnet 192.168.32.129 80
Trying 192.168.32.129...
Connected to 192.168.32.129.
Escape character is '^]'.
GET /index.html HTTP/1.1
Host:192.168.32.129

HTTP/1.1 200 OK
Date: Thu, 18 Oct 2018 08:32:38 GMT
Server: Apache/2.2.15 (CentOS)
Last-Modified: Thu, 18 Oct 2018 07:21:11 GMT
ETag: "2009e1-8-5787ba1a3e6d8"
Accept-Ranges: bytes
Content-Length: 8
Content-Type: text/html; charset=UTF-8

2112312

Connection closed by foreign host.   #这里不会立刻断开,会等到最大连接数或连接时长到达才会

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值