Linux入门攻坚——25、Web Service基础知识与httpd安装配置

网络体系结构现在主要有OSI的七层协议和TCP/IP协议,其对应关系如下:

资源子网主要是用户进程,运行于用户空间,关注点是应用上的细节,通信子网运行于内核空间,关注通信细节。传输层是确保进程到进程间通信,IP地址是确保主机到主机通信,MAC地址是确保设备到设备通信。主机到主机与设备到设备有何不同呢?主要是网络中间要经过多台网络设备,如交换机、路由器等,MAC地址是确保在两台网络设备间通信的。当然,在这个概念里,主机也是一台设备。

应用层实现应用协议,主要运行于用户空间,像前面学到的dns,ssh都是应用层协议,本事是一种协议,而这种协议的实现需要一个载体,这就是bind和openssh。因为应用层应该关注的是本身的实现,其要与其他主机通信,只需要调用通信子网功能就可以了,套接字就是为了简化这种调用而实现的功能,起到一个上下沟通的作用。Socket是IPC的一种实现,允许位于不同主机(甚至同一主机)上不同进程之间进行通信。

Socket有三种类型:
  tcp套接字:SOCK_STREAM
  udp套接字:SOCK_DGRAM
  裸套接字(不借助tcp、udp,直接用IP):SOCK_RAW

套接字,不是很精确的说法就是IP+端口的组合。

端口:tcp和udp协议端口号都是0~65535
0~1023:众所周知,永久分配给固定应用使用,22/tcp(ssh)、80/tcp(http)、443/tcp(https);
1024~41951:注册端口,要求不是特别严格,分配给程序注册为某应用使用,3306/tcp(mysql);
41952+:客户端程序随机使用的端口(内核随机分配),叫做动态端口或私有端口;其范围的定义:/proc/sys/net/ipv4/ip_local_port_range;

TCP协议特性:

  •   建立连接:三次握手
  •   将数据打包成段:校验和(CRC-32)
  •   确认、重传以及超时;
  •   排序:逻辑序号
  •   流量控制:快发慢收时;通过滑动窗口算法实现。(主要针对主机的接收能力)
  •   拥塞控制:慢启动和拥塞避免算法;(主要针对网络带宽)

Socket Domain:(根据其所使用的地址进行的另一种分类方法)

  •   AF_INET:Address Family,IPv4
  •   AF_INET6:IPv6
  •   AF_UNIX:同一主机上不同进程间通信使用

  每类套接字都至少提供了两种socket:流和数据报,即tcp和udp
    流:可靠地传递、面向连接、无边界;
    数据报:不可靠传递、有边界、无连接;

套接字相关的系统调用:
  socket():创建一个套接字(相当于创建一个模板);
  bind():绑定(即将上一步的模板进行填充,与特定IP和端口联系起来)
  listen():监听
  accept():接收请求
  connect():请求连接建立(一般是客户端发起)
  write():发送数据,即向套接字写数据
  read():接收数据,即从套接字读数据(从缓冲读)
      send()、recv()、sendto()、recvfrom()

HTTP协议:Hyper Text Transfer Protocol,其实现监听于80端口
  html:编程语言,超文本标记语言;
  MIME:Multipurpose Internet Mail Extensions(将非文本格式数据转换成文本格式传输后在转换回非文本数据)

工作机制:
  http请求
  http响应

 

Web资源:web resource
  静态文件:.html,.jpg
  动态文件:在服务器中执行后才能形成最终结果,.php,.jsp

  媒体:媒体类型(MIME类型):major/minor
    text/html、text/plain、image/jpeg、image/gif

  URI:Uniform Resource Identifier,统一资源标识符
    URL:Uniform Resource Locator,统一资源定位符,是URI的子集,用于描述某服务器某特定资源的位置。
      Scheme://Server:port/path/to/resource,(path/to/resource最终通过映射,映射到具体文件系统中的特定文件)
  URN:Uniform Resource Naming,统一资源命名符

HTTP协议版本:
  HTTP/0.9:原型版本
  HTTP/1.0:第一个广泛使用的版本,支持MIME
  HTTP/1.1:增强了缓存功能
  spdy:Google开发的基于TCP的会话层协议,SPDY是对HTTP协议的增强。
  HTTP/2.0:

