Http又叫超文本传输协议,是目前被广泛使用的一种应用层协议,也是几乎所有互联网访问者都接触过的协议。日常生活中我们所用到的浏览器,就是用来在客户端上实现此协议的程序,可以说一台电脑,不论它属于吃瓜群众,还是热爱瞎XX鼓捣配置的电脑达人,其上都会有至少一种浏览器来实现在互联网上访问信息和获取资源的需求,所以,http协议的重要性不言而喻。

    当然,在客户端所访问到的信息和资源肯定都不是凭空而来的,简单来说,在网络的那一端,我们所要访问的东西都安静地待在某个服务器里,在http协议下,客户端机器通过程序向某个ip下的服务器的某个端口(其实就是80端口)发出请求,服务器上监听在此端口上的服务通过服务端程序进行响应,从而达到了客户端的目的。

 

一次完整的http请求处理过程
   (1) 建立连接:接收来自客户端的连接请求(有些情况下也可能拒绝)
   (2) 接收请求:接收来自客户端请求报文中对某特定资源的一次请求的过程
   (3) 处理请求:对请求报文进行解析,获取客户端请求的资源及请求方法等相关信息
   (4) 访问资源:获取请求报文中请求的资源
   (5) 构建响应报文
   (6) 发送响应报文
   (7) 记录日志

    

    而想要实现上述过程,服务器必须要有服务端程序(再加上dns服务器和其他一些配套服务,就可以称为一个web服务器了),在此,我们最常用的就是httpd,也就是apache。

安装并开启此服务,过程有些复杂

                                                    ]# yum install httpd -y

                                                    ]# service httpd start                    

    完成!接下来清一下防火墙就可以了,为了装X,我还在/var/www/html(默认的文档页面路径)下建了个文件,做了个主页面,然后打开本机的浏览器,然后输入我的ip,看到了自己的心血之作

 

HTTP入门及httpd-2.2服务配置示例_服务器

 

    当然,这还不算完,要保证自己服务器的性能和安全等需要(假设我已经申请了域名,全世界都能看到我的“hello world”),还要对此服务进行一些配置:

