1 基础介绍

1.1 端口规范

IANA:互联网数字分配机构对传输层TCP协议端口做了相关的规定

端口范围 含义
0-1023 众所周知,永久的分配给固定的应用使用,特权端口
1024-41951 也是注册端口,但要求不是特别严格,分配给程序注册为某应用使用,如3306/tcp
41952+ 客户端程序随机使用的端口,动态端口,或私有端口,其范围定义, 如常见CentOS发行版系统中在/proc/sys/net/ipv4/ip_local_port_range目录下可以查看

1.2 套接字

BSD Socket:IPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进行通信
Socket API(封装了内核中socket通信相关的系统调用)

  • SOCK_STREAM:TCP套接字
  • SOCK_DGRAM:UDP套接字
  • SOCK_RAW:裸套接字

根据套接字所使用的地址格式,Socket Domain可对其做如下分类:

  • AF_INET:Address Family,IPv4
  • AF_INET6:ipv6
  • AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址;Unix_SOCK

    1.3 TCP状态机

    下图描述了TCP三次握手、数据传输以及四次断开过程中各阶段所处的状态
    7bcb0599a84517e0b1d5a17f5c125948.jpg
    TCP协议的特性:

  • 建立连接:三次握手;

  • 将数据打包成段:检验和(CRC32)
  • 确认、重传及超时;
  • 排序:逻辑序号;
  • 流量控制:滑动窗口算法;
  • 拥塞控制:慢启动和拥塞避免算法;

    1.4 http协议

    http协议:hyper text transfer protocol 应用层协议,80/tcp,超文本传输协议

    1.4.1 协议版本

    http/0.9:原型版本,功能简陋
    http/1.0:cache,MIME,method
    MIME:Multipurpose Internet Mail Extension
    method:GET,POST,HEAD,PUT,DELETE,TRACE,OPTIONS
    http/1.1:增强了缓存功能;
    spdy
    http/2.0:

    1.4.2 工作模式

    PV,UV,IP
    PV : Page View
    UV: User View
    IP:访问IP
    web服务器:
    即存放了web资源的主机,负责向请求者提供对方请求的静态资源,或动态资源运行生成的结果;这些资源通常应该放置于本地文件系统某路径下;此路径称为DocRoot ;如httpd服务的/var/www/html :
    web服务器的资源路径映射方式:
    1、docroot
    2、alias
    3、虚拟主机的docroot
    4、用户家目录的docroot
    http请求报文:http request
    http响应报文:http response
    一次http事务:请求<—>响应
    web资源:web resource
    静态资源(无需服务端做出额外处理):如图片,html文件,mp3,map4等
    动态资源(服务端需要通过执行程序做处理,发送给客户端的是程序的运行结果):.php,.jsp
    注意:一个页面中展示的资源可能有多个,每个资源都需要单独请求;
    资源的标识机制:URL,Uniform Resource Locator,用于描述服务器某特定的资源的位置
    例如:http://www.sino.com.cn/index.html
    Scheme://Server[:Port][/PATH/TO/SOME_RESOURCE]
    一次完整的http请求处理过程:
    1)建立或处理连接:接受请求或拒绝请求
    2)接受请求:接收来自与网络上的主机请求报文中对某特定资源的一次请求的过程;
    3)处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息;
    4)访问资源:获取请求报文中请求的资源;
    5)构建响应报文
    6)发送响应报文
    7)记录日志
    http请求处理中的连接模式:
    1、保持连接(长连接):keep-alive
    2、非保持连接(短连接):
    http服务器程序:httpd(apache)、nginx、lighttpd
    应用程序服务器:IIS : .Net、tomcat : .jsp

    1.4.3 http报文介绍

    URL:Unifrom Resource Locator
    基本语法︰
    ://[[:]@]:/[;][?][#]
    params:参数
    http:/ /www.baidu.com/bbs/hello;gender=f
    query :
    http://www.baidu.com/bbs/item.php?username=tom&title=abc
    frag :
    https://access.redhat.com/documentatlon/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Gulde/ index.html#ct-Boot-x86
    报文语法格式:
    request报文



    response报文



    method:请求方法,标明客户端希望服务器对资源执行的动作
    GET、HEAD、POST、PUT(DAV)、DELETE、TRACE、OPTIONS
    version:HTTP/.
    status:三位数字,如200,301,302,404,502;标记请求处理过程中发生的情况;
    reason-phrase:状态码所标记的状态的简要描述;
    headers:每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值;
    entity-body:请求时附加的数据或响应时附加的数据;

