美文网首页
Apache和http服务

Apache和http服务

作者: 一桥长书 | 来源:发表于2017-10-15 20:02 被阅读0次

    1 Internet

    Internet 最早来源于美国国防部高级研究计划ARPA建立的AEPANET,1969年投入运行,1983年,ARPnet分裂为两部分:ARPnet和纯军事用的MILNET,当年1月,ARPA把TCP/IP协议作为ARPAnet的标准协议,这个以ARPAnet为主干网的网际互联网便被称为Internet.1986年,美国国家科学基金会建立计算机通信网络NSFnet.从此NSFnet逐渐取代ARPAnet的Internet的地位.1990年,ARPAnet正式关闭
    
    跨Internet的主机间通讯
    在建立通信连接的每一端,进程间的传输有两个标识:
      IP地址和端口号,合称为套接字地址 socket address
      客户端套接字地址定义了一个唯一的客户进程
      服务器套接字地址定义了一个唯一的服务器进程
    

    2 SOCKET概念

    Socket: 套接字,进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换,SocketAPI出现于1983年,4.2 实现
    Socket API: 封装了内核所提供的socket通信相关的系统调用
    Socket Domain: 根据其使用的地址
      AF_INET: addresss Family,IPv4
      AF_INET6: IPv6
      AF_UNIX: 同一主机上不同进程之间通信时使用的
    Socket Type: 根据使用的传输层协议
      SOCK_STREAM: 流,tcp套接字,可靠地传递,面向连接
      SOCK_FGRAM: 数据报,udp套接字,不可靠传递,无连接
      SOCK_RAW: 裸套接字,无须tcp或udp,APP直接通过IP包通信
    
    Socket API 相关的系统调用
      socket(); 创建一个套接字
      bind(); 绑定IP和端口
      listen(); 监听套接字
      accept(); 接受请求
      connect(); 请求连接建立
      write(); 发送消息
      read(); 接受消息
      close(); 关闭连接
    
    python 写的简单的基于socket
    server.py
    import socket
    HOST='127.0.0.1'
    PORT=9527
    BUFFER=4096
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.bind((HOST,PORT))
    sock.listen(3)
    print('tcpServer listen at: %s:%s\n\r' %(HOST,PORT))
    while True:
        client_sock,client_addr=sock.accept()
        print('%s:%s connect' %client_addr)
        while True:
            recv=client_sock.recv(BUFFER)
            if not recv:
                client_sock.close()
                break
            print('[Client %s:%s said]:%s' %(client_addr[0],client_addr[1],recv))
            client_sock.send('tcpServer has received your message')
    sock.close()
    client.py
    import socket
    HOST='127.0.0.1'
    PORT=9527
    BUFFER=4096
    sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    sock.connect((HOST,PORT))
    sock.send('hello, tcpServer!')
    recv=sock.recv(BUFFER)
    print('[tcpServer said]: %s' % recv)
    sock.close()
    

    3 http协议

    http相关的术语
    http: Hyper Text Transfer Protocol,80/tcp
    html: Hyper Text Markup Language 超文本标记语言
    CSS: Cascading Style Sheet 层叠样式表
    js: javascript
    MIME: Multipurpose Internet Mail extensions 多用途互联网邮件扩展
    常用的MIME类型在 /etc/mime.types
      格式: major/minor
        常见类型:
          text/plain 文本文件
          text/html html文件
          text/css css文件
          image/jpeg  jpeg图片文件
          image/png png 文件
          video/mp4 mp4音频文件
          application/javaScript  javascript文件
    
    http工作机制
      http请求: http request
      http相应: http response
      一次http事务: 请求<-->相应
    web资源: web source
      一个网页由多个资源构成,打开一个页面,会有多个资源展示出来,但是每一个资源都要单独请求.因此,一个"web" 页面通常并不是一个单独资源,而是一组资源的集合
      静态文件: 无需服务端做出额外处理
        文件后缀:.jpg, .html, .txt, .js, .css, .mp3, .avi
      后端文件: 服务端执行程序,返回执行的结果
        文件后缀: .asp, .php, .jsp
    
    URI: Uniform Resource Identifier 同一资源标识符,分为URL和URN
    URN: Uniform Resource Naming,统一资源命名,如P2P磁力链接
    URL: Uniform Resource Location,统一资源定位符,用于描述某一服务器特殊资源位置
    两者区别: URL如同一个人的名称,而URL代表一个人的地址.换而言之,URN定义某事物的身份,而URL提供查找该事物的方法.URN仅用于命名,而不指地址
    
    网站访问量
    IP(独立IP):即Internet Protocol,指独立IP.一天内来自相同客户端IP地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
    PV(访问量):即Page View,页面浏览量或点击,用户每一次刷新即被计算一次,pv反应的是浏览某个网站的页面数,pv与来访者数量成正比,pv并不是页面的来访者数量,而是网站被访问的页面数量
    UV(独立访问): 即Unique Visitor,访问网站的一台电脑为一个访客.一天内的客户端被计算一次,可以理解成访问摸个网站的电脑的数量.网站判断来访电脑的身份是通过来访者cookies实现的.如果更换了IP后但不清楚cookies,在访问相同网站,该网站的统计中UV数是不变的
    
    web访问的响应模型(web I/O)
      单进程I/O模型:启动一个进程处理用户请求,而且一次只请求一个,多个请求被串行响应
      多进程I/O模型: 并行启动多个进程,每一个进程响应一个连接请求
      复用I/O结构: 启动一个进程,同事响应N个连接请求
        实现方法: 多线程模型和事件驱动
          多线程模型: 一个进程生成N个线程,每线程响应一个请求
          事件驱动: 一个进程处理N个请求
      复用的多进程I/O模型: 启动M个进程,每一个进程响应N个连接请求,同时接受M*N个请求
    
    一次访问网页的过程
      1 客户端建立连接tcp(三次握手)
      2 服务器端接受请求
        根据服务器端的运行模式(httpd服务的三种工作模式prefork,worker,event
         prefork 就是响应模型中的多进程IO模型
         worker 就是响应模型中的复用多进程IO模型
         event 是worker进程的变种,添加监控机制
      3 根据客户端的请求方法,服务器端处理请求
        http/1.1 常用的请求方法
          GET, POST, HEAD, PUT, DELETE, TRACE, OPTIONS
      4 根据请求进行访问资源
         如果是静态资源,直接找到返回客户端,动态资源,经过处理返回客户端
      5 构建访问报文,以便返回客户端
        1xx 100-101 信息提示
        2xx 200-206 成功类的响应
        3xx 300-305 请求重定向 
        4xx 400-415 错误类信息 客户端错误 如请求的资源不存在
        5xx 500-505 错误类信息 服务器端错误 
        常用的状态码  
          200 成功 请求的所有请求所有数据通过响应报文的entity-bidy 部分发送 ok
          301 请求的URL 指向的资源已经被删除,但在响应报文中通过首部location指明了资源现在所处的新位置:moved permanently
          302 与301相似,但在响应报文中通过location指明资源现在所处临时新位置;found
          304 客户端 发出了条件式请求,但服务器上的资源未曾发生变化,则通过响应状态通知客户端,not modified
          401 资源存在 但是需要输入账号和密码 需要认证 
          403 请求被禁止
          404 访问的资源不存在
          500 服务器内部错误 internal server error
          502 代理服务器后端服务器收到一个伪响应 Bad Gateway
      6 发送响应报文给客户端
      7 记录日志
    
    http 请求报文包括三部分
      开始行,首部行,主体
      <method>  <url> <version>
      字段名: 值
       ...
    
      主体
    
    http 响应报文的三部分
      开始行, 首部行,主体
      <version> <status> <reason-phrase>
      字段名: 值
      ...
      
      主体
    
    httpd介绍
      20世纪90年代初,国家超级计算机应用中心NCSA开发
      1995年开源社区发布apache(a patchy server)
        ASF: Apache Software Foundation apache软件基金会
        FSF: Free Software Foundation 自由软件基金会
    特性:
      高度模块化: core + modules 
      DSO: Dynamic Shared Object 动态共享模块(动态加载)
      MPM: Multi-Processing Module(多路处理模块)
    
    httpd 的主配置文件 /etc/httpd/conf/httpd.conf
    httpd 的辅助配置文件 /etc/httpd/conf.d/*.conf
    
    httpd 模块管理
      默认/usr/sbin/httpd 其使用prefork
      查看静态编译编译的模块
        httpd -l
      查看静态编译及动态加载的模块
        http -M
      修改httpd程序 默认是prefork 模式
        vim /etc/sysconfig/httpd
          HTTPD=/usr/sbin/httpd.{event,worker}
          注意: 需要重新启动生效
    主配置文件
    prefork工作模式的设置
    <IfModule prefork.c>
      StartServers       8
      MinSpareServers    5
      MaxSpareServers   20
      ServerLimit      256 如果 最大连接数大于maxclient 还可以生成的 进程数
      MaxClients       256
      MaxRequestsPerChild  4000 一个子进程 响应多少个之后 停止响应
    </IfModule>
    worker工作模式的设置
    <IfModule worker.c>
      StartServers         4 
      MaxClients         300   最大连接数
      MinSpareThreads     25    最小空闲线程
      MaxSpareThreads     75 最大空闲线程
      ThreadsPerChild     25 每个进程可以启动的线程进数
      MaxRequestsPerChild  0 每一个线程 响应的最大次数 0 表示不限制
    </IfModule>
    
    DSO(Dynamic Share module) 动态加载模块
      配置指令实现模块加载
        LoadModule <mod_name> <mod_path>
        模块路径可使用相对地址,相对于可使用相对地址
        相对于ServerRoot(/etc/httpd)指向的路径而言的
        /etc/httpd/modules/
    
    定义 'Main' server 的文档页面路径起始位置
      DocumentRoot "/var/www/html"
      test/index.html --> http://domain:port/test/index.html
    
    站点访问控制
      可基于两种类型的路径指明对那些资源进行访问控制
      文件系统路径:
        <Directory ""></Direcotory>
        <File ""></File>  可以使用通配符
        <FileMatch ""></FileMatch> 可以使用pattern
      URL 路径
        <Location ""></Location>
        <LocationMatch ""> </LocationMatch>
    访问控制机制 httpd自带两种方式
      基于来源地址 ip 可以伪装 不是太安全
      基于账号
      同时也可以使用satisfy any|all
        any 指地址或用户认证任何一个通过都可以
        all 指地址和用户认证都要通过
    
    Directory的参数
      1 Options  
        所有可以使用的设置 Indexes Includes FollowSymLinksSymLinksifOwnerMatch ExecCGI MultiViews
        Indexs 索引 没有主页面 会把所有东西列出来  别人会把你的源码拖走的
        FollowSymlinks   允许是跟踪符号链接文件
        SymLinksifOwnerMatch  对上一个进行更严的限制  符号链接的文件和原文件 是同一个用户时
        ExecCGI 是否允许 CGI 
        MultiViews  内容协商机制 一般不开启 进行浏览器显示协商 中文 英文
        默认 -indexes  -followsymlinks
      2 AllowOverride all none  是否允许覆盖每目录 的访问控制
        authconfig  关于认证的实现
        Satisfy any 权限控制,ip 和用户账号 有一个验证通过,就可以访问
        设置目录下的.htaccess
        由主配置文件进行<file ^\.ht>order allow,deny deny from all</file> 进行控制
        父目录中的.htaccess设置会影响子目录中的.htaccess设置
      3 基于来源地址访问控制机制
        order 检查次序,后面的先生效
        Order allow,deny  白名单
        Order deny,allow 黑名单
        allow form
        Deny form 
        来源地址
          IP 
          NetAddr 
          172.18
          172.18.0.0
          172.18.0.0/16
          172.18.0.0/255.255.0.0
        <locationmatch "^/bbs/.*\.conf$">
        </locationmatch>
    
    定义默认主页面  
      DirectoryIndex index.html index.html.var 所有
    
    配置httpd 的日志功能
      错误日志
        ErrorLog logs/error_log
        LogLevel 日志级别
          debug,info,notice,warn,error,crit,alert,emerg
      访问日志
        设定的日志设定
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
        LogFormat "%h %l %u %t \"%r\" %>s %b" common
        LogFormat "%{Referer}i -> %U" referer
        LogFormat "%{User-agent}i" agent
        referer  从哪个页面跳转过来的,可以防盗链
        %U url %f filename 磁盘路径的位置
      调用上面的日志格式
        CustomLog logs/access_log combind
    
    路径别名
      DocumentRoot "/www/htdocs"
      http://www.johniu.top/download/bash-4.4.2-3.el6.x86_64.rpm
         -->/www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm
      Alias /URL/ "/path/to/somewhere/" 前后的/ 要对应
      Alias /bbs/ "/forum/htdocs/"   后面的路径为绝对路径 指系统的存在位置
        http://www.johniu.top/bbs/inde.html
          -->http://www.johniu.top/forum/htdocs/index.html
    
    设定默认字符集
      AddDefaultCharset UTF-8  设定默认的字符集
    
    基于用户的访问控制
      认证质询
        WWW-Authenticate 响应码为401 拒绝用户端请求,并说明要求客户端提供账号和密码
      认证
        Authentication 客户端用户填入账号和密码后再次发送请求报文,认证通过,则服务器发送响应的资源
      认证方法
        basic 明文认证方案 http 自己的认证 还有 开发的app 也有认证 表单
        digest 基于消息摘要认证 MD5 加密
      安全域  需要用户认证后方能访问的路径
        应该通过名称对其进行标识,并基于告知用户认证的原因
    
    basic认证 
    1 定义安全域  定义要进行访问控制的设定
    <Directory>
      Options None
      AllowOverride None
      Authtype Basic
      AuthName "String"
      AuthUserFile "/path/to/some/file"
      Require User username1 username2 或者  Require valid-user
    </Directory>
    允许账号文件中的所有账号登录
    Requier valid-user
    2 提供账号和密码文件 文本文件
      使用htpasswd 命令创建 .htpasswd 文件
      htpasswd [option] passwordfile usernaem
        -c 第一次使用 创建 文件
        -m md5 加密用户密码
        -s sha 加密用户密码
        -D username 删除用户
      htpasswd -c -m /etc/httpd/conf.d/.htpasswd username
      htpasswd -m /etc/httpd/conf.d/.htpasswd username
    3 基于组账号认证
    <Directory>
      Options None
      AllowOverride None
      Authtype Basic
      AuthName "String"
      AuthUserFile "/path/to/some/file"
      AuthGroupFile "/path/to/file"
      Require group groupname1,groupname2 
    </Directory>
    要提供 用户账号文件和组文件
      组文件 每一行定义一个组,后面跟用户
      groupname:username1 username2
    
    虚拟主机
      三种方式
        1 基于IP
          为每一个虚拟主机准备至少一个ip地址
        2 基于port
          为每一个虚拟主机至少一个专用的port 实践中很少用 port 一般就是80
        3 基于host  封装 host 请求报文
          可以混合使用上述三个方式中的任意方式
        注意 一般虚拟主机不要和中心主机混用,所以,一般要是用虚拟主机,就先禁用中心主机
        注释 DocumentRoot
    
    每一个虚拟主机都有专用配置
    <VirtualHost IP:PORT>
      ServerName ""
      DocumentRoot  ""
      ServerAlias 虚拟主机别名
      ErrorLog
      CustomLog
      <Directory "">  亦可以做认证
        Options none
        AllowOverride none
        Order deny,allow 黑名单
        Allow from IP/IPnet
        Deny from IP/IPnet
        AuthType basic dgest
        AuthName "String" 提示信息
        AuthUserFile
        AuthGroupFile
        Require group|user
    </Directory>
    </VirtualHost>  
    注意 httpd-2.2 要 使用虚拟主机基于主机名的话 要开启 NameVirtualHost *:80
    httpd-2.4 不需要
    如果开启虚拟主机,中心主机将会失效
    
    内置的status 页面 一般在全局设置 查看服务器的 一些状态信息
    <Location /server-status>
      SetHandler server-status
      Order deny,allow
    Deny from all  一般设置固定的 ip 可以访问这个页面
    Allow from .example.com
    </Location>
    可以修改 ExtendedStatus On 查看更多的详细信息
    
    可以通过curl http://ip/server-status echo $0 来查看服务器是否运行正常
    
    welcome.conf 的设置
      可以设置根的错误进行定义错误回复的页面
    

    相关文章

      网友评论

          本文标题:Apache和http服务

          本文链接:https://www.haomeiwen.com/subject/kgtmyxtx.html