配置文件:
     /etc/httpd/conf/httpd.conf
     /etc/httpd/conf.d/*.conf

1、修改监听的IP和PORT
        Listen  [IP:]PORT
     (1) 省略IP表示为0.0.0.0;
     (2) Listen指令可重复出现多次;
      Listen  80
      Listen  8080
     (3) 修改监听socket,重启服务进程方可生效

2、持久连续
    Persistent Connection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行
(可避免频繁三次握手四次断手神马的); 

      限制:时间和数量上
      副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常响应;
      折衷:使用较短的持久连接时长,以及较少的请求数量; 
   HTTP入门及httpd-2.2服务配置示例_服务器_02

上图为默认情况,如将KeepAlive改为on,将会连接持续60秒

 

3、MPM 
    httpd-2.2不支持同时编译多个MPM模块(我用的centos6.7)所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;确认现在使用的是哪下程序文件的方法:
     ps  aux  | grep httpd
     
    默认使用的为/usr/sbin/httpd,其为prefork的MPM模块 ;
     查看httpd程序的模块列表:
      查看静态编译的模块:
       # httpd  -l
      查看静态编译及动态编译的模块:
       # httpd  -M
       
    更换使用httpd程序,以支持其它MPM机制;
     /etc/sysconfig/httpd
      HTTPD=/usr/sbin/httpd.{worker,event}
      
    注意:重启服务进程方可生效

HTTP入门及httpd-2.2服务配置示例_浏览器_03

上图为prefork和worker的配置,http2.2上event属于测试阶段

    三种进程模型:

MPM:Multipath processing Modules (多路处理模块)
    prefork:多进程模型,每个进程响应一个请求;
     一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
     n个子进程:每个子进程处理一个请求;
     工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;
    worker:多进程多线程模型,每线程处理一个用户请求;
     一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
     多个子进程:每个子进程负责生成多个线程;
     每个线程:负责响应用户请求;
     并发响应数量:m*n
      m:子进程数量
      n:每个子进程所能创建的最大线程数量;
    event:事件驱动模型,多进程模型,每个进程响应多个请求;
     一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;
     子进程:基于事件驱动机制直接响应多个请求;

 

4、DSO
    配置指定实现模块加载
     LoadModule  <mod_name>  modules/MODULE_FILE.SO
     
     模块文件路径可使用相对路径:
      相对于ServerRoot(默认/etc/httpd)

模块文件路径:
     /usr/lib64/httpd/modules(/etc/httpd/modules是链接)

5、定义'Main' server的文档页面路径:

    ServerName FQDN:PORT
    DocumentRoot  "/var/www/html"

HTTP入门及httpd-2.2服务配置示例_互联网_04

ServerName是我自己定义的服务器名称, DocumentRoot的路径是系统默认的,我没改,这两项根据自己需求来;

由此两项,我们可知,如果我在网上(假设我这域名能访问)访问 www.jz.com/index.html实际上我请求的就是/var/www/html/index.html这个文件

 

6、站点访问控制常见机制
   
    可基于两种机制指明对哪些资源进行何种访问控制
    
     文件系统路径

    URL路径

HTTP入门及httpd-2.2服务配置示例_浏览器_05

<Directory>中“基于源地址”实现访问控制:(上图为默认)
     (1) Options
      后跟1个或多个以空白字符分隔的“选项”列表;
       Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;
       FollowSymLinks:允许跟踪符号链接文件所指向的源文件;
       SymLinksifOwnerMatch
       ExecCGI:允许执行CGI脚本
       All
       None:
       
     (2)  AllowOverride
      httpd允许在网页文档的各目录下使用.htaccess文件实现单目录资源访问控制
      与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;
      All
      None:
       
     (3) order  allow,deny
      order:定义生效次序;写在后面的表示默认法则;
      
      Allow from, Deny from
       来源地址:
        1)IP
        2)NetAddr:
         172.16
         172.16.0.0
         172.16.0.0/16
         172.16.0.0/255.255.0.0
        3)FQDN
        4)DAMAIN

因为涉及到跟踪符号链接指向源文件的问题,建议直接将Options后面改成None,安全又简单;AllowOverride默认为None是处于服务器性能考虑;Order后跟allow,deny,表示除了allow定义的意外,全都deny,用以访问控制,但恰好allow定义的是Allow from all......

 

7、定义站点主页面:
    DirectoryIndex  index.html  index.html.var

 

8、定义路径别名
    格式:
     Alias  /URL/  "/PATH/TO/SOMEDIR/"

此处:URL不必存在,只是作为一个指向,而别名则可以是不在DocumentRoot下的文件

 

9、日志设定
    日志类型:访问日志 和 错误日志
    
    错误日志:
     ErrorLog  logs/error_log
           Possible values include: debug, info, notice, warn, error, crit, alert, emerg.

LogLevel  warn(默认为warn,warn之上的级别才报告)

HTTP入门及httpd-2.2服务配置示例_日常生活_06

 

访问日志:
     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
     CustomLog  logs/access_log  combined
     
     LogFormat format strings:
      http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
     
      %h:Remote host,远程主机,客户端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”的值;即发出请求的应用程序;

HTTP入门及httpd-2.2服务配置示例_日常生活_07

上图为/var/log/httpd/access_log文件,果然格式一毛一样

 

 

10、httpd-manual
     yum install httpd-manual

     配置文件:/etc/httpd/conf.d/manual.conf/
     重加载服务

     访问路径:
      http://SERVER_IP/manual/

 

11、基于用户的访问控制
    
    认证质询:
     WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码;
    
    认证:
     Authorization:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源;
     
     认证方式有两种:
      basic:明文
      digest:消息摘要认证
    
    安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因;

存储:
      文本文件;
      SQL数据库;
      ldap目录存储;

(httpd要有相应的适配模块)

basic认证配置示例:
     (1) 定义安全域
      <Directory "">
       Options None
       AllowOverride None
       AuthType Basic
       AuthName "For Administrators"
       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:删除指定用户
        
     另外:基于组账号进行认证;
      (1) 定义安全域
       <Directory "">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "For Administrators"
        AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"
        AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
        Require  group  grpname1  grpname2 ...
       </Directory>
       
      (2) 创建用户账号和组账号文件;
       
       组文件:每一行定义一个组
        GRP_NAME: username1  username2  ...

 

12、虚拟主机
    多个站点基于不同的信息进行标识;
    
    站点标识:
     IP相同,端口不同;
     IP不同,端口相同;
     FQDN不同;
     
    虚拟主机就有了三种实现方式:
     基于IP的虚拟主机:
      每个虚拟主机使用一独有的IP地址;
     基于PORT的虚拟主机:
      每个虚拟主机使用一个独有的PORT;
     基于FQDN的虚拟主机:
      每个虚拟主机使用一个独有的FQDN;
      
    注意:虚拟主机与“主服务器”不能够同时使用;
     
     虚拟主机的配置方法:
      <VirtualHost IP:PORT>
       ServerName
       DocumentRoot
      </VirtualHost>
      
      其它常用指令:
       Errorlog
       CusomLog
       Alias
       ServerAlias
       ...
       
     基于IP的虚拟主机示例:
      前提:本机需要配置了用到的所有IP地址;
      
      <VirtualHost 172.16.100.71:80>
       ServerName www1.magedu.com
       DocumentRoot /data/vhosts/www1
      </VirtualHost>
      <VirtualHost 172.16.100.72:80>
       ServerName www2.magedu.com
       DocumentRoot /data/vhosts/www2
      </VirtualHost>
      
     基于端口的虚拟主机示例:
      前提:httpd监听了用到的所有端口;
      
      <VirtualHost 172.16.100.71:80>
       ServerName www1.magedu.com
       DocumentRoot /data/vhosts/www1
      </VirtualHost>
      <VirtualHost 172.16.100.71:8080>
       ServerName www2.magedu.com
       DocumentRoot /data/vhosts/www2
      </VirtualHost>      
        
     基于FQDN的虚拟主机示例:
      NameVirtualHost 172.16.100.71:80
      
      <VirtualHost 172.16.100.71:80>
       ServerName www1.magedu.com
       DocumentRoot /data/vhosts/www1
      </VirtualHost>
      <VirtualHost 172.16.100.71:80>
       ServerName www2.magedu.com
       DocumentRoot /data/vhosts/www2
      </VirtualHost>     

虚拟主机开启后,主服务器自动失效

    

    以上就是httpd的一些配置,当然,还有许多配置有待补全,我们下回分解。