Method(方法):

  • GET:从服务器获取一个资源;
  • HEAD:只从服务器获取文档的响应首部;
  • POST:向服务器发送要处理的数据;
  • PUT:将请求的主体部分存储在服务器上;
  • DELETE:请求删除服务器上指定的文档;
  • TRACE:追踪请求到达服务器中间经过的代理服务器;
  • OPTIONS:请求服务器返回对指定资源支持使用的请求方法;

    Status(状态码)

    1xx : 100-101,信息提示;
    2xx : 200-206,成功
    3xx : 300-305,重定向
    4xx : 400-415,错误类信息,客户端错误
    5xx : 500-505,错误类信息,服务器端错误
    常用的状态码:
    200:成功,请求的所有数据通过响应报文的entity-body部分发送;OK
    301:请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanenty,永久重定向
    302:与301相似,但在响应报文中通过Location指明资源现在所处临时新位置,临时重定向
    304:客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modfied
    401:需要输入账号和密码认证方能访问资源;Unauthorized
    403:请求被禁止; Forbidden
    404:服务器无法找到客户端请求的资源;Not Found
    500:服务器内部错误;Internal Server Error
    502:代理服务器从后端服务器收到了一条伪响应;Bad Gateway

    首部的分类:

    通用首部、请求首部、响应首部、实体首部、扩展首部
    通用首部:
    Date:报文的创建时间
    Connection:连接状态,如keep-alive, close
    Via:显示报文经过的中间节点(代理服务器)
    Cache-Control:控制缓存
    Pragma :
    请求首部:
    Accepte:通过服务器自己可接受的媒体类型;(MIME, text/html, appliction/Javascript, images/Jpeg);
    Accept-charset:
    Accept-Encoding:接受编码格式,一般是指压缩机制,如gzip,deflate,sdch
    Accept-Language:接受的语言
    Client-IP:
    Host:请求的服务器名称和端口号
    Referer :包含当前正在请求的资源的上一级资源;
    User-Agent :客户端代理
    条件式请求首部:
    Expect :
    If-Modifiled-Since:自从指定的时间之后,请求的资源是否发生过修改;
    If-Unmodified-Since :
    If-None-Match:本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配;
    If-Match :
    安全请求首部:
    Authorization:向服务器发送认证信息,如账号和密码;
    Cookie:客户端向服务器发送cookie
    Cookie2 :
    代理请求首部:
    Proxy-Authorization:向代理服务器认证
    响应首部:
    信息性∶
    Age :响应持续时长
    server :服务器程序软件名称和版本
    协商首部∶某资源有多种表示方法时使用
    Accept-Ranges:服务器可接受的请求范围类型
    Vary:服务器查看的其它首部列表;
    安全响应首部:
    Set-Cookie:向客户端设置cookie ;
    Set-Cookie2:
    www-Authenticate:来自服务器的对客户端的质询认证表单
    实体首部:
    Allow:列出对此实体可使用的请求方法
    Location:告诉客户端真正的实体位于何处
    Content-Encoding:
    Content-Language:
    Content-Length:主体的长度
    Content-Location:实体真正所处位置
    Content-Type:主体的对象类型
    缓存相关:
    Etag:实体的扩展标签;
    Expires:实体的过期时间;
    Last-Modifled:最后一次修改的时间

    1.4.4 I/O模型

    单进程I/O模型:启动一个进程处理用户请求,一次只能处理一个请求,多个请求被串行响应;
    多进程I/O结构:由父进程并行启动多个子进程,每个子进程响应一个请求;
    复用的I/O结构:一个进程响应n个请求;
    多线程模式:一个进程生成n个线程,一个线程处理一个请求;
    事件驱动(event-driven) :一个进程直接响应n个请求;
    复用的多进程I/O结构︰启动多个( m )个进程,每个进程生成( n )个线程;
    响应的请求的数量:m*n

    2 httpd介绍与使用

    httpd又被称为apache,是由ASF(apache software foundation)apache软件基金会开源的一款web服务器,虽是上个实际发布的产品,现在依旧被广泛使用。

    2.1 httpd的特性

    高度模块化:core + modules
    DSO:dynamic shared object
    MPM:Multipath processing Modules (多路处理模块)
    httpd的程序版本:
    httpd 1.3:官方已经停止维护;
    httpd 2.0:
    httpd 2.2:
    httpd 2.4:目前最新稳定版;

    2.1.1 httpd-2.4新特性

    01)MPM支持运行为DSO机制;以模块形式按需加载
    02)event MPM生产环境可用
    03)异步读写机制
    04)支持每模块及每目录的单独日志级别定义
    05)每请求相关的专用配置
    06)增强版的表达式分析式
    07)毫秒级持久连接时长定义
    08)基于FQDN的虚拟主机也不再需要NameVirutalHost指令
    09)新指令,AllowOverrideList
    10)支持用户自定义变量
    11)更低的内存消耗
    新模块:
    1)mod_proxy _fcgi
    2)mod_proxy_scgi
    3)mod_remoteip

    2.1.2 请求接收模型

    prefork:Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。
    一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
    n个子进程:每个子进程处理一个请求;
    工作模型:会预先生成几个空闲进科,随时等待用于响应用户请求;最大空闲和最小空闲;
    worker :和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。
    一个主进程︰负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
    多个子进程:每个子进程负责生成多个线程;
    每个线程︰负责响应用户请求;
    并发响应数量:mn
    m:子进程数量;
    n:每个子进程所能创建的最大线程数量;
    *event:
    事件驱动模型,多进程模型,每个进程响应多个请求;这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。
    一个主进程︰负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
    子进程:基于事件驱动机制直接响应多个请求;
    httpd-2.2:仍为测试使用模型;
    httpd-2.4:event可生产环境中使用;

    2.1.3 httpd功能特性

    特性:
    CGi : Common Gateway Interface
    虚拟主机:IP ,PORT,FQDN
    反向代理
    负载均衡
    路径别名
    丰富的用户认证机制
    basic
    digest
    支持第三方模块
    …..

    2.2 部署及配置

    安装方式:
    1、rpm包:CentOS 发行版中直接提供;
    2、编译安装:定制新功能,或其它原因;
    服务控制:
    systemctl enable | disable httpd.service
    systemctl {start | stop | restart | status httpd.service

    2.2.1 程序相关文件

    针对CentOS7或8环境,及httpd 2.4版本
    配置文件:
    /etc/httpd/conf/httpd.conf
    /etc/httpd/conf.d/.conf
    模块相关的配置文件:
    /etc/httpd/conf.modules.d/
    .conf
    systemd unit file :
    /usr/lib/systemd/system/httpd.service
    主程序文件:
    /usr/sbin/httpd
    日志文件:
    /var/log/httpd:
    access_log:访问日志
    error_log:错误日志
    站点文档:
    /var/www/html
    模块文件路径︰
    /usr/lib64/httpd/modules

    2.2.2 配置详解

    主配置文件:/etc/httpd/conf/httpd.conf
    #Section 1: Global Environment
    #Section 2: “Main” server configuration
    #Sectlon 3: Virtual Hosts
    配置格式:
    directive value
    directive:不区分字符大小写﹔
    value:为路径时,是否区分字符大小写,取决于文件系统;
    常用配置:

    1、修改监听的IP和PORT

    Listen [IP:]PORT [protocol]
    (1)省略IP表示为0.0.0.0 ;
    (2) Listen指令可重复出现多次﹔
    Listen 80
    Listen 8080
    (3)修改监听socket,重启服务进程方可生效;
    (4)限制其必须通过ssl通信时,protocol需要定义为https;

    2、持久连续

    Persistent Connection:TCP连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行;
    副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
    折中:使用较短的持久连接时长,以及较少的请求数量;
    KeepAlive on | off #是否开启长连接
    KeepAliveTimeout 15 #长连接维持时间
    MaxKeepAliveRequests 100 #长连接期间最大可以发起多少起请求
    注意:https-2.4的keepAliveTimeout可以是毫秒级;
    KeepAliveTimeout num[ms]
    测试︰通过如下方法可以看到长连接已经生效,在一次连接过程中,我们做了多次资源请求
    telnet 10.0.0.200 80
    GET /index.html HTTP/1.1
    Host: 10.0.0.200
    接着按两次回车即可请求到资源
    image.png

    3、MPM多路处理模块

    httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httprefork httpd.worker,httpd.event,在CentOS7的环境中/etc/httpd/module下能看到很多.so文件分别用于实现对不同的MPM机制的支持,可实现动态装载;确认当下使用的是哪个MPM的方法:
    ps aux l grep httpd
    默认使用的为/usr/sbin/httpd,其为prefork的MPM模块;
    查看httpd程序的模块列表∶
    查看静态编译的模块︰
    # httpd -l
    查看静态编译及动态编译的模块:
    # httpd -M
    MPM修改:
    CentOS 6:
    /etc/sysconfig/httpd
    HTTPD=/usr/sbin/httpd.{worker,event}
    注意:重启服务进程方可生效
    CentOS 7:
    MPM配置:修改文件 /etc/httpd/conf.modules.d/00-mpm.conf,默认为prefork模型,使用其他模型时,只需取消注释即可,同时不要忘记注释其他的配置
    image.png
    1、prefork的配置
    可配置相关参数

    1. LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
    2. <IfModule prefork.c>
    3. StartServers 4
    4. MinSpareServers 2
    5. MaxSpareServers 5
    6. ServerLimit 256
    7. Maxclients 256
    8. MaxRequestsPerchild 400
    9. </IfModule>


    StartServers 4 #服务在启动时默认启动几个子进程
    MinSpareServers 2 #最小空闲进程数量
    MaxSpareServers 5 #最大空闲进程数量
    ServerLimit 256 #允许同时连接的最大请求数量
    MaxClients 256 #最大并发量,就是同时访问数量
    MaxRequestsPerChild 400 #每个子进程最多能处理的请求数量,处理够数量后就被kill然后重新启动

    2、worker的配置

    1. LoadModule mpm_worker_module modules/mod_mpm_worker.so
    2. <IfModule worker.c>
    3. StartServers 5
    4. MaxClients 300
    5. MinSpareThreads 25
    6. MaxSpareThreads 75
    7. ThreadsPerChild 25
    8. MaxRequestsPerChild 0
    9. </IfModule>

    如下可看到mpm为worker
    image.png

    StartServers 5 #配置启动多少个用于监听的服务,注意:这里并不是服务器进程,而是线程
    MaxClients 300 #最大支持的用户连接数
    MinSpareThreads 25 #最小的空闲线程数
    MaxSpareThreads 75 #最大的空闲线程数
    ThreadsPerChild 25 #允许每个进程最多生成多少个线程
    MaxRequestsPerChild 0 #设置一个独立的子进程将能处理的请求数量

    3、event配置

    1. LoadModule mpm_event_module modules/mod_mpm_event.so
    2. <IfModule mpm_event_module>
    3. StartServers 3
    4. ServerLimit 16
    5. MinSpareThreads 75
    6. MaxSpareThreads 250
    7. ThreadsPerChild 25
    8. MaxRequestWorkers 400
    9. MaxConnectionsPerChild 1000
    10. </IfModule>

    image.png

    4、DSO

    配置指定实现模块加载
    LoadModule
    模块文件路径可使用相对路径∶
    相对于ServerRoot(默认/etc/httpd )

    5、定义’Main’ Server根路径

    ServerName
    DocumentRoot “”
    文档路径映射:
    DoucmentRoot指向的路径为URL路径的起始位置
    其相当于站点URL的根路径;
    (FileSystem) /web/host1/index.html —>(URL) /index.html

    6、站点访问控制常见机制

    可基于两种机制指明对哪些资源进行何种访问控制,中基于源地址实现访问控制

    1. #目录授权
    2. <Directory "/var/www">
    3. AllowOverride None
    4. # Allow open access:
    5. Require all granted
    6. </Directory>
    7. #文件
    8. <Files ".ht*">
    9. Require all denied
    10. </Files>
    11. #对文件进行匹配
    12. <FilesMatch ".+\.(gif|jpe?g|png)$">
    13. # ...
    14. </FilesMatch>
    15. #指定url
    16. <Location "/private2/">
    17. # ...
    18. </Location>
    19. #配置url
    20. <LocationMatch "/(extra|special)/data">
    21. # ...
    22. </LocationMatch>

    1)Options,后跟1个或多个以空白字符分隔的“选项”列表,常见的选项如下:
    Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户 FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
    None:
    All:
    2)访问授权相关指令
    httpd-2.2:
    (1) AllowOverride
    与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
    All:
    None :
    (2) order和allow、deny,order:定义生效次序;写在后面的表示默认法则,Allow from, Deny from定义允 许或拒绝
    IP: 如 10.0.0.100
    NetAddr:如172.16、172.16.0.0、172.16.0.0/16、172.16.0.0/255.255.0.0几种形式皆可
    httpd-2.4:
    基于IP控制︰
    Require ip IP地址或网络地址
    Require not ip IP地址或网络地址
    基于主机名控制:
    Require host主机名或域名
    Require not host主机名或域名
    要放置于配置块中或配置块中;
    3)控制页面资源允许所有来源的主机可访问

    1. httpd-2.2
    2. <Directory "">
    3. .….
    4. order allow,denyAllow from all
    5. </Directory>
    6. httpd-2.4
    7. <Directory "">
    8. Require all granted
    9. </Directory>

    4)控制页面资源拒绝所有来源的主机可访问

    1. httpd-2.2
    2. <Directory "">
    3. .…
    4. Order allow,deny
    5. Deny from all
    6. </Directory>
    7. httpd-2.4
    8. <Directory "">
    9. Requlre all denied
    10. </Directory>

    5)页面控制综合实现

    1. <Directory "/var/www/html">
    2. Options Indexes FollowSymLinks
    3. AllowOverride None
    4. <RequireAll>
    5. Require ip 10.0.0.0/24
    6. </RequireALl>
    7. Require all denied
    8. </Directory>

    7、定义站点主页面

    <Directory "/foo">
      DirectoryIndex index.html
      DirectoryIndex index.php
    </Directory>
    

    8、定义路径别名

    格式:Alias /URL/ "/PATH/TO/SOMEDIR/"
    DocumentRoot "/www/htdocs"
    http: //www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
    /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
    Allas /download/ "/rpms/pub/"
    http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm
    /rpms/pub/bash-4.4.2-3.el6.x86_64.rpm
    http://www.magedu.com/images/logo.png
    /www/htdocs/images/logo.png
    

    9、设定默认字符集

    AddDefaultcharset UTF-8
    中文字符集:GBK,GB2312,GB18030

    10、日志设定

    日志类型:访问日志和错误日志
    错误日志:
    ErrorLog “logs/error_log”
    LogLevel warn
    Possible values include:debug, info, notice, warn, error, crit, alert, emerg.
    访问日志:下面写了一个自定义的格式——mylogformat

    ErrorLog "logs/error_log"
    LogLevel warn
    <IfModule log_config_module>
      LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
      LogFormat "%h %l %u %t \"%r\" %>s %b" common
      LogFormat "%h  \"%{User-Agent}i\"" mylogformat
      <IfModule logio_module>
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
      </IfModule>
      CustomLog "logs/access_log" mylogformat
    </IfModule>
    

    看日志格式输出:
    image.png
    %h:客户端IP地址;
    %l:Remote User,通常为一个减号(”” ) ;
    %u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;
    %t:服务器收到请求时的时间;
    %r:First line of request,即表示请求报文的首行;记录了此次请求的”方法”,”URL”以及协议版本;
    %>s:响应状态码;
    %b:响应报文的大小,单位是字节;不包括响应报文的http首部;
    %{Referer}i:请求报文中首部”referer”的值;即从哪个页面中的超链接跳转至当前页面的;
    %{User-Agent}i:请求报文中首部”User-Agent”的值;即发出请求的应用程序;

    11、基于用户的访问控制

    认证质询︰
    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 [optlons] /PATH/TO/HTTPD_PASSWD_FILE username
    -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用;
    -m:md5格式加密
    -s:sha格式加密
    -D:删除指定用户
    -b:非交互模式添加用户
    htpasswd -b [optlons] /PATH/TO/HTTPD_PASSWD_FILE username password
    另外基于组账号进行认证;
    (1)定义安全域

    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 …

    (2)创建用户账号和组账号文件﹔
    组文件:每一行定义一个组
    GRP_NAME:username1 username2 ..
    示例:
    创建用户

    [root@localhost conf]# htpasswd -c -b /etc/httpd/basic_auth xiang 1234567
    Adding password for user xiang
    [root@localhost conf]# htpasswd  -b /etc/httpd/basic_auth wu 1234567     
    Adding password for user wu
    [root@localhost conf]# systemctl restart httpd
    

    配置

    <Directory "/var/www/html">
      Options Indexes FollowSymLinks
      AllowOverride None
      AuthType Basic
      AuthName "String"
      AuthUserFile "/etc/httpd/basic_auth"
      Require user xiang wu
    </Directory>
    

    结果:
    image.png

    12、虚拟主机

    实现虚拟主机的三种不同方式

  • IP:通过不同的IP标识不同的虚拟主机,

  • Port:通过不同的端口标识不同的虚拟主机
  • 域名:根据不同的域名标识不同的虚拟主机,根据请求报文中首部Host字段进行区分