一次完整的http请求过程:
  (1)建立或处理连接;
  (2)接收请求,接收来自于网络的请求报文中对某资源的一次请求的过程。
    并发访问响应模型(Web I/O):
      单进程I/O结构:只启动一个进程处理用户请求,而且一次只处理一个,多个请求被串行响应;
      多进程I/O结构:并行启动多个进程,每个进程响应一个请求;
      复用I/O结构:一个进程响应n个请求;
          多线程模型:一个进程生成n个线程,每个线程响应一个用户请求;
          事件驱动机制,event-driven:基于事件回调机制,进行事件状态的追踪。
      复用的多进程I/O结构:启动多个进程,每个进程响应n个请求;
  (3)处理请求:对请求报文进行解析,并获取请求的资源及请求方法等相关信息。
    元数据:请求报文首部
      <method> <URL> <VERSION>
      host:请求的主机名称
      Connection:
  (4)访问资源:获取请求报文中请求的资源。
    web服务器,即存放了web资源的服务器,负责向请求者提供对方请求的静态资源,或动态运行后生成的资源,这些资源放置于本地文件系统某路径下,此路径通常称为DocRoot
      /var/www/html/
        images/1.jpg
    http://www.test.com/images/1.jpg
    web服务器资源路径映射方式:
        a)docroot
        b)alias
        c)虚拟主机docroot
        d)用户家目录docroot
  (5)构建响应报文;
     资源的MIME类型:
        显式分类、魔法分类、协商分类
      URL重定向:
        web服务构建的响应并非客户端请求的资源,而是资源的另外一个访问路径;
  (6)发送响应报文;
  (7)记录日志;

http服务器程序
  httpd(apache)、nginx、lighttpd
  应用程序服务器:IIS、tomcat、jetty,jboss,resin
  webshpere,weblogic,oc4j

httpd的安装配置和使用
  httpd:apache

httpd的特性
  高度模块化设计:core + modules
  DSO:Dynamic Shared Object,动态共享对象
  MPM:多路(道)处理模块,Multipath  Processing Module。事先创建进程,按需维持适当的进程
      prefork:多进程模型,每个进程响应一个请求;进程模型,两级结构,主进程master负责生成子进程,每个子进程负责响应一个请求。
        一个主进程,负责生成n个子进程,子进程也称为工作进程,每个子进程处理一个用户请求;即使没有用户请求,也会预先生成多个空闲进程,随时等待请求到达;最大不会超过1024个;主进程负责监听80端口和接收请求,但不负责处理请求,交给子进程处理。主进程的是监听套接字,子进程的是连接套接字。        
      worker:多线程模型(多进程生成),每个线程响应一个请求;一个主进程生产多个子进程,每个子进程负责生成多个线程,每个线程响应一个请求。m进程,n线程:m*n个请求。
        线程模型,三级结构,主进程master负责生成子进程,每个子进程负责生成多个线程,每个线程响应一个请求。
  event:事件驱动模型,一个线程响应多个请求。每个线程响应N个请求;一个主进程生成m个子进程,每个子进程负责n个请求。
        线程模型,三级结构,主进程master负责生成子进程,每个子进程响应多个请求(有一个监控线程)监听线程。
    httpd-2.2:event为测试使用
    httpd-2.4:event可生产使用

  支持运行时配置,支持单独编译模块
  支持多种方式的虚拟主机配置

虚拟主机:  物理服务器一台,  Web程序一个,却可以服务多个不同的站点
Socket   IP:Port  
基于IP的虚拟主机;基于端口的虚拟主机;基于域名的虚拟主机

httpd的安装配置

CentOS 6 :2.2
CentOS 7 : 2.4

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

  配置文件的组成:主配置文件/etc/httpd/conf/httpd.conf
    [root@study610-f1 CentOS]# grep "Section" /etc/httpd/conf/httpd.conf 
    ### Section 1: Global Environment
    ### Section 2: 'Main' server configuration
    ### Section 3: Virtual Hosts
  配置格式:directive value
    directive:不区分字符大小写;
    value:为路径时,取决于文件系统;

常用配置
  1、修改监听的IP和Port:Listen [IP:]PORT
    忽略IP表示监听本机所有IP;Listen可重复出现多次;
  2、持久连接:
    Persistent Connection:连接建立,每个资源取完后不会断开连接,而是继续等待其他的请求完成;
    如何断开?数量限制:100;时间限制:可配置
    副作用:对并发访问量较大的服务器,持久连接功能会使有些请求得不到响应;
    折衷:使用较短的持久连接时间;
    httpd-2.4 支持毫秒级持久时间
    非持久连接:
    KeepAlive on|off  、 MaxKeepAliveRequests #   、KeepAliveTimeout #
    测试:
      telnet HOST PORT
      GET / HTTP/1.1
      Host:HOSTNAME or IP

  3、MPM
    prefork,worker,event
    httpd-2.2不支持同时编译多个模块,所以只能编译时选定一个:rpm安装的包提供三个二进制程序文件,分别用于实现对不同MPM机制的支持;确认方法:
      ps aux | grep httpd
    默认为/usr/sbin/httpd,其使用prefork模型
    查看模块列表:httpd -l,查看静态编译的模块

    查看静态编译及动态装载的模块:httpd -M
  更换使用的httpd程序:编辑/etc/sysconfig/httpd
    #HTTPD=/usr/sbin/httpd.worker
  修改成httpd.worker或httpd.event,重新启动就可以了。
  prefork的配置:/etc/httpd/conf/httpd.conf

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers       8   # 服务启动时启动的服务器进程数
MinSpareServers    5   # 最小空闲服务器进程数
MaxSpareServers   20   # 最大空闲进程数
ServerLimit      256   # 
MaxClients       256   # 最大并发请求数量
MaxRequestsPerChild  4000 # 每个进程最大处理的请求数量
</IfModule>

