HTTP协议及服务配置

HTTP:hyper text transfer protocol,80/tcp 超文本传输协议
http协议版本:
HTTP/0.9:原型版本,功能简陋。仅能实现简单的资源交互,不支持多媒体内容。
HTTP/1.0:第一个广泛使用的版本,支持MIME,从而支持多媒体,但缓存机制设计仍然简陋和薄弱
HTTP/1.1:增强了缓存功能
HTTP/2.0:
http是基于tcp完成的协议

一次完整的http请求处理过程:
  (1)建立或处理连接,接收请求或拒绝请求
  (2)接收请求,接收来自于网络的请求报文中对某一资源的一次请求的过程
  (3)处理请求,对请求报文进行解析,并获取请求的资源及请求方法等相关信息
  (4)访问资源,获取请求报文中请求的资源
  (5)构建响应报文,一旦web服务器找到资源,而且这个资源也允许被某个客户端访问,这个
  时候它就要能够拿到这个资源,把它封装成一个响应报文,并指明这个资源内部的内容格式发
  送给客户端。
  (6)发送响应报文
  (7)记录日志

httpd的特性:

高度模块化:core+modules  任何一个组件出现问题或者需要升级,它只影响一个模块,而不
会影响整体的代码,任何一个模块崩溃,有可能只需要替换一个模块即可
DSO:Dynamic Shared Object 动态共享对象
MPM:Mutipath Processing Modules:实现多种不同的I/O模型。
    Prefork:多进程模型,主进程,生成多个子进程,每个子进程响应一个请求;
    worker:多线程模式,主进程,生成多个子进程,每个子进程生成多个线程,每个线程响
    应一个请求;
    event:事件驱动模型,主进程,生成多个子进程,每个子进程响应多个请求;
I/O类型
  同步和异步:synchronous,asynchronous;关注的是消息通知机制
    同步:调用发出后不会立即返回,但是一旦返回,则返回的是最终结果。
    异步:调用发出后,被调方立即返回消息,但返回并非最终结果,被调用者通过状态,通知
    机制等来通知调用者,或通过回调函数来处理结果。
  阻塞和非阻塞:block,noblock ;关注的是调用者等待被调用者返回结果时的状态
    阻塞:调用结果返回前,调用者被挂起;调用者只有在得到返回结果之后才能继续;
    非阻塞:调用者在结果返回之前,不会被挂起,即调用不会阻塞调用者;

I/O模型:
  blocking IO:阻塞式IO
  noblocking IO:非阻塞IO
  IO multiplexing:复用型IO
  signal driven IO:事件驱动式IO
    通知:
      水平触发:多次通知
      边缘触发:只通知一次
  asynchronous IO:异步IO

一个进程发起IO调用时,这个IO将由两个阶段组成(一次IO,指的是磁盘IO),第一步:数据
从磁盘到内核内存,第二步:数据从内核内存到进程内存。真正被称为IO是数据从内核内存到进
程内存的过程。

这里写图片描述
实际上,除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。这给网络编程带来了一个很大的问题,如在调用send()的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。