注意(专用于2.2版本):一般虚拟机不要与中心主机混用,因此要使用虚拟主机,得先禁用’main’主机;
禁用方法:注释中心主机的DocumentRoot指令即可;
虚拟主机的配置方法:

ServerName FQDN
DocumentRoot “”

其它可用指令∶
ServerAlias:虚拟主机的别名;可多次使用;
ErrorLog :
CustomLog :
<Directory “””>
…..

Allas
….
1)基于IP的虚拟主机示例

<VirtualHost 10.0.0.200:80>
  ServerName www.a.com
  DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 10.0.0.201:80>
  ServerName www.b.net
  DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 10.0.0.202:80>
  ServerName www.c.org
  DocumentRoot "/wwwlc.org/htdocs"
</VirtualHost>

2)基于端口的虚拟主机

<virtualHost 10.0.0.200:80>
ServerName www.a.com
DocumentRoot "/www/a.com/htdocs"
</VirtualHost>
<VirtualHost 10.0.0.200:81>
serverName www.b.net
DocumentRoot "/www/b.net/htdocs"
</VirtualHost>
<VirtualHost 10.0.0.200:82>
ServerName www.c.org
DocumentRoot "/www/c.org/htdocs"
</VirtualHost>

3)基于FQDN的虚拟主机

