HTTP2.2详解(二)

简介:


http://httpd.apache.org/docs/2.2/  //官方手册
一、httpd的特性
二、安装httpd
三、httpd基础配置详解
四、详细实验

        
一、httpd的特性
高度模块化:core + modules
DSO:dynamic share object动态共享对象,支持动态装卸载
MPM:multi process modules:多道处理模块,决定httpd的工作方式来响应用户请求
    prefork:多进程模型,每个进程响应一个请求;
        1个主进程:负责[生成/回收]子进程处理用户请求;负责创建套接字;负责接收请求,并将其派发给某子进程进行并发处理;
        n个子进程:每个子进程处理一个请求
        工作模型:会预先生成几个空闲进程,随时等待响应用户请求;定义最大空闲和最小空闲
    worker:多进程多线程模型,每线程处理一个用户请求
        1个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行并发处理;
        n个子进程:每个子进程负责生成多个线程
        每个线程,负责响应用户请求
        并发响应数量:m*n
            m:子进程数量
            n:每个子进程所能创建的最大线程数量
    event:事件驱动模型,多进程模型,每个进程响应多个请求
        1个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行并发处理;
        子进程:基于事件驱动机制直接响应多个请求;
        http2.2:仍为测试使用模型
        http2.4:event可以直接使用
    ============================================
        prefork 1=n===?      1*n    //每个子进程只响应1个请求
        worker 1=n=m===?  m*n    //1个子进程响应1个请求
        event    1==n===??  1*n //每个子进程响应多个请求
            
并发服务器响应模型:
    单进程模型
    多进程模型
    复用的I/O的模型
        多线程
        事件驱动 
    复用的多进程多线程模型
MPM:2.2和2.4
    prefork:多进程模型,一个主进程,生成n个子进程,一个进程响应一个请求
    worker:多进程多线程模型,一个主进程,生成多个子进程,每个子进程生成多个线程,一个线程响应一个用户请求
    event:事件驱动模型,多进程模型,一个进程,生成多个子进程,一个进程响应多个请求    
    相同点:都有主进程,都有子进程 //最常见的多道处理模块机制    
http的程序版本
    httpd 1.3官方已经停止维护
    http2.0,2.4是主流版本
    http2.4目前最稳定
httpd的功能特性
    CGI:common gateway Interface
    虚拟主机:IP,PORT,FQDN
    反向代理:
    负载均衡:
    丰富的用户认证机制:
            basic
            digest
    支持第三方模块:
    ...
    
二、安装httpd
    rpm包
    编译安装:定制新功能,或其他原因
CentOS 6:httpd2.2
    配置文件:
        /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
        /usr/sbin/httpd.worker
        //http2.2这几个模型,是不支持动态装卸载的
    日志文件:
        /var/log/httpd
            access_log:访问日志
            error_log:错误日志
    站点文档:
        /var/www/html
    模块文件路径:
        /usr/lib64/httpd/modules/ 
    服务控制
        service
        chkconfig httpd on|off