程序环境:
  配置文件:
    /etc/httpd/conf/httpd.conf
    /etc/httpd/conf.d/*.conf
  服务脚本:
    /etc/rc.d/init.d/httpd
    配置文件:/etc/sysconfig/httpd
  主程序文件:
    /usr/sbin/httpd
    /usr/sbin/httpd.event
    /usr/sbin/httpd.worker
  日志文件目录:
    /var/log/httpd
      access_log:访问日志
      error_log:错误日志
  站点文档目录:
    /var/www/html

配置文件组成部分:
    ~]# grep "Section" /etc/httpd/conf/httpd.conf 
    ### Section 1: Global Environment
    ### Section 2: 'Main' server configuration
    ### Section 3: Virtual Hosts

常用配置:

1 修改监听的IP和PORT

Listen [IP:]PORT  IP可省略,省略表示监听本地所有ip地址;listen可以应用多次

这里写图片描述

2 持久连接

目前多数的浏览器都请求服务器保持持续连接,这种功能就称为“KeepAlive“,它是HTTP1.1标
准规格,一般是用来强化服务器的性能。在使用保持连接功能时,设置客户一次请求连接能影响
文件的最大上限,建议把默认值设为ON,以便提高访问性能。但当使用负载均衡时,会影响负载
均衡的效果,在未断开连接之前,同一客户端时中被定向至同一台服务器。

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待
其他的请求完成;
KeepAlived On|Off  是否开启持久连接
MaxKeepAliveRequests #  数量限制
KeepAliveTimout #  时间限制

测试:
  telnet HOST PORT
  GET /URL HTTP/1.1
  Host: HOSTNAME or IP

3 MPM 多路处理模块 prefork,worker,event

http-2.2不支持同时编译多个模块,所以一次编译只能选定一个,rpm安装的包提供
三个二进制执行程序,分别用于实现对不同MPM机制的支持。

<IfModule prefork.c>       #判定模块是否存在
StartServers       8       
#默认启动的工作进程数;不包括主进程,主进程只是负责子进程的创建回收等
MinSpareServers    5       #最少空闲进程数
MaxSpareServers   20       #最大空闲进程数
ServerLimit      256       #最大活动进程数
MaxClients       256       
#并发请求的最大数;请求连接进来不一定会活动,要小与等与ServerLimit
MaxRequestsPerChild  4000  #每个进程在生命周期内所能服务的最多的请求个数;
</IfModule>

<IfModule worker.c>
StartServers         4    #启动的子进程的个数
MaxClients         300    #并发请求的最大数
MinSpareThreads     25    #最小空闲线程数
MaxSpareThreads     75    #最大空闲线程数
ThreadsPerChild     25    #每个子进程可生成的线程数
MaxRequestsPerChild  0    
#每个子进程在生命周期内所能服务的最多的请求个数,0标示不限定
</IfModule>

默认为/usr/sbin/httpd,其使用prefork。
更换使用的httpd程序:
  /etc/sysconfig/httpd
    HTTPD=
  重启服务生效;

这里写图片描述
这里写图片描述

4 DSO模块加载方式

配置指令实现模块加载
  LoadModule <mod_name> <mode_path>
  模块路径可使用相对地址,相对于ServerRoot(/etc/httpd)指向的路径而言:
    /etc/httpd/modules/

httpd -M:列出已经装载的所有DSO以及非DSO模块
httpd -l:列出支持使用的非DSO模块

这里写图片描述

5 定义站点根目录

DocumentRoot /path/to/somewhere
文档路径映射:
    DocumentRoot指向的路径为URL路径的起始位置;
      DocumentRoot “/var/www/html“
        test/index.html --> http://HOST:PORT/test/index.html

apache服务器存放页面的路径,默认所有要求提供HTTP服务的连接,都要以这个目录为主目录,默认为/var/www/html

6 站点访问控制

可基于两种类型的路径指明对哪些资源进行访问控制
  文件系统路径
    <Directory ""> </Directory>
    <FileMatch ""> <FileMatch>
  URL路径:
    <Location ""> </Location>
    ...
访问控制机制:
  基于来源地址;
  基于帐号;

7 Directory中“基于来源地址“实现访问控制

1Options
   所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews None All
       Indexes:缺少指定的默认页面时,允许将目录中所有文件以列表形式返回给用户,危险!
       Includes:允许是用mod_include模块实现服务器端包含(SSI);
       FollowSymlinks:允许跟踪符号连接文件;
       SymlinksIfOwnerMatch:在链接文件属主属组与源文件的属主属组相同时,允许跟随符号连接所指向的原始文件;
       ExecCGI:允许是用mod_cgi模块执行CGI脚本;
       MultiViews:允许是用mod_negotiation实现内容协商;
       None:所有都不启用;
       All:允许所有;
(2)基于来源地址的访问控制机制
   Order:检查次序
      Order allow,deny
      Order deny,allow
   Allow from
   Deny from
   来源地址:IP 或 NetAddr  172.16 | 172.16.0.0 | 172.16.0.0/16
<Directory>可以配置网站目录下的访问属性,使用<Directory ~ "path">可以基于正则表达式的匹配,但是一般不建议使用,会消耗时间。类似的指令还有:
<Location [~] "">:配置URL访问属性,与<Directory>相似(可以配置ststus页面或者定义了别名的路径等);
<File [~] "">:限制单个文件的访问属性;
<locationmatch "">:相当于Location ~,但一般建议使用此配置进行正则匹配;
如果某要配置其属性的URL能映射到某具体文件系统路径,建议使用。  

8 定义默认主页面

DirectryIndex index.html index.html.var
自左而右,依次匹配

9 日志设定

默认日志目录:/var/log/httpd
错误日志:
  ErrorLog logs/error_log
  LogLevel warn
      debug, info, notice, warn, error, crit, alert, emerg
访问日志:
  CustomLog logs/access_log_combined
  LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    %h:客户端IP地址;
    %l:Remote logname (from identd, if supplied) -表示为空;
    %u:Remote user,(from auth;may be bogus if return status (%s) is 401);
    %t:服务器收到请求的时间;
    %r:请求报文的道行信息;
    %>s:响应状态码;
    %b:响应报文的大小,单位是字节,不包括响应报文首部;
    "%{Referer}i:请求报文中“referer“首部的值;当前资源的访问入口;
    "%{User-Agent}i:请求报文中“User-Agent“首部的值,即发出请求用到的应用程序;
详情请参考:http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

10 路径别名

DocumentRoot "www/htdocs"
  http://server1/download/bash-4.4.2-3.el6.x86_64.rpm
    --> /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm

Alias /alias/ "/PATH/TO/SOMEDIR/" 
意味着访问http://Server_IP/alias时,其页面文件来自于/PATH/TO/SOMEDIR/这个位置
注意:前后路径要一致,结尾都有“/“或者都没有

  Alias /bbs/ "/forum/htdocs"
    http://server1/bbs/index.html
      --> /forum/htdocs/index.html

11 设定默认字符集

AddDefaultCharset UTF-8

GBK,GB2313,GB18030

12 基于用户的访问控制

当你的网站或者站点的某个路径只想让你授权的用户访问时,就可以使用基于用户的访问控制
认证质询:
  WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供帐号和密码;
认证:
  Authorization:客户端用户天如帐号和密码后,再次发送请求报文,认证成功,则服务器发送响应资源
     认证类型:  basic:明文  digest:消息摘要,hash编程后发送,大多浏览器不支持
安全域:需要用户认证后方能访问的路径;
  应该通过名称对其进行标示,并用于告知用户认证的原因;
用户的帐号和密码存储于何处?
  虚拟帐号:仅用于访问某服务器时用到的认证标识;
  存储: 文本文件;SQL数据库;ldap,nis
basic认证:
  (1)定义安全域
    <Directory "">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "STRING"
        AuthUserFile "/PATH/TO/HTTPD_USERPASSWD_FILE"
        Require user username1 username2 ...
    </Directoty>

      允许帐号文件中的所有用户登陆访问: Requie valid-user
  (2)提供帐号和密码存储(文本文件)
    使用htpasswd命令进行管理
      htpasswd [options] passwordfile username
        -c:自动创建passwordfile,因此,仅应该在添加第一个用户时使用;
        -m:md5加密用户密码;
        -s:sha1加密用户密码;
        -D:删除指定用户;
  (3)实现基于组进行认证
    <Directory "">
        Options None
        AllowOverride None
        AuthType Basic
        AuthName "STRING"
        AuthUserFile "/PATH/TO/HTTPD_USERPASSWD_FILE"
        AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"
        Require group GROUP1 GROUP2 ...
    </Directoty>

    要提供:用户帐号文件和组文件;
      组文件:每行定义一个组

基于用户的访问控制

1 使用htpasswd命令生成用户认证库;

这里写图片描述

2 编写配置文件 /etc/httpd/conf/httpd.conf

这里写图片描述

3 创建安全域,即访问目录。最后重新加载服务即可

这里写图片描述

基于组进行认证

1 使用htpasswd命令生成认证库,同上。创建组文件。

这里写图片描述

2 修改配置文件 /etc/httpd/conf/httpd.conf

这里写图片描述

3 创建安全域,即访问目录。最后重新加载服务即可

这里写图片描述

13 虚拟主机

即为一个物理服务器提供多个站点。有三种实现方案:
  基于ip:为每个虚拟主机准备至少一个ip地址;
  基于port:为每个虚拟主机准备至少一个专用port;实践中很少使用;
  基于hostname:为每个虚拟主机准备至少一个专用hostname;

注意:一般虚拟主机不要与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
  禁用中心主机:注释DocumentRoot
NameVirtualHost *:80  #使用基于域名的虚拟主机时需要启动此项,在httpd-2.4中不需要使用

每个虚拟主机都有专用配置:
  <VirtualHost "IP:PORT">
      ServerName
      DocumentRoot ""
  </VirtualHost>

基于ip

1 分别创建安全域目录,并配置主页面。
2 修改配置文件 /etc/httpd/conf/httpd.conf

这里写图片描述

实验效果:分别输入不同的ip,访问到不同的页面。

这里写图片描述
这里写图片描述
基于port

1 创建安全域目录,并配置主页面。
2 修改配置文件 /etc/httpd/conf/httpd.conf

这里写图片描述

实验效果:分别输入ip的不同端口,访问到不同的页面。前提是在listen处打开这个端口。

这里写图片描述
这里写图片描述

基于域名

1 创建安全域目录,并配置主页面。
2 修改配置文件 /etc/httpd/conf/httpd.conf  
3 注意打开修改NameVirtualHost选项!

这里写图片描述
这里写图片描述

实验效果:分别输入不同域名,访问到不同的页面。访问的主机做好域名解析!

这里写图片描述

14 内置的status页面

<Location /server-status>
    SetHandler server-status
    Order dent,allow
    Dent from all
    Allow from 172.25
</Location>

实现:基于帐号实现访问控制

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_36462472/article/details/80033260
今日推荐