linux学习43-HTTP服务和APACHE2

2023-05-16

HTTP服务和APACHE2

知识点

  • 请求报文响应报文
  • 错误码
  • 请求重定向
  • 编译安装
  • 实现https
  • curl工具

1. http协议

  • http协议版本
    http/0.9, http/1.0, http/1.1(较多), http/2.0(将来)

  • http协议无状态

    1. stateless 无状态
      服务器无法持续追踪访问者来源
    2. 解决http协议无状态方法
      1. cookie:客户端存放
      2. session:服务端存放
        多服务器session解决方案
        1. 在调度器中记录cookie的id,始终将其分配到第一次访问的服务器
        2. 让服务器之间复制session信息,每台服务器都存放所有服务器的session
        3. 搭专用的session服务器(用到redis),需要实现主从,提高容错
  • 协议查看或分析的工具
    tcpdump,wireshark,tshark

  • http事务一次访问的过程

    1. 请求:request

      1. HTTP请求报文图示
        在这里插入图片描述
      2. request报文语法格式
        <method> <request-URL> <version>
        <headers>
        
        <entity-body>
        
    2. 响应:response

      1. HTTP响应报文图示
        在这里插入图片描述
      2. response报文语法格式:
        <version> <status> <reason-phrase>
        <headers>
        
        <entity-body>
        
    3. 参数说明

      1. method (获取服务器支持的动作curl -i -x OPTIONS
        请求方法,标明客户端希望服务器对资源执行的动作GET、HEAD、POST等
        1. GET:从服务器获取一个资源
        2. HEAD:只从服务器获取文档的响应首部,相当于
        3. POST:向服务器输入数据,通常会再由网关程序继续处理
        4. PUT:将请求的主体部分存储在服务器中,如上传文件
        5. DELETE:请求删除服务器上指定的文档
        6. TRACE:追踪请求到达服务器中间经过的代理服务器
        7. OPTIONS:请求服务器返回对指定资源支持使用的请求方法
      2. version
        http协议版本:HTTP/<major>.<minor>
      3. status:
        三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况
      4. reason-phrase
        状态码所标记的状态的简要描述
      5. headers
        每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟一个可选空格,接着是一个值
      6. entity-body
        请求时附加的数据或响应时附加的数据
  • http协议状态码(status)分类

    1. 1xx:100-101 信息提示
    2. 2xx:200-206 成功
      1. 200
        成功,请求数据通过响应报文的entity-body部分发送;OK
    3. 3xx:300-305 重定向
      1. 301
        请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently
      2. 302
        响应报文Location指明资源临时新位置 Moved Temporarily
      3. 304
        客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;客户端上有缓存,直接从缓存返回结果;Not Modified
    4. 4xx:400-415 错误类信息,客户端错误
      1. 401
        需要输入账号和密码认证方能访问资源;Unauthorized
      2. 403
        请求被网站禁止,不是防火墙禁止访问;Forbidden
      3. 404
        服务器无法找到客户端请求的资源;Not Found
    5. 5xx:500-505 错误类信息,服务器端错误
      1. 500
        服务器内部错误;Internal Server Error
      2. 502
        代理服务器从后端服务器收到了一条伪响应,如无法连接到网关;Bad Gateway
      3. 503
        服务不可用,临时服务器维护或过载,服务器无法处理请求
      4. 504
        网关超时 Gateway Time-out
  • HTTP 首部字段(headers)
    首部字段同时存在于请求和响应报文内,并涵盖 HTTP 报文相关的内容信息。使用首部字段是为了给客服端和服务器端提供报文主体大小、所使用的语言、认证信息等内容

    1. 首部字段结构
      HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号“:”分隔,字段值对应单个 HTTP 首部字段可以有多个值
      报文首部中出现了两个或以上具有相同首部字段名的首部字段时,在规范内尚未明确,根据浏览器内部处理逻辑的不同,优先处理的顺序可能不同,结果可能并不一致
    2. 首部的分类
      1. 通用首部
        请求报文和响应报文两方都会使用的首部

        首部字段描述
        Date报文的创建时间
        Connection连接状态,如keep-alive, close
        Via显示报文经过的中间节点(代理,网关),用于排除,查看哪个缓存服务器不能访问
        Cache-Control控制缓存,如缓存时长
        MIME-Version发送端使用的MIME版本
        Warning错误通知
      2. 请求首部
        从客户端向服务器端发送请求报文时使用的首部。补充了请求的附加内容、客户端信息、请求内容相关优先级等信息

        首部字段描述
        Accept通知服务器自己可接受的媒体类型
        Accept-Charset客户端可接受的字符集
        Accept-Encoding客户端可接受编码格式,如gzip
        Accept-Language客户端可接受的语言
        Client-IP请求的客户端IP
        Host请求的服务器名称和端口号
        Referer跳转至当前URI的前一个URL
        User-Agent客户端代理,浏览器版本

        条件式请求首部

        首部字段描述
        Expect允许客户端列出某请求所要求的服务器行为
        If-Modified-Since自从指定的时间之后,请求的资源是否发生过修改
        If-Unmodified-Since与上面相反
        If-None-Match本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配
        If-Match与上面相反

        安全请求首部

        首部字段描述
        Authorization向服务器发送认证信息,如账号和密码
        Cookie客户端向服务器发送cookie
        Cookie2用于说明请求端支持的cookie版本

        代理请求首部

        首部字段描述
        Proxy-Authorization向代理服务器认证
      3. 响应首部
        从服务器端向客户端返回响应报文时使用的首部。补充了响应的附加内容,也会要求客户端附加额外的内容信息
        信息性

        首部字段描述
        Age从最初创建开始,响应持续时长
        Server服务器程序软件名称和版本

        协商首部:某资源有多种表示方法时使用

        首部字段描述
        Accept-Ranges服务器可接受的请求范围类型
        Vary服务器查看的其它首部列表

        安全响应首部:

        首部字段描述
        Set-Cookie向客户端设置cookie
        Set-Cookie2以上面相似
        WWW-Authenticate来自服务器对客户端的质询列表
      4. 实体首部
        针对请求报文和响应报文的实体部分使用的首部。补充了资源内容更新时间等与实体有关的的信息

        首部字段描述
        Allow列出对此资源实体可使用的请求方法
        Location告诉客户端真正的实体位于何处
        Content-Encoding对主体执行的编码
        Content-Language理解主体时最适合的语言
        Content-Length主体的长度
        Content-Location实体真正所处位置
        Content-Type主体的对象类型,如text

        缓存相关:

        首部字段描述
        ETag实体的扩展标签
        Expires实体的过期时间
        Last-Modified最后一次修改的时间
      5. 扩展首部

  • HTTP 无状态及解决方案 Cookie
    协议自身不对请求和响应之间的通信状态进行保存。也就是说在 HTTP 这个级别,协议对于发送过的请求或响应都不做持久化处理。这是为了更快地处理大量事务,确保协议的可伸缩性,而特意把 HTTP 协议设计成如此简单的。可是随着 Web 的不断发展,很多业务都需要对通信状态进行保存。于是引入了 Cookie 技术。

    1. Cookie 技术
      使用 Cookie 的状态管理Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。Cookie 会根据从服务器端发送的响应报文内的一个叫做 Set-Cookie 的首部字段信息,通知客户端保存Cookie。
      当下次客户端再往该服务器发送请求时,客户端会自动在请求报文中加入 Cookie 值后发送出去。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息
      1. cookie过期时间
        1. 会话cookie
          生命期在浏览器会话期间,关闭浏览器此cookie就会消失,一般不存储在硬盘上而是保存在内存里,当然这种行为并不是规范规定的。
        2. 持久性cookie
          若设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie仍然有效直到超过设定的过期时间,存储在硬盘上的cookie可以在不同的浏览器进程间共享
      2. 安全性
        1. 隐患
          在Web应用中,Cookie常用来标记用户或授权会话。因此,如果Web应用的Cookie被窃取,可能导致授权用户的会话受到攻击,例如跨站请求伪造(CSRF)

          跨站请求伪造(CSRF)
          如在不安全聊天室或论坛上的一张图片,它实际上是一个给你银行服务器发送提现的
          当你打开含有了这张图片的HTML页面时,如果你之前已经登录了你的银行帐号并且Cookie仍然有效(还没有其它验证步骤),你银行里的钱很可能会被自动转走。

        2. 应对方法
          1. 对用户输入进行过滤阻止XSS
          2. 任何敏感操作都需要确认
          3. 用于敏感信息的cookie只能拥有较短的生命期
      3. Set-Cookie首部字段
        1. 示例
          Set-Cookie: status=enable; expires=Fri, 24 Nov 2017 20:30:02 GMT; path=/;
          
        2. 键值描述
          1. NAME=VALUE
            赋予 Cookie 的名称和其值,此为必需项
          2. expires=DATE
            Cookie 的有效期,若不明确指定则默认为浏览器关闭前为止
          3. path=PATH
            将服务器上的文件目录作为Cookie的适用对象,若不指定则默认为文档所在的文件目录
          4. domain=域名
            作为 Cookie 适用对象的域名,若不指定则默认为创建 Cookie的服务器的域名
          5. Secure
            Cookie只应通过被HTTPS协议加密过的请求发送给服务端,因为Cookie有其固有的不安全性,敏感信息也不应该通过Cookie传输
          6. HttpOnly
            加以限制使 Cookie 不能被 JavaScript 脚本访问
        3. cookie实现过程示例
          安装php软件,提供httpd动态页面处理
          [root@hai7-6 conf]$yum install php
          
          编写一个cookie
          [root@hai7-6 html]$vim /var/www/html/setcookie.php
          <?php                          <==php语句块关键字
          setcookie('title','cto');      <==setcookie为系统函数,用于设置cookie的键值对
          setcookie('name','wang',time()+3600*12);   <==time()为系统函数,表示当前时间,+3600*12表示有效期有12小时
          ?>
          
          将浏览器中的cookie清空,以chrome为例,设置→高级设置→内容设置→cookie→查看所有cookie和网站数据,在网页访问http://localhost/setcookie.php
          http://192.168.50.107/setcookie.php	
          
          在网页设置中查看所有cookie和网站数据,会有如下界面,就是setcookie.php设置的cookie值
          在这里插入图片描述
    2. 服务器端session
      服务器端记录用户状态的机制,用户与服务器建立连接的同时,服务器会自动为其分配一个SessionId,此ID以cookie的键值形式发送给用户(key为JSSIONID,value为ID)
      session用于存储用户会话所需的属性及配置信息,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去
    3. cookie和session区别
      1. cookie是存放在客户端,session存放在服务器
      2. cookie通常有大小限制(常见4k)以及数量限制(部分浏览器为20个),session大小和硬件有关,通常没有规定大小

2. curl工具和elinks工具

  • curl工具
    基于URL语法在命令行方式下工作的文件传输工具,它支持FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE及LDAP等协议。
    curl支持HTTPS认证,并且支持HTTP的POST、PUT等方法, FTP上传, kerberos认证,HTTP上传,代理服务器,cookies,用户名/密码认证, 下载文件断点续传,上载文件断点续传, http代理服务器管道( proxy tunneling),还支持IPv6,socks5代理服务器,通过http代理服务器上传文件到FTP服务器等,功能十分强大

    1. 语法格式
      curl [options] [URL…]
    2. 常用选项
      1. -A/--user-agent <string>:设置用户代理发送给服务器
        1. 正常访问网站,会在日志文件中记录使用的浏览器
        [root@hai6  ~]$curl http://192.168.50.107
        在日志中显示的信息为
        "curl/7.19.7 (x86_64-redhat-linux-gnu)"
        2. 增加-A,指定浏览器为IE100
        [root@hai6  ~]$curl -A 'IE100' http://192.168.50.107
        在日志中显示的信息为
        "IE100"
        	```
        
      2. -e/--referer <URL>:来源网址,伪造跳转网站
        1. 在访问时增加-e,会伪造指定的跳转地址
        [root@hai6  ~]$curl -A 'IE100'  -e 'www.baidu.com' http://192.168.50.107
        2. 在访问日志文件referer行就会添加www.baidu.com
        "www.baidu.com" "IE100"
        
      3. --cacert <file>: CA证书 (SSL)
      4. -k/--insecure :允许忽略证书进行 SSL 连接
      5. --compressed: 要求返回是压缩的格式,需要服务器端支持压缩
      6. -H/--header <line>:自定义首部信息传递给服务器
        指定主机头HOST:www.a.com,实际访问的为www.c.com
        [root@hai6  ~]$curl -H "host: www.c.com"  www.a.com
        
      7. -i:显示页面内容,包括报文首部信息
      8. -I/--head: 只显示响应报文首部信息
      9. -D/--dump-header <file>:将url的header信息存放在指定文件中
      10. --basic: 使用HTTP基本认证
      11. -u/--user <user[:password]>:设置服务器的用户和密码
      12. -L:如果有3xx响应码,重新发请求到新位置
        1. '当访问网站被跳转时,使用curl正常访问只会返回网站被跳转信息'
        [root@hai6  ~]$curl www.taobao.com
        <p>The requested resource resides temporarily under a different URI.</p>
        2. '加上-L会显示跳转后的页面'
        [root@hai6  ~]$curl -L  www.taobao.com
        
      13. -O: 使用URL中默认的文件名保存文件到本地
      14. -o <file>:将网络文件保存为指定的文件中,不可以下载二进制文件,可能会出错
      15. --limit-rate <rate>: 设置传输速度
      16. -0/--http1.0: 指定使用HTTP 1.0
      17. -v/--verbose: 更详细
      18. -C:选项可对文件使用断点续传功能
      19. -c/--cookie-jar <file name>: 将url中cookie存放在指定文件中
      20. -x/--proxy <proxyhost[:port]>:指定代理服务器地址
      21. -X/--request <command>: 向服务器发送指定请求方法
        [root@hai6  ~]$curl -I -X OPTIONS 192.168.50.107
        Allow: GET,HEAD,POST,OPTIONS,TRACE
        
      22. -U/--proxy-user <user:password>: 代理服务器用户和密码
      23. -T: 选项可将指定的本地文件上传到FTP服务器上
      24. --data/-d:方式指定使用POST方式传递数据
      25. -b name=data: 从服务器响应set-cookie得到值,返回给服务器
  • elinks工具

    1. 安装服务包
      yum -y install elinks
      
    2. 语法格式
      elinks [OPTION]… [URL]…
    3. 参数
      1. -dump:非交互式模式,将URL的内容输出至标准输出
      2. -source:打印源码

3. mod_deflate模块

mod_deflate模块提供DEFLATE输出过滤器,运行在通过网络发送到客户端之前压缩来自服务器的输出

  • 适用场景:

    1. 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持
    2. 压缩适于压缩的资源,例如文本文件
  • 可以压缩常见的基于文本的内容类型

    AddOutputFilterByType DEFLATE |text/html |text/plain |text/xml |text/css |text/javascript| application/javascript|
    
  • 查看模块是否已加载

    [root@hai7-6 html]$httpd -M |grep  deflate
     deflate_module (shared)   <==加载状态
    
  • 加载模块配置方法
    LoadModule deflate_module modules/mod_deflate.so

  • 将压缩限制为特定的MIME类型,使用AddOutputFilterByType指令

    <Directory "/your-server-root/manual">    <==授权目录
    AddOutputFilterByType DEFLATE text/html   <==限定需要压缩的类型
    </Directory>
    
  • 压缩级别Level of compression (Highest 9 - Lowest 1)
    DeflateCompressionLevel 9

  • 排除特定旧版本的浏览器,不支持压缩

    1. Netscape 4.x 只压缩text/html
      BrowserMatch  ^Mozilla/4  gzip-only-text/html
      
    2. Netscape 4.06-08三个版本 不压缩
      BrowserMatch ^Mozilla/4\.0[678] no-gzip
      
    3. Internet Explorer标识本身为“Mozilla / 4”,但实际上是能够处理请求的压缩。如果用户代理首部匹配字符串“MSIE”(“B”为单词边界”),就关闭之前定义的限制
      BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
      
  • 示例:将text/html格式的文件输出时压缩压缩,配置如下

    SetOutputFilter DEFLATE                        
    # Restrict compression to these MIME types  
    AddOutputFilterByType DEFLATE text/html     <==支持压缩的格式,可以自定义选择
    

4. 加密访问https(http over ssl)

Apache一个IP地址只支持一次加密,虚拟主机FQDN方式只能加密一个

  • SSL会话的简化过程

    1. 客户端发送可供选择的加密方式,并向服务器请求证书
    2. 服务器端发送证书以及选定的加密方式给客户端
    3. 客户端取得证书并进行证书验证(如果信任给其发证书的CA)
      1. 验证证书来源的合法性;用CA的公钥解密证书上数字签名
      2. 验证证书的内容的合法性:完整性验证
      3. 检查证书的有效期限
      4. 检查证书是否被吊销
      5. 证书中拥有者的名字,与访问的目标主机要一致
    4. 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换
    5. 服务用此密钥加密用户请求的资源,响应给客户端
  • https实现过程

    1. 配置httpd支持使用ssl,及使用的证书,需要安装mod_ssl,使httpd支持加密模块
      [root@hai7115 ~]$yum -y install mod_ssl
      
    2. 搭建私有CA(在生产中是需要向权威机构申请证书的)
      1. 在预搭建CA主机A上申请私钥,必须放在 private/下,必须叫cakey.pem,因为有配置文件定义,所以要按规范写
        进入CA目录
        [root@hai7115 ~]$cd /etc/pki/CA
        [root@hai7115 CA]$(umask 077;openssl genrsa -out private/cakey.pem 2048)
        
      2. 自签名证书,生成的证书必须放在当前/etc/pki/CA目录
        [root@hai7115 CA]$openssl req -new -x509 -key private/cakey.pem  -out cacert.pem
        
      3. 创建颁发系列号
        [root@hai7115 CA]$touch index.txt
        [root@hai7115 CA]$echo 01 > serial
        
    3. http服务器B申请证书
      1. 在B主机上生成私钥,然后生成证书申请
        生成证书申请文件
        [root@hai7-6 ssl]$openssl req -new -key httpd.key -out httpd.csr
        
      2. 将文件拷贝到CA服务器
        [root@hai7-6 ssl]$scp httpd.csr 192.168.50.115:/etc/pki/CA/
        
      3. CA服务器为B签名,签名后将证书发送给B
        1. '为申请证书B签名'
        [root@hai7115 CA]$openssl ca -in httpd.csr -out certs/httpd.crt
        2. '将客户端证书和CA证书一起发送给客户端'
        [root@hai7115 CA]$scp  cacert.pem  certs/httpd.crt 	192.168.50.107:/etc/httpd/conf.d/ssl
        
    4. http服务器拿到证书后,实现https配置
      1. 客户端修改mod_ssl配置文件,重启服务
        [root@hai7-6 ~]$vim /etc/httpd/conf.d/ssl.conf
        #   Server Certificate:
        SSLCertificateFile /etc/httpd/conf.d/ssl/httpd.crt      <==修改为申请的证书存放路径
        #   Server Private Key:
        SSLCertificateKeyFile /etc/httpd/conf.d/ssl/httpd.key   <==修改为生成的私钥路径
        #   Certificate Authority (CA):
        SSLCACertificateFile /etc/httpd/conf.d/ssl/cacert.pem    <==去掉注释,修改CA证书存放路径
        
      2. 重启服务
        [root@hai7-6 conf.d]$systemctl restart httpd
        
  • 测试基于https访问相应的主机

    1. 语法格式
      openssl s_client [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]
    2. 示例
      1. 通过CA证书测试目标地址证书信息
        [root@hai7115 CA]$openssl s_client  -connect 192.168.50.107:443  -CAfile cacert.pem
        
      2. 使用curl通过CA证书测试目标地址,cacert.pem为CA证书
        [root@hai7115 CA]$curl --cacert cacert.pem    https://www.moli.com
        
  • 安装mod_ssl 时系统会通过脚本,生成默认的私钥和证书文件

    查看生成默认私钥和证书的脚本
    [root@hai7-6 conf]$rpm -q --scripts mod_ssl
    

5. http重定向https

将http请求转发至https的URL,https带来的问题是并发处理能力降低

  • 在介绍内容前,先将http和https的网页做成不同的样式

    1. 新建一个目录,放https主页文件
      1. '在/var/www/下创建ssl目录放https的页面文件'
      [root@hai7-6 www]$mkdir  /var/www/ssl
      2. '在ssl下创建一个页面文件index.html'
      root@hai7-6 www]$echo /var/www/ssl/index.html > /var/www/ssl/index.html
      
    2. 修改mod_ssl配置文件
      [root@hai7-6 ssl]$vim /etc/httpd/conf.d/ssl.conf 
      #DocumentRoot "/var/www/html"  <==https默认的访问页面路径,可以修改		
      DocumentRoot "/var/www/ssl"    <==新建一行以上项,修改为我们定义的https页面文件目录
      
  • 实现重定向

    1. 配置命令
      Redirect [status] URL-path URL
    2. 参数
      status状态:
      1. Permanent
        Returns a permanent redirect status (301) indicating that the resource has moved permanently
      2. Temp
        Returns a temporary redirect status (302). This is the default
      3. 示例:
        Redirect temp / https://192.168.50.107/
  • 实现跳转HTTPS示例

    1. 在http配置文件中加入跳转命令配置
      [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf
      Redirect temp /  https://192.168.50.107     <==跳转配置,只要访问服务器根目录,自动跳转到https上
      
    2. 这样配置后,跳转到https后,会出现保存提示ERR_TOO_MANY_REDIRECTS,因为访问根就会跳转,所以跳转到https后,又一次访问192.168.50.107的根目录,再次跳转,解决此问题配置为如下内容
      1. '修改配置文件'
      [root@hai7-6 ~]$vim /etc/httpd/conf.d/text.conf
      RewriteEngine on                         <==启动RewriteEngine引擎
      rewritecond   %{SERVER_PORT}  !^443      <==设置跳转条件,接口号非443才跳转
      RewriteRule  ^(/.*)$  https://%{HTTP_HOST}$1 [redirect=302]  <==跳转到哪里
      3. 重新启动服务
      [root@hai7-6 conf.d]$systemctl restart httpd
      
      成功跳转到https后可以进行加密访问,但前面的跳转过程仍然是不加密的,有被中间人攻击的危险,解决此问题采用的方法为HSTS
  • HSTS:HTTP Strict Transport Security

    1. 作用
      HSTS可以用来抵御SSL剥离攻击,只要浏览器曾经与服务器创建过一次安全连接,之后浏览器会强制使用HTTPS,即使链接被换成了HTTP

      SSL剥离的实施方法是阻止浏览器与服务器创建HTTPS连接。它的前提是用户很少直接在地址栏输入https://,用户总是通过点击链接或3xx重定向,从HTTP页面进入HTTPS页面。所以攻击者可以在用户访问HTTP页面时替换所有https://开头的链接为http://,达到阻止HTTPS的目的

    2. HSTS实现过程
      当客户端通过HTTPS向服务器XXX发出请求时,在服务器返回的超文本传输协议响应头中包含Strict-Transport-Security字段(非加密传输时设置的HSTS字段无效)
      在STS字段中定义的时间内,客户端浏览器只要向服务器XXX发起请求,浏览器会在内部做3XX重定向跳转到HTTPS,而无需任何网络过程,
    3. 不足之处
      用户首次访问某网站是不受HSTS保护的,这是因为首次访问时,浏览器还未收到HSTS,所以仍有可能通过明文HTTP来访问
    4. 解决方案为HSTS preload list(HSTS预列表)
      1. HSTS preload list
        此列表将世界上目前有的https网站都收录起来,载入到浏览器中,方便用户第一次访问网站时直接加密访问,是Chrome浏览器中的HSTS预载入列表,在该列表中的网站,使用Chrome浏览器访问时,会自动转换成HTTPS,Firefox、Safari、Edge浏览器也会采用这个列表
      2. 将HSTS信息加入到域名系统记录中
        需要保证DNS的安全性,也就是需要部署域名系统安全扩展。截至2014年这一方案没有大规模部署

6. httpd自带的工具程序和压力测试工具

  • httpd自带工具
    1. htpasswd
      basic认证基于文件实现时,用到的账号密码文件生成工具
    2. apachectl
      httpd自带的服务控制脚本,支持start和stop
      [root@hai7-6 ~]$apachectl stop
      [root@hai7-6 ~]$apachectl start
      
    3. rotatelogs
      日志滚动工具,当系统文件过大时让其生成一个新的文件,可以确保日志的完整性
      access.log -->
      access.log, access.1.log -->
      access.log, acccess.1.log, access.2.log
  • httpd的压力测试工具
    1. 常见测试工具
      ab, webbench, http_load,seige,Jmeter (开源),Loadrunner (商业),tcpcopy(网易,复制生产环境中的真实请求,并将之保存)
    2. ab工具介绍:来自httpd-tools包,不可以在线上做压测,在测试环境就测好了
      正常压测过程中,打开一个网页不能超过3秒,测试结果的支持并发数按80%取
      跨并发测试,每种压测至少要测3次以上,取平均值
      ab测试只有参考价值,没有实际意义,因为只请求了一个URL
      一个服务器如果对静态资源只能承载10000个,那么对于动态资源可能要少于1000
      1. 语法格式
        ab [OPTIONS] URL
      2. 常用参数
        -n:总请求数
        -c:模拟的并行数,每一个并发对应一个客户端,一个客户端就需要一个套接字,一个套接字对应一个文件,一个文件对应一个文件描述符,而linux默认一个程序打开的文件上限为1024个
        -k:以持久连接模式测试
      3. 示例,测试条件超出系统范围解决方法
        [root@hai7115 ~]$ab -c 1000 -n 1500 http://192.168.50.115/
        socket: Too many open files (24)
        
        解决办法,修改系统文件设置值
        1. '查看系统当前文件管理设置值'
        [root@hai7115 ~]$ulimit -a   <==查询所有
        [root@hai7115 ~]$ulimit -n   <==查询单项
        2. '调整值大小'
        [root@hai7115 ~]$ulimit -n 2000
        
      4. 示例,压测输出信息
[root@hai7-6 conf.d]$ab -c 50 -n 100 http://192.168.50.107/

...省略
Server Software:        Apache/2.4.6     <==服务器程序版本号
Server Hostname:        192.168.50.107   <==请求的主机名称
Server Port:            80    			 <==服务器对应端口

Document Path:          /    			 <==压测时的URL
Document Length:        5 bytes    		 <==URL对应相应内容的长度

Concurrency Level:      50      		 <==并发数
Time taken for tests:   0.023 seconds    <==整体测试时间
Complete requests:      100       		 <==整体完成相应请求数
Failed requests:        0			     <==错误的请求数	
Write errors:           0		    	 <==相应错误数
Total transferred:      27400 bytes      <==整体字节数
HTML transferred:       500 bytes		          <==HTML占了多少内容,上面那个是带首部的总体大小
Requests per second:    4359.58 [#/sec] (mean)    <==每秒处理请求数
Time per request:       11.469 [ms] (mean)    	  <==平均每组请求所有时间
Time per request:       0.229 [ms] (mean, across all concurrent requests)     <==每个请求平均用时
Transfer rate:          1166.53 [Kbytes/sec] received    <==传输速率

Connection Times (ms)
              min   mean[+/-sd] median   max
			最少用时   平均值      中间值   最慢用时
Connect:        0     1   1.0      2       3
连接建立
Processing:     1     7   2.4      8      10
处理请求
Waiting:        1     7   2.5      8      10
等待将请求报文发送给客户端接收完成
Total:          4     8   1.8      9      12
整体完成
Percentage of the requests served within a certain time (ms)
  50%      9
  66%      9
  75%     10
  80%     10
  90%     10
  95%     11
  98%     11
  99%     12
 100%     12 (longest request)

7. httpd-2.4较2.2的改变

  • 新增特性
    1. MPM支持运行为DSO机制;以模块形式按需加载
    2. event MPM生产环境可用
    3. 异步读写机制
    4. 支持每模块及每目录的单独日志级别定义
    5. 每请求相关的专用配置
    6. 增强版的表达式分析式
    7. 毫秒级持久连接时长定义
    8. 基于FQDN的虚拟主机不需要NameVirutalHost指令
    9. 新指令,AllowOverrideList
    10. 支持用户自定义变量
    11. 更低的内存消耗
  • 修改了一些配置机制
    不再支持使用Order, Deny, Allow来做基于IP的访问控制
    1. 新模块
      1. mod_proxy_fcgi
        支持FastCGI Protocol
      2. mod_remoteip
        用反向代理的IP地址代替远程客户机的IP
      3. mod_ratelimit
        提供带宽控制
    2. 基于IP的访问控制:
      1. 无明确授权的目录,默认拒绝
      2. 允许所有主机访问:Require all granted
      3. 拒绝所有主机访问:Require all denied
      4. 控制特定的IP访问:
        1. 先授权指定来源的IP访问:Require ip IPADDR
        2. 再拒绝特定的IP访问:Require not ip IPADDR
      5. 控制特定的主机访问:
        1. 授权特定主机访问:Require host HOSTNAME
        2. 拒绝 HOSTNAME:Require not host HOSTNAME
        3. 特定主机:FQDN
        4. 指定域名下的所有主机:domin.tld
    3. 虚拟主机
      基于FQDN的虚拟主机不再需要NameVirutalHost指令
      <VirtualHost *:80>
      ServerName www.b.net
      DocumentRoot "/apps/b.net/htdocs"
      <Directory "/apps/b.net/htdocs">
      Options None
      AllowOverride None
      Require all granted
      </Directory>
      </VirtualHost>
      
      注意:任意目录下的页面只有显式授权才能被访问
    4. KeepAlive on
      毫秒级持久连接时长定义
      KeepAliveTimeout #ms
      MaxKeepAliveRequests 100

8. Sendfile机制

  • 不用 sendfile 的传统网络传输过程(需要经历4次I/O过程)
    1. 过程
      1. 网络I\O连接过程,通过网卡接收请求存放在网卡buffer,接收完成后发送给内核,暂存在内核buffer当中
      2. 内核解封装后找到监听端口,转发给进程
      3. 进程分析用户请求后,要通过内核读取磁盘拿到网页文件,也就是磁盘I/O过程
      4. 内核读取磁盘文件,需要将数据加载到内核的内存空间,加载完成后再发送个用户空间的进程(此过程很慢,进程将大量时间耗在等待)
      5. 应用程序进程处理数据,添加头部信息,形成新的回应报文,发送给内核,在通过网卡传回给用户
    2. 4次I/O
      硬盘 >> kernel buffer >> user buffer >> kernel socket buffer >> 协议栈
      一般网络应用通过读硬盘数据,写数据到 socket 来完成网络传输,底层执行过程:
      1. 系统调用 read() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后 DMA 执行拷贝,把文件数据从硬盘读到一个 kernel buffer 里。
      2. 数据从 kernel buffer 拷贝到 user buffer,然后系统调用 read() 返回,这时又产生一个上下文切换:从kernel mode 切换到 user mode
      3. 系统调用 write() 产生一个上下文切换:从 user mode 切换到 kernel mode,然后把步骤2读到 user buffer 的数据拷贝到 kernel buffer(数据第2次拷贝到 kernel buffer),不过这次是个不同的 kernel buffer,这个 buffer和 socket 相关联。
      4. 系统调用 write() 返回,产生一个上下文切换:从 kernel mode 切换到 user mode(第4次切换),然后DMA从 kernel buffer 拷贝数据到协议栈(第4次拷贝)
  • Sendfile机制
    在kernel 2.0+ 版本中,系统调用 sendfile() 就是用来简化上面步骤提升性能的。sendfile() 不但能减少切换次数而且还能减少拷贝次数
    用 sendfile() 来进行网络传输的过程:sendfile(socket, file, len)
    硬盘 >> kernel buffer (快速拷贝到kernel socket buffer) >> 协议栈
    1. 系统调用 sendfile() 通过 DMA 把硬盘数据拷贝到 kernel buffer,然后数据被 kernel 直接拷贝到另外一个与 socket 相关的 kernel buffer。这里没有 user mode 和 kernel mode 之间的切换,在 kernel 中直接完成了从一个 buffer 到另一个 buffer 的拷贝
    2. DMA 把数据从 kernel buffer 直接拷贝给协议栈,没有切换,也不需要数据从 user mode 拷贝到 kernel mode,因为数据就在 kernel 里
  • 不支持Sendfile的场景
    服务器上的数据是通过其他服务器获取的,也就是说用户访问的数据不在本机磁盘中

反向代理功能

  • 启用反向代理
    需要2个配置命令
    1. 将客户端请求从服务器A转发到另一个服务器B
      ProxyPass “/” “http://www.example.com/”
    2. 服务器B将数据再转回给服务器A,由A来回应用户
      ProxyPassReverse “/” “http://www.example.com/”
  • 特定URL反向代理
    ProxyPass “/images” “http://www.example.com/”
    ProxyPassReverse “/images” http://www.example.com/

编译安装httpd-2.4

  • 安装httpd-2.4需要的源码

    1. httpd-2.4源码:httpd-2.4.34.tar.bz2
    2. arp可移植运行库源码:apr-1.6.3.tar.gz、apr-util-1.6.1.tar.gz
  • 安装前准备开发包:

    1. 开发环境包组:Development Tools,Server
    2. 依赖包:pcre-devel openssl-devel expat-devel
  • APR(Apache portable Run-time libraries,Apache可移植运行库)

    1. 作用
      主要为上层的应用程序提供一个可以跨越多操作系统平台使用的底层支持接口库
    2. 为何开发
      在早期的Apache版本中,应用程序本身必须能够处理各种具体操作系统平台的细节,并针对不同的平台调用不同的处理函数
      随着Apache的进一步开发,Apache组织决定将这些通用的函数独立出来并发展成为一个新的项目。这样,APR的开发就从Apache中独立出来,Apache仅仅是使用 APR而已。目前APR主要还是由Apache使用,由于APR的较好的移植性,因此一些需要进行移植的C程序也开始使用APR,开源项目比如用于服务器压力测试的Flood loader tester,该项目不仅仅适用于Apache
    3. 参考
      http://httpd.apache.org/test/flood
  • 编译安装httpd-2.4方法

    1. 方法一,将内核与接口分别编译
      1. 编译安装apr-1.4+
        1. 进入apr解压目录:cd apr-1.6.2
        2. 编译:./configure --prefix=/app/apr
        3. 构造并安装:make && make install
      2. 编译安装apr-util-1.4+
        1. 进入apr-util解压目录:cd …/apr-util-1.6.0
        2. 编译:./configure --prefix=/app/apr-util --with-apr=/app/apr/
        3. 构造并安装make -j 2 && make install
      3. 编译安装httpd-2.4
        1. 进入httpd解压目录:cd …/httpd-2.4.27
        2. 编译:./configure --prefix=/app/httpd24 --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/app/apr/ --with-apr-util=/app/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
        3. 构造并安装:make -j 4 && make install
    2. 方法二,放在一起编译
      1. 安装开发包组
        [root@hai7115 ~]$yum groupinstall "development tools"
        
      2. 安装依赖的程序包,以下这些为编译经验所得,可以在编译过程中发现查看安装
        [root@hai7115 ~]$yum install  pcre-devel  openssl-devel  expat-devel
        
      3. 官方下载httpd源码,以及依赖的apr包(apr-1.6.3.tar.gz、apr-util-1.6.1.tar.gz 、httpd-2.4.34.tar.bz2
        ),导入linux中,然后解压缩
        [root@hai7115 srcd]$tar xf apr-1.6.3.tar.gz 
        [root@hai7115 srcd]$tar xf apr-util-1.6.1.tar.gz 
        [root@hai7115 srcd]$tar xf httpd-2.4.34.tar.bz2 
        
      4. 将apr和apr-util整个目录拷贝到httpd-2.4.34/srclib/目录下
        [root@hai7115 srcd]$cp -r apr-1.6.3 httpd-2.4.34/srclib/apr
        [root@hai7115 srcd]$cp -r apr-util-1.6.1 httpd-2.4.34/srclib/apr-util
        
      5. 编译
        '进入httpd解压后的目录,运行configure'
        ./configure\
        --prefix=/app/httpd24\
        --enable-so\      		  <==是否支持动态模块
        --enable-ssl\  			  <==是否支持加密
        --enable-cgi\    
        --enable-rewrite\
        --with-zlib\     
        --with-pcre\      		  <==正则表达式
        --with-included-apr\      <==表示已经将apr相关需要编译的内容放在httpd相关的路径下,可以一起编译
        --enable-modules=most\    <==是否支持大部分模块
        --enable-mpms-shared=all\
        --with-mpm=prefork        <==是否支持mpm的prefork工作模型
        
      6. 构造和安装
        [root@hai7115 httpd-2.4.34]$make -j 8  && make install
        
      7. 配置环境变量,生效变量,启动程序
        [root@hai7115 httpd-2.4.34]$echo PATH=/app/httpd24/bin:$PATH > /etc/profile.d/httpd.sh
        [root@hai7115 httpd-2.4.34]$. /etc/profile.d/httpd.sh
        
      8. 初始页面存放目录
        [root@hai7115 htdocs]$cat /app/httpd24/htdocs/index.html 
        <html><body><h1>It works!</h1></body></html>
        
      9. 设置开机启动,将其放在系统启动脚本中,给启动脚本加上执行权限
        [root@hai7115 ~]$echo "/app/httpd24/bin/apachectl start" >> /etc/rc.d/rc.local
        [root@hai7115 ~]$chmod +x /etc/rc.d/rc.local 
        
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

linux学习43-HTTP服务和APACHE2 的相关文章

  • Chrome 问题 - 视频流和会话冲突

    我在使用 javascript 和 PHP 实现视频时遇到问题 索引 php session start do other stuff include video php 视频 php
  • 如何将命令输出作为多个参数传递给另一个命令

    我想将命令的每个输出作为多个参数传递给第二个命令 例如 grep pattern input returns file1 file2 file3 我想复制这些输出 例如 cp file1 file1 bac cp file2 file2 b
  • Node.js 上的 Connect 出现“无法 GET /”

    我正在尝试使用以下方式开始提供一些静态网页connect像这样 var connect require connect var nowjs require now var io require socket io var app conne
  • 我可以在 Ubuntu 上使用 Homebrew 吗?

    我只是尝试使用 Homebrew 和 Linuxbrew 在我的 Ubuntu 服务器上安装软件包 但都失败了 这就是我尝试安装它们的方法 sudo apt get install build essential curl git m4 r
  • Linux 中的 Windows NAmed Pipes 替代品

    我们正在将现有的 Windows 代码移植到 Linux 我们使用 ACE 作为抽象层 我们使用 Windows 命名管道与多个客户端进行通信并执行重叠操作 linux 下这个相当于什么 我检查了linux命名管道 FIFO 但它们似乎只支
  • 在 HTTP PATCH 请求中包含数据的正确方法

    当我组合 HTTP PATCH 请求时 可以选择哪些选项来包含 URL 参数之外的数据 以下任何一项都有效吗 最常见的选择是什么 多部分 表单数据 应用程序 x www form urlencoded Raw JSON 还有其他的吗 HTT
  • Web API GET 请求中的电子邮件地址

    我正在开发在 ASP NET Web API 中实现的 REST API 我们想要支持的一个场景是执行GET通过电子邮件地址请求一些用户信息 理想情况下 客户应该能够执行以下操作 GET api v1 users email your em
  • 在 MacOS 上构建需要 net461 的 dotnet SDK 项目的最简单方法

    我有一个 dotnet SDK sln and a build proj with
  • 无法在 git 上获取 Http 工作

    我在拇指驱动器上使用 gitbash 作为 git 我的防火墙阻止了我 并且想设置我的 git 以进行 http 访问 我使用 github 并且已经看到了有关如何执行此操作的各种信息 但我还不够了解 无法让它为我自己工作 我在 php i
  • 在 Windows / Linux 中创建 Mac 包

    我自己努力制作一个 r 包 我按照 stackoverflow 中上一个问题的说明进行操作如何为外行开发软件包 http cran r project org bin windows Rtools 以下是我根据上一个问题采取的步骤 在新的
  • 如何在C程序中直接改变显存映射来绘制像素(无需库函数)

    是否可以通过使用 C 程序更改 RAM 中屏幕 视频即监视器 内存映射中的值来显示黑点 我不想使用任何库函数 因为我的主要目标是学习如何开发简单的操作系统 我尝试访问起始屏幕内存映射 即 0xA0000 在 C 中 我尝试运行该程序 但由于
  • 进程如何知道它已收到信号

    如果我错了 请纠正我 以下是我对信号的理解 据我所知 信号生成 和信号传递有2个不同 事物 为了产生信号 操作系统只是在位数组中设置一个位 在过程控制中维护 工艺块 PCB 每一位 对应于特定信号 当设置一个位时 这意味着 该位对应的信号为
  • X 按键/释放事件捕获,与焦点窗口无关

    我想记录所有传入的按键事件 无论哪个窗口处于焦点状态或指针位于何处 我编写了一个示例代码 它应该捕获当前焦点窗口的按键事件 include
  • tar.gz 和 tgz 是同一个东西吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我创建了 tgz 文件tar czvf filecommand then 我最终得到了一个 tgz 文件 我想知道它和tar gz 之间的
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • Linux 阻塞与非阻塞串行读取

    I have 这段代码 https stackoverflow com questions 6947413 how to open read and write from serial port in c用于在Linux中从串行读取 但我不
  • %config(noreplace) 文件上出现意外的 RPM 冲突

    我正在创建我自己的RPM using rpmbuild My RPM 包含配置文件哪个应该永远不会被覆盖 即使 RPM 包含这些配置文件的新版本 为了存档这个 我用以下标签标记了它们 config noreplace opt mypacka
  • 如何从外部模块导出符号?

    我在内核源代码树之外进行编码 有两个模块 第一个printt有一个功能printtty 将字符串打印到当前 tty 以及第二个模块hello这会调用printtty 在初始化期间 我已经添加了EXPORT SYMBOL printtty 在
  • bash "&" 不打印 "[1]+ Done "

    我在 bashrc 中调用一个脚本来打印打开终端时收到的新消息数 我希望该调用在访问网络时是非阻塞的 有时需要几秒钟 这意味着我无法使用终端直到完成 但是如果我输入 mailcheck 在我的 bashrc 中 它工作正常 但然后打印一个空
  • SVN 不断提示我输入密码并拒绝缓存我的凭据

    环境 Eclipse Indigo Ubuntu 11 04 Subclipse 1 6 SVN 客户端 Subclipse RabbitVCS 我通过 svn ssh 连接 我的网址如下所示 svn ssh 我的名字 我的域名 路径 我可

随机推荐

  • CSP M4 C 宇宙狗的危机

    题意 xff1a 描述 在瑞神大战宇宙射线中我们了解到了宇宙狗的厉害之处 xff0c 虽然宇宙狗凶神恶煞 xff0c 但是宇宙狗有一个很可爱的女朋友 最近 xff0c 他的女朋友得到了一些数 xff0c 同时 xff0c 她还很喜欢树 xf
  • csp 201809-3 元素选择器

    题意 xff1a 思路 xff1a 这道题的解决应该分为建树 43 查找两部分 关于建树 xff0c 为了方便后代选择器的查找 xff0c 采用儿子记录父节点的方法 xff0c 即每个节点记录自己的父节点位置 采用数组描述这棵树 xff0c
  • csp 201312-4有趣的数

    题意 xff1a 问题描述 我们把一个数称为有趣的 xff0c 当且仅当 xff1a 1 它的数字只包含0 1 2 3 xff0c 且这四个数字都出现过至少一次 2 所有的0都出现在所有的1之前 xff0c 而所有的2都出现在所有的3之前
  • C++20中的协程

    一 协程 在谷歌的Golang中 xff0c 如果大家说他的特点有啥 xff0c 肯定绕不过协程 而在此之前 xff0c 大多数的语言一般是从多进程讲到多线程 xff0c 一般来说 xff0c 对某个语言掌握的深度 xff0c 就看在多线程
  • RUST网络客户端的基本技术说明

    一 客户端的说明 上文中的网络客户端 xff0c 其实就是一个比较简单的TCP通信客户端 xff0c 原来为了实现和服务端的通信 xff0c 增加了相关的通信协议的相关内容 xff0c 在这里分析时 xff0c 可以忽略掉 xff0c 毕竟
  • 跟我学c++中级篇——再谈Concepts

    一 理解Concepts 可能很多的c 43 43 程序员到职业生涯结束 xff0c 都没有真正写过模板程序 xff0c 有一些甚至都没有听说过模板 这个很正常 xff0c 特别是一些参与c开发的c 43 43 程序员更是如此 不过 xff
  • win10软链接

    win10软链接 C gt mklink 创建符号链接 MKLINK D H J Link Target D 创建目录符号链接 默认为文件 符号链接 H 创建硬链接而非符号链接 J 创建目录联接 Link 指定新的符号链接名称 Target
  • Maven项目引用本地jar包依赖打包警告should not point at files within the project directory

    Maven项目引用本地jar包依赖打包警告Some problems were encountered while building the effective model for com xxx xxx xxx xxx jar shoul
  • make collect2: ld terminated with signal 9 错误解决办法

    make collect2 ld terminated with signal 9 错误解决办法 echo579 博客园 原因 xff1a signal 9 错误是由于交换区空间不足导致 xff0c 扩展交换区大小即可 解决方法搬运自Lin
  • 基于BFS的最短路径搜索[C++]

    基于C 43 43 实现BFS的最短路径搜索时 xff0c 可以使用STL中的优先队列priority queue xff0c 优先队列按照小顶堆 xff0c 即路径短的优先取出 其中节点可以用结构体定义 xff0c 结构体中存储节点的位置
  • c++ GUI轻量工具包FLTK介绍 (1)

    c 43 43 有许多gui开发工具 xff0c 比如MFC xff0c QT xff0c 而FLTK Fast Light ToolKit 读音fulltik xff0c 则是一个轻量级的 xff0c 简洁的gui开发库 fltk是跨平台
  • 一道题谈回溯

    CSDN话题挑战赛第1期 活动详情地址 xff1a https marketing csdn net p bb5081d88a77db8d6ef45bb7b6ef3d7f 参赛话题 xff1a Leetcode刷题指南 话题描述 xff1a
  • 戴尔服务器安装Debian11过程

    目录 物理戴尔服务器Debian11安装过程 以下皆为作者实操 转载注明出处 制作Debian ISO 镜像 U盘启动服务器进入启动项设置注意 在开机之前 请一定拔掉服务器网线 否则Debian安装会卡在 39 安装软件 39 这一步安装过
  • (转)Linux文件系统只读Read-only file system的快速解决方法

    xff08 原创地址 xff09 http www ha97 com 5428 html 问题描述 xff1a 上周公司的私有云 xff08 底层架构是Openstack 43 KVM xff0c 目前稳定性还不够好 xff0c 开发团队在
  • C语言中头文件写法

    在实现C语言模块化编程时 xff0c 通常会用到 h式的头文件的编写 xff0c 在此记录下头文件的基本写法 通常我们写C程序时 xff0c 都会直接使用这样的语句 include lt stdlib h gt 这便是我们通常说的头文件 头
  • 测试人员应该知道的Redis知识(六) Set

    一 概述 Redis 的 Set 是 String 类型的无序集合 集合成员是唯一的 xff0c 这就意味着集合中不能出现重复的数据 Redis 中集合是通过哈希表实现的 xff0c 所以添加 xff0c 删除 xff0c 查找的复杂度都是
  • OpenPCDet初级教程【自定义模型、loss】

    最近在研究点云物体检测 xff0c 基于OpenPCDet框架进行算法开发可以节约大量的重复性工作 xff0c 专心集中在核心算法的设计上 xff0c 大量节约时间 同时 xff0c 因为框架由大公司专业团队进行维护 xff0c 代码质量稳
  • NFS

    NFS Server apt install nfs kernel server nfs common y vim etc exports etc exports the access control list for filesystem
  • (深入理解计算机系统) bss段,data段、text段、堆(heap)和栈(stack)

    文章目录 bssdatatextheapstack总结例子 bss bss段 xff08 bss segment xff09 通常是指用来存放程序中未初始化的全局变量的一块内存区域 bss是英文Block Started by Symbol
  • linux学习43-HTTP服务和APACHE2

    HTTP服务和APACHE2 知识点 请求报文响应报文错误码请求重定向编译安装实现httpscurl工具 1 http协议 http协议版本 http 0 9 http 1 0 http 1 1 xff08 较多 xff09 http 2