worker的配置:

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers         4
MaxClients         300
MinSpareThreads     25
MaxSpareThreads     75 
ThreadsPerChild     25
MaxRequestsPerChild  0
</IfModule>

网站评测:
  PV:Page View,UV:User View,独立IP量;

  4、DSO机制,Dynamic Shared Object,/usr/lib64/httpd/modules
    配置指令实现模块加载:LoadModule <mod_name> <mod_path>
    模块路径可使用相对地址:
        相对于ServerRoot(其值为/etc/httpd)指向的路径而言,ServerRoot在/etc/httpd/conf/httpd.conf中定义,模块的路径为:/etc/httpd/modules/
    如:LoadModule auth_basic_module modules/mod_auth_basic.so
    就是加载/etc/httpd/modules/mod_auth_basic.so
    /etc/httpd/modules/usr/lib64/httpd/modules是同一个位置,是一个硬链接。

  5、定义“Main”server的文档页面路径, DocumentRoot   
    文档路径映射:
       DocumentRoot指向的路径为URL路径的起始位置:
        DocumentRoot  “/var/www/html”
          test/index.html --> http://HOST:PORT/test/index.html  用户访问路径
          test/index.html --> /var/www/html/test/index.html    文件系统路径
      修改DocumentRoot测试,先关闭SELINUX:修改/etc/httpd/conf/httpd.conf

  6、站点访问控制,可基于两种类型的路径指明对哪些资源进行访问控制:
    文件系统路径:
        <Directoty ""> </Directory>
        <File ""> </File>
        <FileMatch ""> </FileMatch>

    URL路径:
        <Location ""> </Location>
        ......
    访问控制机制:
        基于来源地址:
        基于用户账号:

  7、Directory中“基于来源地址”实现访问控制
      (1)Options
        所有可用特性:Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
        None,All
        Indexes:索引,没有定义DirectoryIndex,则列出目录下所有文件,很危险的行为,对于下载站很适用。不定义,则拒绝。
实操:
httpd.conf中修改<Directory "/var/www/html"></Directory>如下:
<Directory "/www/htdocs">
    Options Indexes FollowSymLinks
    AllowOverride None       # 是否覆盖目录下的.htaccess定义的访问权限
    Order allow,deny
    Allow from all
</Directory>


将 Options Indexes FollowSymLinks中的indexes去掉,改为 Options  FollowSymLinks,重新加载后再次访问:

        FollowSymLinks:允许跟踪符号链接文件访问,如ln -sv /etc/issue /www/htdocs/issue.html,用户可访问issue.html,否则拒绝访问。
实操:


将Options  FollowSymLinks改为Options None

      (2)基于来源地址的访问控制机制
        Order:检查次序
          Order allow,deny  白名单,后面的deny是默认处理动作
          Order deny,allow 黑名单
        Allow from
        Deny from
        来源地址:
          IP:
          NetAddr:172.16 、172.16.0.0  、172.16.0.0/16 、172.16.0.0/255.255.0.0
  实操:
    Order allow,deny
    Allow from 192.168.138.137
从137主机访问:

其他主机访问:

  8、定义默认主页面
        DirectoryIndex index.html index.html.var   # 可定义多个,从左往右依次查找,没有找到且Options定义了indexes,则列出目录下的所有文件。

  9、日志设定
    错误日志:
       ErrorLog logs/error_log,是相对路径,相对ServerRoot,即/etc/httpd目录,即/etc/httpd/logs目录,此目录文件是/var/log/httpd的软链接文件。
       LogLevel warn
       几种级别: debug、info、notice、warn、error、crit、alert、emerg
    访问日志:
      CustomLog logs/access_log combined#combined是格式名,定义日志格式,用LogFormat定义,默认配置文件中还定义了common,referer,和agent:
      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
      %t:服务器接收到请求的时间
      %r:First line ofrequest,请求报文的首行信息(method url version)
      %>s:响应状态码;
      %b:响应报文的大小,单位是字节,不包含响应报文首部;
      %{Referer}i:请求报文当中“referer”首部的值;当前资源的访问入口,即从哪个页面中的超链接跳转而来的;
      %{User-Agent}i:请求报文当中“User-Agent”首部的值;即发出请求用到的应用程序;

  10、路径别名
    DocumentRoot  “/www/htdocs”
      http://www.mytest.com/download/soft.rar ---> /www/htdocs/download/soft.rar   路径映射
    Alias   /URL/   "/PATH/TO/SOMEDIR/"
      Alias  /bbs/  "/forum/htdocs"
      http://www.mytest.com/bbs/index.html --> /forum/htdocs/bbs/index.html  别名