CentOS 7: httpd2.4 //MPM可以动态装载
    配置文件:
        /etc/httpd/conf/httpd.conf
        /etc/httpd/conf.d/*.conf
        模块配置文件
            /etc/httpd/conf.modules.d/*  根据名字按顺序进行加载
    systemd unit file:
        /usr/lib/systemd/system/httpd.service
        基于unit加载服务
    主程序:
        /usr/sbin/httpd //http-2.4支持MPM的动态切换
    日志文件:
        /var/log/httpd
            access_log:访问日志
            error_log:错误日志
    站点文档:
        /var/www/html            
    模块文件路径:
        /usr/lib64/httpd/modules/ 
    服务控制:
        sysemctl {enabled|disable} httpd.service
    
三、httpd基础配置详解
httpd-2.2常用配置
    httpd.conf //三段
    1.全局配置
    2.主服务器配置
    3.虚拟主机配置
    
配置格式:
    directive value 
        directive:不区分大小写,
        value:一般也不区分大小写,为路径时,是否区分字符大小写,取决于fs
常用配置:
    //cp httpd.conf{,.bak} //建议先备份一下
1.修改监听的ip和port
    Listen [IP:]PORT 
        1.//省略IP标识为0.0.0.0;本机所有ip
        2.listen 80 
            listen 8080 //同时在80和8080端口提供服务
        3.修改监听socket,重启服务进程才能生效,reload不能生效
2.持久链接 //
    persistent Connection:TCP连接建立后,每个资源获取完成后,不完全断开链接,而是继续等待其他资源请求的进行
    如何断开?
        数量限制
        时间限制
        
        副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到响应;
        折中:使用较短的持久链接时长,以及较少的请求数量
    KeepAlive On|Off //默认关闭
    MaxKeepAliveRequests 100 //最多请求次数
    KeepAliveTimeout 15 //超时时间,相当于汽车的3年10w公里,一样,只要满足其中一样,就废弃该进程
    
3.MPM
    httpd2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的模块
        //CentOS所提供的的rpm包同时提供了三个rpm包,但同时只能使用一个
        httpd:prefork //默认使用的MPM模块
        httpd.worker:
        httpd.event //分别用于实现对不同的MPM机制的实现,确认现在使用
    ps aux |grep httpd //查看当前使用的模型
    查看httpd程序的模块列表
        1.httpd -l //静态编译的模块
        2.httpd -M //查看静态和动态[共享]的所有模块
    更换其他MPM
        1.service httpd stop
        2.vim /etc/sysconfig/httpd 
            HTTPD=/usr/sbin/httpd.{worker,event} //启用
        3.service httpd start
        4.ps aux |grep httpd
注意:httpd2.2不建议使用event
    而且用线程取代进程,所带来的的性能提升是有限的
    重启服务进程方式可生效
    
4.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Prefork
     < IfModule  prefork.c>
     StartServers       8    //服务启动进程
     MinSpareServers    5    //最小空闲进程
     MaxSpareServers   20    //最大保持空闲的进程的数量
     ServerLimit      256    //最多允许maxclient启用多少个进程
     MaxClients       256    //最大并发量,就是同时访问数量
     MaxRequestsPerChild  4000    //每个进程最多可以处理多少个请求
     </ IfModule >
     pv:page view页面访问单个页面    
     uv:用户访问量
     
Worker
     < IfModule  worker.c>
     StartServers         4    //随服务启动进程数
     MaxClients         300    //最大并发客户端连接数
     MinSpareThreads     25    //最少保留多少空闲线程数量
     MaxSpareThreads     75    // 4*25=100>75因此开机只会启动3个进程,1个为主进程
     ThreadsPerChild     25    //每个进程可以生成的子线程
     MaxRequestsPerChild  0    //每个进程最多可以处理多少个请求,能处理多少个,就处理多少个
     </ IfModule >


        
    watch -n.5 'ps aux |grep httpd' //每0.5s检测一次
    service httpd restart //刚开始启动4个,后期会减去一个
    
5.DSO//动态加载模块
    配置指定实现模块

1
2
3
4
     LoadModule < mod_name > < mod_path > //模块名称相对路径,相对于ServerRoot路径,/etc/httpd/
     LoadModule disk_cache_module modules/mod_disk_cache.so
     LoadModule cgi_module modules/mod_cgi.so
     LoadModule version_module modules/mod_version.so


    
6.定义中心主机的文档页面路径
    只提供一个站点:
        1.只提供一个虚拟主机
        2.使用Main server
    文档路径映射:DocuemntRoot指向的路径为URL路径的起始位置
    DocumentRoot "/var/www/html"  //设定根目录
    
7.站点访问控制
    可基于两种机制指明对哪些资源进行何种访问控制
        文件系统路径
        URL路径
    [FS路径]/var/www/html/index.html-->[URL路径]192.168.0.1/index.html
    
    注意:访问控制实在 <DocumentRoot  /var/www/html>中定义的
    1.单个目录及其子目录
        <Directory />
            Options FollowSymLinks
            AllowOverride None
            ...
        </Directory>
    2.单个文件
        <file "" >
            ...
        </file> 
    3.一类文件
        <FileMatch "PATTERN" >  //匹配一类文件,但是要启用正则表达式引擎才能使用
        ...
        </FileMatch>
    4.URL路径
        <Location "/" >
        ...
        </Location>
        
        <LocationMatch "/" >
        ...
        </LocationMatch>

    示例:        
        <Directory "/var/www/html">
            Options Indexes FollowSymLinks 
            AllowOverride None
            Order allow,deny
            Allow from all
        </Directory>
        Indexes:指明的URL路径下不存在于定义的主页面资源相符的资源文件时,返回索引列表给用户
        FollowSymLinks:
        
8.定义网站主界面:以及访问控制参数
    DirectoryIndex index.html index.html.var
    
    重命名index.html ,以及/etc/httpd/conf.d/welcome.conf
    service httpd restart //将看到索引

1
2
3
4
5
6
         < Directory  "/var/www/html">
             Options Indexes FollowSymLinks  //删除indexes将看不到索引
             AllowOverride None
             Order allow,deny
             Allow from all
         </ Directory >


    修改后再次查看:forbidden
        
    1.Options Indexes FollowSymLinks
        Indexes :是否允许索引
        FollowSymlinks:是否跟随符号链接到源文件
        SymLinksifOwnerMatch:链接文件的属主和目标文件的属主相同时
        ExecCGI:允许执行cgi脚本
        MultiViews:是否允许内容协商
        None:都不
        All:所有都允许
      Options None 最好
    2.AllowOverride None //允许覆盖?    
        与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)
        All //所有都可以放进去
        None:
        Authconfig
        Limit
        FileInfo
        //对目录访问的映像特别打,因此不建议使用
    3.Order allow,deny //谁可以访问,先匹配allow规则,后匹配deny规则,后面的为默认法则
      Allow from all
        来源地址:
            IP:
            NetAddr:
                172.16
                172.16.0.0
                172.16.0.0/16
                172.16.0.0/255.255.0.0
9.定义路径别名
    Alias /download/ "/rpms/pub"
        http://wwww.baidu.com/download/a.txt 
        /rpms/pub/a.txt 
    格式:
        Alias /URL/ "/Path/to/some_resource"
10.设定默认字符集
    AddDefaultCharset UTF-8
    中文字符集:GBK, GB2312, GB18030
11.日志
    日志类型:访问日志和错误日志
        访问日志:
        错误日志:
    错误日志:
        ErrorLog logs/error_log
        LogLevel warn
    
        LogLevel级别:debug, info, notice, warn, error, crit, alert, emerg.
                当定义到某一个级别的时候:比这个级别高的都要记录
        LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedLogFormat "%h %l %u %t \"%r\" %>s %b" common
        LogFormat "%{Referer}i -> %U" referer
        LogFormat "%{User-agent}i" agent
    访问日志:
        CustemLog logs/access_log combined
                    日志文件        日志格式

1
2
3
4
5
6
7
8
9
10
11
         日志格式中的宏或者其他定义:
         http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats
         %h:client的IP地址
         %l:Remote User:通常为一个减号("-")
         %u:Remote User(from auth;) 非为登录访问时,其为一个减号
         $t:服务器收到请求时的时间
         %r:first line of request,表示请求报文的首行;记录了请求的“方法”,“URL"以及协议版本号
         %>s:响应状态码
         %b:响应报文的大小,bytes,不包含http首部
         %{Referer}i:请求报文中首部"Referer"的值;即从哪个页面中的超链接跳转至当前页面的;
         %(User-Agent);请求报文中首部"User-Agent"的值,即发出请求的程序



12.基于用户的访问控制
    网站中提供的认证:
        1.表单认证
        2.http协议自身提供的认证
    用户认证的过程发送的账号和密码是明文发送的
    
    认证质询:www.Authenticate:响应码为401,拒绝客户端请求,并说明要求client提供账号和密码
    认证:Authentication:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源
    认证方式:
        basic:明文
        digest:消息摘要认证
    安全域:需要用户认证后才能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因
    用户的账号和密码存放于何处:
        虚拟账号:仅用于访问某网络服务时用到认证标识
        存储:
            文本文件;
            SQL数据库;
            ldap目录存储:
    basic认证示例:
        1.定义安全域

1
2
3
4
5
6
7
8
9
10
             <Directory  ""  >
                 Options None
                 AllowOverride None  //其他定义的
                 AuthType Basic
                 AuthName  "String"
                 AuthUserFIle "/path/to/httpd_passwd“
                 require user username1 username2 ...
                 ...
             </Directory>
             Require valid-user  //允许所有用户


        2.提供账号和密码存储(文本文件)
    
    
13.虚拟主机
    站点标识:socket
        IP相同:但端口不同
        IP不同:但端口相同80/443
        FQDN不同:端口和IP相同
            请求报文中首部 //对应的是FQDN
            Host:www.mt.com
    三种实现方案:
        基于ip:为每个虚拟主机至少准备一个ip地址
        基于port:为每个虚拟使用至少一个独立Port
        基于FQDN:为每个虚拟主机使用至少一个FQDN
    注:一般虚拟主机不和中心主机混用,二者选其一
        禁用方法:注释中心主机DocumentRoot指令即可
    虚拟主机的配置方法:
        <VirtualHost IP:PORT>
            ServerName FQDN
            DocumentRoot " "
        </VirtualHost>
        其他可用指令:
            ServerAlias:虚拟主机的别名,可使用多次
            ErrorLog:专用的错误日志
            CustomLog:
            <Directory ...>
                ...
            </Directory>
            Alias 等 //在中心主机中实用的都可以在中心主机上使用

14.status页面 //不能随意允许用户访问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     1.vim httpd.conf 加载模块
       LoadModule status_module modules/mod_status.so
         <Location /server-status>
             SetHandler server-status
             Order deny,allow
             Allow  from  all
         </Location>
         httpd -t
         service httpd reload        
     2.http: //192.168.4.109/server-status
     
     "_"  Waiting  for  Connection,  "S"  Starting up,  "R"  Reading Request,
     "W"  Sending Reply,  "K"  Keepalive (read),  "D"  DNS Lookup,
     "C"  Closing connection,  "L"  Logging,  "G"  Gracefully finishing, //等待所有请求完成后,关闭连接
     "I"  Idle cleanup of worker,  "."  Open slot with no current process


    
    
四、详细实验
前提:
    setenforce 0 //关闭selinux
    iptables -F //清空防火墙规则,防止干扰实验
    
实验1.basic认证
    1.vim httpd.conf

1
2
3
4
5
6
7
8
         <Directory  "/var/www/html/admin" >
                 Options None
                 AllowOverride None
                 AuthType Basic
                 AuthName  "动感地带 Enter Your name"  //提示信息
                 AuthUserFile  "/etc/httpd/conf/.htpasswd"
                 Require user tom
         </Directory>


        httpd -t //检查语法,测试目录中的文件后缀要是.html ,否则会出现登录后“forbidden"
    2.创建密码文件
        htpasswd -c -m  .htpasswd tom //第一次用-c,第二次千万不要用-c
        htpasswd -m  .htpasswd wolf // tom,wolf,jerry
            -m :md5加密存放
            -D:删除用户
            -s:sha加密
            
        Require valid-user //任意用户都可以
    3.基于组认证 //失败

1
2
3
4
5
6
         AuthUserFile  "/etc/httpd/conf/.htpasswd"
         1.AuthGroupFile  "/path/to/grouop_file"
         2.Require  group  Group1 group2
         3.创建用户账号和组账号文件
             组文件:每一行定义一个组
                 GRP_name:username1 username2 ...  //如此简单


        4.require valid_user //允许任意用户访问
    AuthType只有两个:Basic和Diget
        mod_auth_basic  and  by mod_auth_digest


基于组的认证:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
     <Directory  "" >
         Options None
         AllowOverride None
         AuthType Basic
         AuthName "String“
         AuthUserFile   "/PATH/TO/HTTPD_USER_PASSWD_FILE"
         AuthGroupFile  "/PATH/TO/HTTPD_GROUP_FILE"
         Require   group   grpname1  grpname2 ...
     </Directory>        
<Directory / var /www/html/upload/>
     Options None
     AllowOverride None
     AuthType Basic
     AuthName  "Admin Realm"
     AuthUserFile  "/etc/httpd/conf/.htpasswd"
     AuthGroupFile  "/etc/httpd/conf/.htgroup"
     Require  group  mygroup
</Directory>
[root@httpd conf]# cat ./.htgroup    
mygroup: tom Jason
othergroup: obama



实验2:虚拟主机 //一个主机上存放多个网站
一.基于不同ip的虚拟主机 //三个站点使用同一个ip,同一个端口,不同域名
    1.:192.168.4.110/109/111

1
2
3
4
         mkdir -pv /www/{a.com,b.net,c.org}/hdocs
         echo  "a.com"  > /www/a.com/hdocs/index.html
         echo  "c.org"  > /www/c.org/hdocs/index.html
         echo  "b.net"  > /www/b.net/hdocs/index.html

 
    2.vim httpd.conf
        #DocumentRoot "/var/www/html" //注释
        建议新建另外一个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
         vim /etc/httpd/conf.d/virhosts.conf
             < VirtualHost  192.168.4.109:80>
                 ServerName www.a.com
                 DocumentRoot "/www/a.com/hdocs"
             </ VirtualHost >
     
             < VirtualHost  192.168.4.110:80>
                 ServerName www.b.net
                 DocumentRoot "/www/b.net/hdocs"
             </ VirtualHost >
             < VirtualHost  192.168.4.111:80>
                 ServerName www.c.org
                 DocumentRoot "/www/c.org/hdocs"
             </ VirtualHost >


    httpd -t //检查语法
警告信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[root@localhost conf.d]# httpd -t
[Fri Nov 24 07:51:47 2017] [warn] VirtualHost 192.168.154.132:80 overlaps with VirtualHost 192.168.154.132:80, the first has precedence, perhaps you need a NameVirtualHost directive
[Fri Nov 24 07:51:47 2017] [warn] VirtualHost 192.168.154.132:80 overlaps with VirtualHost 192.168.154.132:80, the first has precedence, perhaps you need a NameVirtualHost directive
[Fri Nov 24 07:51:47 2017] [warn] NameVirtualHost *:80 has no VirtualHosts
Syntax OK
[root@localhost conf.d]# cat virtualhost.conf 
NameVirtualHost 192.168.154.132:80
<VirtualHost 192.168.154.132:80>
     Servername wwww.a.com 
     DocumentRoot  "/var/www/html/a.com"
</VirtualHost>
<VirtualHost 192.168.154.132:80>
     Servername wwww.b.net 
     DocumentRoot  "/var/www/html/b.net"
</VirtualHost>
<VirtualHost 192.168.154.132:80>
     Servername wwww.c.org 
     DocumentRoot  "/var/www/html/c.org"
</VirtualHost>


//改成这样,或者把ip地址,改为* 就不会出警告信息了

二.    基于端口 //三个站点,同一个ip,不同端口,不同域名
    ifconfig eth0:0 down //建议把那几个虚拟断开都关了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
     vim vhosts.conf
         Listen 888
         Listen 8888
         <VirtualHost 192.168.4.109:80>
             ServerName www.a.com
             DocumentRoot  "/www/a.com/hdocs"
         </VirtualHost>
         <VirtualHost 192.168.4.109:888>
             ServerName www.b.net
             DocumentRoot  "/www/b.net/hdocs"
         </VirtualHost>
         <VirtualHost 192.168.4.109:8888>
             ServerName www.c.org
             DocumentRoot  "/www/c.org/hdocs"
         </VirtualHost>


    httpd -t
    service httpd restart
    注意:基于端口和基于ip可以混合使用
三.基于FQDN  //同端口,同ip,不同域名
    1.修改配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
         NameVirtualHost 192.168.4.109:80
         < VirtualHost  192.168.4.109:80>
                 ServerName www.a.com
                 DocumentRoot "/www/a.com/hdocs"
         </ VirtualHost >
         < VirtualHost  192.168.4.109:80>
                 ServerName www.b.net
                 DocumentRoot "/www/b.net/hdocs"
         </ VirtualHost >
     
         < VirtualHost  192.168.4.109:80>
                 ServerName www.a.com
                 DocumentRoot "/www/c.org/hdocs"
         </ VirtualHost >


    2.修改自己的host文件,或者改为自己建立的dns            
        vim hosts
            192.168.4.109 www.a.org 
            192.168.4.109 www.b.net 
            192.168.4.109 www.c.org

IP:        不同ip,不同域名,端口号可以相同,也可以不同
Port:    同一ip,不同端口,不同域名
FQDN:    同一ip,同一端口,不同域名

实验3:keepalive的测试
1.另外一条机器安装telnet,模拟访问server:192.168.4.109
    telnet 192.168.4.109 80
    GET /index.html HTTP/1.1  //不行的话,可以HTTP/1.0
    Host: 192.168.4.109
    两个回车
2.KeepAlive On        
    service httpd reload
    再次测试,获取到数据后,不会立即断开
    默认超时时间15s,    
keepalive具体可以参考:http://blog.csdn.net/zlxfogger/article/details/44919995
    
附件:修改alias但是不能访问,alias对应的路径
    Alias /tt/ "/tmp/test/"   //放在DocumentRoot之前就可以了
    DocumentRoot "/var/www/html" 
附件:Could not reliably determine the server's fully quality
    vim httpd.conf
    ServerName MT:80  //主机名为MT
    
书籍推荐:<http协议权威指南>


小结:httpd配置
    Listen [IP:]PORT
    持久链接:
        KeepAlive [On|Off]
    MPM:
        prefork,worker,event
    DSO: LoadModule 
        httpd -l/-M
    DocumentRoot
    访问控制
        1.<Directory> 
            Options Indexes FollowSymLinks
            Order Allow Deny
            Allow from
            Deny from
        </Directory>
        2.<Location>
            <Location /server-status>
                SetHandler server-status
                Order deny,allow
                Allow from all
            </Location>
    定义默认主页面
        DirectoryIndex
    ErrorLog
    CustomLog
    LogFormat
        %{Referer}i:引用Referer首部的信息
    Alias /URL/  "/path/to/somedir/"  //斜线双方要么有,要么都没有
    AddDefaultCharset
    基于用户访问控制
        认证方式:basic,digest //主要使用basic
        AuthType Basic
        AuthName “STIRNG“
        AuthUserFile 
        AuthGroupFile
        Require user/group/valid-user //valid有效的,正当的
        
        .htpasswd
            htpasswd 
    虚拟主机:IP,Port,FQDN










本文转自MT_IT51CTO博客,原文链接:http://blog.51cto.com/hmtk520/2044059,如需转载请自行联系原作者

相关实践学习
基于函数计算快速搭建Hexo博客系统
本场景介绍如何使用阿里云函数计算服务命令行工具快速搭建一个Hexo博客。
相关文章
|
网络协议 Apache
HTTP详解
HTTP详解
1345 0
HTTP详解
|
Web App开发 网络协议 前端开发
|
Web App开发 测试技术 网络安全
|
Web App开发 存储 安全
|
Web App开发 缓存 网络协议
|
数据安全/隐私保护 算法 安全
|
Web App开发 存储 缓存
HTTP请求与相应详解
HTTP请求格式 当浏览器向Web服务器发出请求时,它向服务器传递了一个数据块,也就是请求信息,HTTP请求信息由3部分组成: l   请求方法URI协议/版本 l   请求头(Request Header) l   请求正文 下面是一个HTTP请求的例子: GET/sample.
849 0
|
1月前
|
前端开发
webpack如何设置devServer启动项目为https协议
webpack如何设置devServer启动项目为https协议
141 0
|
3月前
|
Web App开发 移动开发 JavaScript
Python网络编程(三),HTTP协议
Python网络编程(三),HTTP协议
61 0
|
4月前
|
网络协议
【计算机网络-应用层】HTTP协议
【计算机网络-应用层】HTTP协议