<VirtualHost *:80>
  ServerName blog.xsc.org
  DocumentRoot "/web/blog"
</VirtualHost>
<VirtualHost *:80>
  ServerName bbs.xsc.org
  DocumentRoot "/web/bbs"
</VirtualHost>
<VirtualHost *:80>
  ServerName operator.xsc.org
  DocumentRoot "/web/operator"
</VirtualHost>

image.png
注意:如果是httpd-2.2,则使用基于FQDN的虚拟主机时,需要事先使用如下指令:NameVirtualHost IP:PORT

13、status页面

LoadModule status_module modules/mod_status.so
httpd-2.2

SetHandler server-statusorder allow,deny
Allow firpm 172.16

httpd-2.4

SetHandler server-status

image.png

14、指定以哪个用户的身份运行httpd服务进程

User apache
Group apache
suexec

15、使用mod_deflate摸块压缩页面优化传输速度

适用场景:
(1)节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
(2)压缩适于压缩的资源,例如文件文件

16、https,http over ssl

SSL会话的简化过程
(1)客户端发送可供选择的加密方式,并向服务器请求证书
(2)服务器端发送证书以及选定的加密方式给客户端
(3)客户端取得证书并进行证书验证
如果信任给其发证书的CA :
(a)验证证书来源的合法性;用CA的公钥解密证书上数字签名
(b)验正证书的内容的合法性:完整性验正
(c)检查证书的有效期限
(d)检查证书是否被吊销
(e)证书中拥有者的名字,与访问的目标主机要一致
(4)客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
(5)服务用此密钥加密用户请求的资源,响应给客户端
注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机
配置httpd支持https:
1)为服务器申请数字证书
测试:通过私建CA发证书
(a)创建私有CA
(b)在服务器创建证书签署请求
(c)CA签证
2)配置httpd支持使用ssl,及使用的证书
#yum -y install mod_ssl
配置文件:/etc/httpd/conf.d/ssl.conf
DocumentRoot
ServerName
SSLcertificateFile
SSLcertificateKeyFile
3)测试基于https访问相应的主机
#openssl s_cllent [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