实操:
    在/www/htdocs下创建bbs目录,其下创建index.html,访问:http://192.168.138.139/bbs/index.html

    在/etc/httpd/conf/httpd/conf中增加:Alias /bbs/ "/forum/htdocs/"
    创建/forum/htdocs目录,在此目录下创建index.html。同样访问:http://192.168.138.139/bbs/index.html

  11、设定默认字符集
    AddDefaultCharset UTF-8   字符集还可以是GBK、GB2312、GB18030

  12、基于用户的访问控制
    认证质询:
      WWW-Authenticate:响应码为401,拒绝客户端请求,并说明要求客户提供账号和密码;
    认证:
      Authorization:客户端用户填入账号密码后再次发送请求报文:认证通过,则服务器发送响应的资源;
    认证类型:basic——明文; digest——消息摘要;
    安全域:需要用户认证后才能访问的路径;
      应该通过名称对其进行标识,并用于告知用户认证的原因;
    用户的账号和密码存储位置:
      虚拟账号:仅用于访问某服务时用到的认证标识;
      存储于:文本文件、SQL数据库、ldap、nis

    basic认证:
      1)定义安全域
        <Directory "">
          Options None
          AllowOverride None
          AuthType Basic
          AuthName "STRING"
          AuthUserFile "/PATH/TO/HTTPD_USER_PASSWORD_FILE"
          Require user username1 username2 ......
        </Directory>
        允许账号文件中的所有用户登录访问:       Require 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_USER_PASSWORD_FILE"
          AuthGroupFile “/PATH/TO/HTTPD_GROUP_FILE”
          Require group group1 group2 ......
        </Directory>
      要提供:用户账号文件和组文件:
        组文件:每行定义一个组:GRP_NAME:user1 user2 user3 .......

实操:
    <1>创建目录及文件:/www/htdocs/admin目录及index.html文件

    <2>在配置文件/etc/httpd/conf/httpd.conf中配置定义域:

    <3>测试访问http://192.168.138.139/admin/index.htnl,需要用户和密码了:

访问其他路径则不需要用户密码。
    <4>创建用户、密码文件,使用htpasswd命令工具:

再次测试:
测试指定具体可登陆用户名,将配置文件中的:require valid-user改为require user tom

使用jerry无法登录,使用tom可以登录

    <5>基于组进行认证:
    修改配置文件:

添加一个用户test1,创建组文件/etc/httpd/conf.d/.htgroup

即允许webadmin组的用户登录访问/admin下的资源。
测试访问:test1和jerry可以访问,tom不可以访问。

  13、虚拟主机
    有三种实现方案:
      基于IP:为每个虚拟主机准备至少一个ip地址;
      基于端口:为每个虚拟主机准备至少一个专用port;实践中很少使用;
      基于hostname(主机名):为每个虚拟主机至少准备一个专用hostname;
    可混合使用上述三种方式中任意方式;
    注意:一般虚拟主机不要与中心主机混用,所以,要使用虚拟主机,先禁用中心主机;
      禁用中心主机:注释掉DocumentRoot
    每个虚拟主机都有专用配置:
      <VirtualHost "IP:PORT">
        ServerName
        DocumentRoot “”
      </VirtualHost>

    ServerAlias:虚拟主机的别名:
    ErrorLog
    CustomLog
    <Directory ""></Directory>

实操:
   1) 基于IP
    先注释掉主服务器的DocumentRoot,配置虚拟主机项:

检测语法是否错误,创建相关目录、文件

主机增加增加IP:

服务重载后测试访问:

  2)基于端口的虚拟主机:配置文件修改


    3)基于hostname
先在配置文件中启用NameVirtualHost *:80配置项

测试:客户端修改hosts文件:

访问测试:

    4)测试日志:

  14、内置的status页面
      配置文件:

此时访问http://192.168.138.139/server-status:显示服务器的状态信息

配置文件中配置:ExtendedStatus On,将看到更多服务器状态:

对这个URL进行认证保护,配置方法:

  • 13
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值