2.2.3 httpd自带的工具程序

htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具
apachectl:httpd自带的服务控制脚本,支持start和stop
apxs:由httpd-devel包提供,扩展httpd使用第三方模块的工具
rotatelogs:日志滚动工具
access.log —>
access.log, access.1.log —>
access.log, acccess.1.log, access.2.log
suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行
ab:apache bench
httpd的压力测试工具
ab, webbench, http_load, selge
jmeter, loadrunner
tcpcopy:网易,复制生产环境中的真实请求,并将之保存下来
ab [OPTIONS] URL
-n:总请求数
-c:模拟的并行数
-k:以持久连接模式测试

练习题:综合配置

<VirtualHost *:80>
        ServerName blog.xsc.org
        DocumentRoot "/web/blog"
        ErrorLog "logs/blog_logs/blog_error_log"
        LogLevel warn
        LogFormat "%h  \"%{User-Agent}i\"" mylogformat
        CustomLog "logs/blog_logs/blog_access_log" mylogformat
        KeepAlive on
        KeepAliveTimeout 15
        MaxKeepAliveRequests 100
        <Location "/status">
                SetHandler server-status
        </Location>
</VirtualHost>
<Directory "/web/blog">
        AllowOverride None
        Require all granted
        DirectoryIndex index.html
        Options Indexes FollowSymLinks
</Directory>

安装LAMP :
CentOS 7:httpd, php, php-mysql, mariadb-server
常见的LAMP架构应用:discuz、phpwind、wordpress