_3_2HTTPD和http.md

#APACHE

##相关概念

URI:统一资源标识符,全局范围内。路径。

URL:统一资源定位符。

PV:page view 每天页面访问量 

UV:user view每天独立IP访问量

超链接:跳转文档

端口:

0-1023:众所周知,永久地分配给固定的应用使用,特权端口;

1024-41951:亦为注册端口,但要求不是特别严格,分配给程序注册为某应用使用;3306/tcp, 11211/tcp;

41952+:客户端程序随机使用的端口,动态端口,或私有端口;其范围定义在内核参数/proc/sys/net/ipv4/ip_local_port_range;

BSD Socket:IPC的一种实现,允许位于不同主机(也可以是同一主机)上的进程之间进行通信,发送和接收时建立缓冲套节字。;


    Socket API(封装了内核中的socket通信相关的系统调用)

    SOCK_STREAM: tcp套接字

    SOCK_DGRAM: UDP套接字

    SOCK_RAW:raw套按字

    根据套按字所使用的地址格式,Socket Domain:

    AF_INET:Address Family,IPv4

    AF_INET6:ipv6

    AF_UNIX:同一主机上的不同进程间基于socket套接字通信使用的一种地址;

TCP FSM: CLOSED, LISTEN,SYN_SENT, SYN_RECV, ESTABLISHED, FIN_WAIT1, CLOSE_WAIT, FIN_WAIT2, LAST_ACK, TIMEWAIT,  CLOSED

TCP协议的特性:


建立连接:三次握手;

将数据打包成段:校验和(CRC32)

确认、重传及超时;

排序:逻辑序号;

流量控制:滑动窗口算法;

拥塞控制:慢启动和拥塞避免算法;


(1)发起申请,占用一个端口。

(2)绑定端口。

(3)监听

(4)access访问调用,一直阻塞到客户连接到达。等待建立通信。

(5)


http:hyper text transfer protocol  ,  超文本传输协议。

html:hyper text mark language  ,超文本标记语言.

```

TITLE


fsdfa

blabla... bla...

   //段落

```

css: Cascading Style Sheet  一种用来表示HTML或XML等文件样式的计算机语言,网页表现与内容分离。对所网页中的对象进行像素级别的排版: HTML的样式格式控制语言。

browser浏览器,客户端代理。

WEB(web resource)资源类型(见下的路径映射方式):

静态资源:原始形式与响应内容一致,无须服务端做出额外处理。.jpg, .png, .gif, .html, txt, .js, .css, .mp3, .avi;

动态资源:原始形式通常为程序文件,需要在服务器端执行之后,将执行结果返回给客户端;服务器端存储不是HTML,是程序脚本。脚本接受参数后生成HTML文档。把生成文档发给客户端。执行脚本的是应用服务器。web服务器不执行。


    客户端技术: javascript(客户端脚本语言js);    

    服务器端技术:php, jsp(服务器端脚本)


CGI ( Common Gate Intergace)通用网关接口    用来沟通HTML表单和服务器程序的接口,可以让一个客户端,从网页浏览器向执行在网络服务器上的程序传输数据,好像用户在控制远程主机(填表或点击超链接)。让web服务器启动程序处理动态内容。web服务器发起,运行在server端被用户操作所触发。是一个可被其他语言应用的规范集(就是标准)。可由多种语言编写。也就是动态网页技术语言。

注意:一个页面中展示的资源可能有多个;每个资源都需要单独请求;


资源的标识机制:URL

Uniform Resource Locator:用于描述服务器某特定资源的位置;

例如:  http://www.sina.com.cn/index.html (路径基名被省,显示的是默认)              

Scheme(方案)://server[:port][/PATH/TO/SOME_RESOURCE]

使用端口80/TCP,加密HTTPS使用端口443/tcp.

ip  源目地ip    tcp  源目地端口  http  HOST  index.html

协议版本: 

http/0.9:原型版本,功能简陋   针对于文本。强行发图片收到的是乱码。

http/1.0: cache, MIME, method,

    MIME:Multipurpose Internet Mail Extesion(多用途互联网邮件扩展) 。编码非文本,收到后还原,借鉴于smtp。

    method:GET, POST, HEAD,PUT, DELETE,TRACE, OPTIONS

http/1.1:增强了缓存功能;

    spdy

http/2.0:

    rfc 


一次完整的http请求处理过程:


(1) 建立或处理连接:接收请求或拒绝请求;

(2) 接收请求:接收来自于网络上的主机请求报文中对某特定资源的一次请求的过程;

(3) 处理请求:对请求报文进行解析并作出动作,获取客户端请求的资源及请求方法等相关信息;

(4) 访问资源:获取请求报文中请求的资源;

(5) 构建响应报文:定向和重定向的,意义。

(6) 发送响应报文:

(7) 记录日志:

接收请求的模型:


 并发访问响应模型:

- 单进程I/O模型:启动一个进程处理用户请求;这意味着,一次只能处理一个请求,多个请求被串行响应;

- 多进程I/O结构:并行启动多个进程,每个进程响应一个请求;

- 复用的I/O结构:一个进程响应n个请求;

    - 多线程模式:一个进程生成n个线程,一个线程处理一个请求;

     - 事件驱动(event-driven):一个进程直接n个请求;

- 复用的多进程I/O结构:启动多个(m)个进程,每个进程生成(n)个线程;

    响0应的请求的数量:m*n    


C10k是瓶颈。

处理请求:分析请求报文的http请求报文首部

http协议:

    http请求报文首部

    http响应报文首部


html报文主体

请求报文

```

 //请求方法

  //

 

HEADERS:(name:value)

```

file\.ht  模式匹配

响应报文语法:


    

    //什么格式

    


web服务器的资源路径映射方式:


(a) docroot 

(b) alias

(c) 虚拟主机的docroot

(d) 用户家目录的docroot 

http请求处理中的连接模式:

保持连接(长连接):keep-alive

时间:    数量:   这两个维度上控制连接

非保持连接(短连接):

http服务器程序:


    httpd (apache)

    nginx(俄国人)

    lighttpd(德国人)

应用程序服务器:


    IIS: .Net 

    tomcat: .jsp


www.netcraft.com 

httpd的安装和使用:

ASF: (apache software foundation)

httpd:apache

a patchy server = apache

httpd


状态代码:

1xx: 纯信息                                           

2xx:“成功”类的信息(200)

3xx:重定向类的信息(301 302 304)

4xx : 客户端错误信息(404,找不到)

5xx :服务器端错误类的信息()


***

##httpd的特性:

 1事先创建进程

  2. 按需维持启动适当的进程

  3.模块化设计,核心小,各种功能模块添加·

高度模块化: core + modules

DSO:dynamic shared object  动态共享模块   httpd -M  //可查看编译进去的模块。httpd -l 查看

MPM:Multipath processing Modules (多路处理模块),有windows上的mpm_winnt (2.4支持动态装卸,2.2不支持。)

- prefork:(预派生,生成一个请求,过1秒再生成一个请求,再过一秒生成2个,然后按照指数方式生成。)多进程模型,每个进程响应一个请求;

一个主进程:负责生成子进程及回收子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;

n个子进程:每个子进程处理一个请求;

工作模型:会预先生成几个空闲进程,随时等待用于响应用户请求;最大空闲和最小空闲;

    (一个请求一个进程,稳定可靠,性能差)

- worker:多进程多线程模型,每线程处理一个用户请求;    

一个主进程:负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;

多个子进程:每个子进程负责生成多个线程;

每个线程:负责响应用户请求;

并发响应数量:m*n

        - m:子进程数量

        - n:每个子进程所能创建的最大线程数量;

      (web生成多个进程,每个进程生成多个线程,一个请求用一个线程,多个线程共享一个资源,效率高,但写入时会造成竞争)

- event:事件驱动模型,多进程模型,每个进程响应多个请求;

    一个主进程 :负责生成子进程;负责创建套接字;负责接收请求,并将其派发给某子进程进行处理;

           子进程:基于事件驱动机制直接响应多个请求;

        (基于事件一个进程处理多个请求)httpd-2.2: 仍为测试使用模型;httpd-2.4:event可生产环境中使用;

event :机制解释。内部并没有什么线程来为每一个连接创建一个独立的处理逻辑。但在其内部是基于事件驱动的机制(当请求到来的时候,请求需要等待的时候,请求找了一个内存空间记录状态 ,I/O完成时,会继续进行操作)


httpd的功能特性:

    

CGI:Common Gateway Interface

虚拟主机:IP,PORT, FQDN

反向代理

负载均衡

路径别名

丰富的用户认证机制

basic 

digest

支持第三方模块

......

***


安装httpd:

    rpm包:CentOS 发行版中直接提供;

    编译安装:定制新功能,或其它原因;


httpd方法:

 server/client间传输数据方法: GET浏览器直接向WWW服务器请求数据,POST客户端上传。   HEAD服务器响应给客户端的数据。  OPTIONS 服务器响应给client的功能和方法。DELETE删除一些资源。下载PUT

***

##httpd的配置文件内容:

###Centos6:http2.2

主程序文件:


    /usr/sbin/httpd(MPM:prefork)多道处理模块叫profork。默认

    /usr/sbin/httpd.event

    /usr/sbin/httpd.worker 

服务脚本:


    /etc/rc.d/init.d/httpd   启动工作端

    /etc/sysconfig/httpd   服务脚本配置文件 (7上环境配置文件) ,改变工作模型。红帽默认profork。

先启动的进程httpd(master process)用户和组都是root,然后启动其他进程httpd(worker process)用户和组为apache。1024以下的端口必须由root启动。

配置文件:

    

    /etc/httpd:工作根目录,相当于程序的安装目录。

    /etc/httpd/conf/httpd.conf   配置文件目录,但配置文件被分段。

    /etc/httpd/conf.d/*.conf   

配置文件/etc/httpd/conf/httpd.conf最主要配置文件·`/etc/httpd/conf.d/*.conf`额外参数的配置文件。可以将自己的额外参数独立出来,启动apsche时自动读入主配置文件中。

模块路径,各种功能:


    /etc/httpd/modules:  magic  非纯文本   htab  压力测试工具 

日志文件:

    

    /var/log/httpd

        access_log:访问日志

        error_log: 错误日志

    /etc/httpd/logs(软连接) ----->/var/log/httpd  日志目录  日志文件有两类:访问日志access_log,错误日志err_log.


`/var/www/html ` web的资源存放的目录,存放静态页面或者动态资源运行生成结果。路径也称为DocRoot. ` /var/www/cgi-bin`  动态页面目录       ; `/etc/httpd/htdigest`用户帐号目录。 

服务控制和启动:

```

chkconfig  httpd  on|off

service  {start|stop|restart|status|configtest|reload}  httpd

```

###Centos7:httpd-2.4

 配置文件:


    /etc/httpd/conf/httpd.conf

    /etc/httpd/conf.d/*.conf

    模块相关的配置文件:/etc/httpd/conf.modules.d/*.conf

systemd unit file:

    

    /usr/lib/systemd/system/httpd.service

主程序文件:

    

    /usr/sbin/httpd

    httpd-2.4支持MPM的动态切换;

日志文件:

    

    /var/log/httpd:

    access_log:访问日志

    error_log:错误日志

站点文档:

    

    /var/www/html

模块文件路径:

    

    /usr/lib64/httpd/modules

服务控制:

```

systemctl  enable|disable  httpd.service

systemctl  {start|stop|restart|status}  httpd.service

```

***

#httpd的部分参数

***

##httpd-2.2的常用配置

主配置文件:/etc/httpd/conf/httpd.conf   `grep -i -A 3  "Section"  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

        (1) 省略IP表示为0.0.0.0;

        (2) Listen指令可重复出现多次,监听多个端口;            

            Listen  80

            Listen  8080

        (3) 修改监听socket,重启服务进程方可生效;

###2.持久连续

Persistent Connection:tcp连续建立后,每个资源获取完成后不全断开连接,而是继续等待其它资源请求的进行; 

        如何断开?    数量限制; 时间限制

副作用:对并发访问量较大的服务器,长连接机制会使得后续某些请求无法得到正常 响应;

折衷:使用较短的持久连接时长,以及较少的请求数量;

    

    KeepAlive  On|Off

    KeepAliveTimeout  15

    MaxKeepAliveRequests  100

测试:


    telnet  WEB_SERVER_IP  PORT

    GET  /URL  HTTP/1.1

    Host: WEB_SERVER_IP

使用keep-alive使用以上进行

###3.MPM 

httpd-2.2不支持同时编译多个MPM模块,所以只能编译选定要使用的那个;CentOS 6的rpm包为此专门提供了三个应用程序文件,httpd(prefork), httpd.worker, httpd.event,分别用于实现对不同的MPM机制的支持;确认现在使用的是哪下程序文件的方法:

`ps  aux  | grep httpd`

默认使用的为/usr/sbin/httpd,其为prefork的MPM模块 ;

查看httpd程序的模块列表:

    查看静态编译的模块:` httpd  -l`

    查看静态编译及动态编译的模块:` httpd  -M`

更换使用httpd程序,以支持其它MPM机制;

```

vim /etc/sysconfig/httpd

    HTTPD=/usr/sbin/httpd.{worker,event}

```


注意:重启服务进程方可生效

MPM配置:

prefork的配置

    

    

    StartServers       8      //开始启动的进程

    MinSpareServers    5    //最小空闲进程

    MaxSpareServers   20    // 最大空闲进程

    ServerLimit      256         //给maxclient定线,最大启动进程的数量

    MaxClients       256                //最多多少并发连接 

    MaxRequestsPerChild  4000             //一个进程最多响应多少次

                //

worker的配置:


    

    StartServers         4      //不大于最大空闲进程

    MaxClients         300

    MinSpareThreads     25

    MaxSpareThreads     75

    ThreadsPerChild     25   //每个进程生成的线程

    MaxRequestsPerChild  0  //能处理多少手里多少

    

###4.DSO 配置指定实现模块加载

    LoadModule     模块文件路径可使用相对路径: 相对于ServerRoot(默认/etc/httpd) 

###5.定义'Main' server的文档页面路径     

    DocumentRoot  "" 文档路径映射: `DoucmentRoot`指向的路径为URL路径的起始位置。 需要关闭selinux。

其相当于站点URL的根路径;`(FileSystem) /web/host1/index.html  -->  (URL)  /index.html` 文件系统路径映射至URL路径。

###6.站点访问控制常见机制 可基于两种机制指明对哪些资源进行何种访问控制

 文件系统路径:


    

     ...     

         

         

    ...     

           //单个文件

      //匹配到的模式可以被管控,但正则效率低。     

    ...     

    

URL路径: 

    

        

     ...     

         

         

    ...     

     

``中“基于源地址”实现访问控制:

(1) Options;     后跟1个或多个以空白字符分隔的“选项”列表;

    `vim http.conf`  改掉以下的危险选项。    


    Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用户;注释掉,开着危险。

    FollowSymLinks:允许跟踪符号链接文件所指向的源文件;

    None:

      All: 

(2)  AllowOverride 与访问控制相关的哪些指令可以放在.htaccess文件(每个目录下都可以有一个)中;     

    All:

    None:

(3) order和allow、deny     

    order:定义生效次序;写在后面的表示默认法则;     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  四种表示方式

vim /etc/httpd.conf/

###7.定义站点主页面:

    

    DirectoryIndex  index.html  index.html.var

###8.定义路径别名

格式:

    

    Alias  /URL/  "/PATH/TO/SOMEDIR/"   //最后的斜杠要有都有,要没都没。

    DocumentRoot "/www/htdocs"

    http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 

    /www/htdocs/download/bash-4.4.2-3.el6.x86_64.rpm 

    

    Alias  /download/  "/rpms/pub/"        把 /download/文件下应的资源定向至/rpms/pub/, 会到后者目录下寻找内容。

    http://www.magedu.com/download/bash-4.4.2-3.el6.x86_64.rpm 

    /rpms/pub/bash-4.4.2-3.el6.x86_64.rpm

    http://www.magedu.com/p_w_picpaths/logo.png

    /www/htdocs/p_w_picpaths/logo.png



###9.设定默认字符集

    

    AddDefaultCharset  UTF-8;    中文字符集:GBK, GB2312, GB18030

###10.日志设定

    日志类型:访问日志 和 错误日志

错误日志:


    ErrorLog  logs/error_log   //符号链接,真实的是指向/var/log/http

    LogLevel  warn

    Possible values include: debug, info, notice, warn, error, crit, alert, emerg.  //警报级别。

CustomLog访问日志:


    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined //混合格式

    CustomLog  logs/access_log  combined

    LogFormat format strings:

        http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats

    %h:客户端IP地址;

    %l:Remote User, 通常为一个减号(“-”);

    %u:Remote user (from auth; may be bogus if return status (%s) is 401);非为登录访问时,其为一个减号;

    %t:服务器收到请求时的时间;

    %r:First line of request,即表示请求报文的首行;记录了此次请求的“方法”,“URL”以及协议版本;

    %>s:响应状态码;

    %b:响应报文的大小,单位是字节;不包括响应报文的http首部;

    %{Referer}i:请求报文中首部“referer”的值;即从哪个页面中的超链接跳转至当前页面的;

    %{User-Agent}i:请求报文中首部“User-Agent”的值;即发出请求的应用程序;

***

###11.基于用户的访问控制  

表单认证:认证邮箱。之类。与下面不同。

以下的内容很少使用。使用认证最好使用表单认证。

HTTPD认证质询:    

`WWW-Authenticate`:响应码为401,拒绝客户端请求,并说明要求客户端提供账号和密码; 

认证:     

`Authorization`:客户端用户填入账号和密码后再次发送请求报文;认证通过时,则服务器发送响应的资源; 

认证方式有两种: 

    basic:明文 ; 

    digest:消息摘要认证;

安全域:需要用户认证后方能访问的路径;应该通过名称对其进行标识,以便于告知用户认证的原因; 

用户的账号和密码存放于何处? 虚拟账号:仅用于访问某服务时用到的认证标识 存储:

    文本文件;

    SQL数据库;

    ldap目录存储(轻量级目录访问控制); basic认证配置示例:

(1) 定义安全域

    

   

    Options None            //容器选项OPtions    None 不支持任何选项

    AllowOverride None           //添加认证模块  {AuthConfig }

    AuthType Basic           //       认证类型basice  还有别的方式

    AuthName "String“               //认证提示

    AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"    //认证用户所存放的文件    

    Require  user  username1  username2 ...     // 允许文件下的所有用户或部分用户验证    

    


允许账号文件中的所有用户登录访问:     `Require  valid-user`

其他选项:indexes  允许索引目录,FollowSyLinks允许访问符号链接。  includes:允许执行服务器端包含SSI    ExecCGI 允许执行CGI。  All执行所有。

Order:用于基于主机的访问控制。deny和allow的顺序有意义

(2) 提供账号和密码存储(文本文件) 使用专用命令完成此类文件的创建及用户管理;创建验证

```

htpasswd  [options]   /PATH/TO/HTTPD_PASSWD_FILE  username 

    -c:自动创建此处指定的文件,因此,仅应该在此文件不存在时使用(第一次创建文件);

    -m:md5格式加密     // /etc/httpd/conf/.htpasswd

    -s: sha格式加密   

    -D:删除指定用户 

```      

另外:基于组账号进行认证; 

(1) 定义安全域

    

    

    Options None     

    AllowOverride None

    AuthType Basic     

    AuthName "String“     

    AuthUserFile  "/PATH/TO/HTTPD_USER_PASSWD_FILE"     

    AuthGroupFile "/PATH/TO/HTTPD_GROUP_FILE"   //认证组/etc/httpd/conf/htpasswd      

    Require  group  grpname1  grpname2 ...      // 认证组    

    //Require  user  hadoop    只允许hadoop一个用户登录  


(2)创建用户账号和组账号文件;     组文件:每一行定义一个组 `GRP_NAME: username1  usernam...`  空格隔开


***


###12.虚拟主机

`httpd -t`  测试配置文件是否有错。   

物理服务器,web程序只有有一个,但提供的站点有多个。

站点标识: socket

    IP相同,但端口不同;

    IP不同,但端口均为默认端口;

    FQDN不同;

   请求报文中首部来使FQDN不同时请求资源。       Host: www.magedu.com

虚拟主机的配置使用主配置文件中的块。但为便于管理一般在单独的 /etc/httpd/conf.d的单独的.conf文件中。

注意:一般虚拟机不要与中心主机混用;因此,要使用虚拟主机,得先禁用'main'主机;

    禁用方法:注释中心主机的DocumentRoot指令即可;

虚拟主机配置:

1.基于多IP地址  为每个虚拟主机准备至少一个ip地址;

2.基于多port--为每个虚拟主机使用至少一个独立的port;

3.基于多域名---为每个虚拟主机使用至少一个FQDN;

虚拟主机的配置方法:

    

    

    ServerName FQDN

    DocumentRoot  ""

    

其它可用指令:

    

    ServerAlias:虚拟主机的别名;可多次使用;

    ErrorLog:

    CustomLog:

    

    ...

    

    Alias

    ... 

基于IP的虚拟主机示例:

1.配置网卡,添加IP。

2.添加不同的文件的内容。

3./etc/httpd/conf.d/vhosts.conf

```

    

    ServerName www.a.com

    DocumentRoot "/www/a.com/htdocs"

    

    ***

    

    ServerName www.b.net

    DocumentRoot "/www/b.net/htdocs"

    

```

基于端口的虚拟主机:

```    

    

    ServerName www.a.com

    DocumentRoot "/www/a.com/htdocs"

   

    

    ServerName www.b.net

    DocumentRoot "/www/b.net/htdocs"

    

```

基于FQDN的虚拟主机:

如果不配置DNS则需要改动hosts文件。  

```

NameVirtualHost 172.16.100.6:80    //这条需要添加。


ServerName www.a.com

DocumentRoot "/www/a.com/htdocs"


ServerName www.b.net

DocumentRoot "/www/b.net/htdocs"

```

####配置过程

在server端

```

mkdir  -p  /srv/{default,192.168.1.201}/www                 //创建两个目录 ,多FQDN虚拟主机

vim /srv/defaule/www/index.html                 //       编辑可访问内容  

    ahhaha                  

vim /srv/192.168.1.201/www     wangzhengwei                //同上

restorecon -Rx     /srv/                                                       //重置/srv/的selinux

vim /etc/httpd/conf.d/00-default-vhost.conf                                 //虚拟主机配置文件

                                                        //块的主标记,告诉httpd应该为通过此端口或iP的连接考虑这里。

    DocumentRoot /srv/default/www                                    //此处为httpd可搜索目录。

    CustomLog "logs/default-vhost.log" combined                 //指定日志类型

                                                                           //结束

                                               //进一步定义可访问权限

    Require all granted                                                                //允许访问此目录

                                                                                    //结束

vim /etc/httpd/conf.d/01-192.168.1.201-vhost.conf                      //

                                                                  //

    ServerName 192.168.1.201                                                //名字

    ServerAlias   www12                                                                 //别名

    DocumentRoot  /srv/192.168.1.201/www                 //别名

    CustomLog "logs/192.168.1.201"  combined             //日志类型

                                         // 

            //                   

    Require all granted                                 //允许http访问

   

systemctl start httpd.service                    //开启服务

systemctl enable  httpd.service                   //开机自启

firewall-cmd --permanent --add-service=http       //开启防火墙对http的禁止

firewall-cmd --permanent  --reload                   //开启防火墙

```

***

###13status页面

LoadModule  status_module  modules/mod_status.so  //需要装载这个库文件

访问xxx/server-staus     //查看服务器状态。

   

    

    SetHandler server-status

    Order allow,deny

    Allow from 172.16   //仅应该开放给监控主机

    

###14.curl命令

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服务器等等,功能十分强大。

MIME(多用途互联网邮件扩展): major/minor(主次),  p_w_picpath/png, p_w_picpath/gif,text/html

```

curl  [options]  [URL...]

  curl的常用选项:

    -A/--user-agent 设置用户代理发送给服务器 伪装成别的浏览器而不是curl

    --basic 使用HTTP基本认证

    --tcp-nodelay 使用TCP_NODELAY选项

    -e/--referer 来源网址,伪装从哪来(从哪个页面跳转来)

    --cacert CA证书 (SSL)

    --compressed 要求返回是压缩的格式,传输的时候是压缩的,过来自动解压

    -H/--header 自定义首部信息传递给服务器

    -I/--head 只显示响应报文首部信息

    --limit-rate 设置传输速度

    -u/--user 设置服务器的用户和密码

    -0/--http1.0 使用HTTP 1.0,否则1.1

    -k  接收证书不受信任的情况

    -s    //静默模式,错误不返回信息,但会返回正确信息

    -X PUGER   xxxx //请求修改

    还有很多

```

另一个工具:elinks //文本浏览器。

```

elinks  [OPTION]... [URL]...

    -dump: 不进入交互式模式,而直接将URL的内容输出至标准输出; 用自己的文本显示格式

```

###15.user/group

指定以哪个用户的身份运行httpd服务进程;

安全起见,如果程序被劫持,则被劫持的程序会以运行身份访问其他有权访问的程序。所以很多服务是以管理员身份启动,创建子进程以非管理员身份运行。

    User apache 

    Group apache 

SUexec //机制,切换为另外一个机制。

不同安装方式不同方式。

###16.使用mod_deflate模块压缩页面    //优化传输速度

适用场景:

    (1) 节约带宽,额外消耗CPU;同时,可能有些较老浏览器不支持;

    (2) 压缩适于压缩的资源,例如文件文件;


    SetOutputFilter DEFLATE  //设置输出过滤器,资源过滤器,过滤出来的进行压缩。

    mod_deflate configuration //主配置文件中应该有这个共享模块。

   

     #Restrict compression to these MIME types

    AddOutputFilterByType DEFLATE text/plain     //以下类型的进行过滤·。

    AddOutputFilterByType DEFLATE text/html

    AddOutputFilterByType DEFLATE application/xhtml+xml

    AddOutputFilterByType DEFLATE text/xml

    AddOutputFilterByType DEFLATE application/xml

    AddOutputFilterByType DEFLATE application/x-javascript

    AddOutputFilterByType DEFLATE text/javascript

    AddOutputFilterByType DEFLATE text/css

 

Level of compression (Highest 9 - Lowest 1)  

    

    DeflateCompressionLevel 9     //指明压缩级别

复制到此处

Netscape 4.x has some problems.

    

    BrowserMatch ^Mozilla/4  gzip-only-text/html  //排除一些浏览器

Netscape 4.06-4.08 have some more problems

    

    BrowserMatch  ^Mozilla/4\.0[678]  no-gzip

MSIE masquerades as Netscape, but it is fine


    BrowserMatch \bMSI[E]  !no-gzip !gzip-only-text/html

编辑配置文件加入`#Deflate,添加复制内容。


###17.https,  http over ssl 

SSL会话的简化过程

1. 客户端发送可供选择的加密方式,并向服务器请求证书;

2. 服务器端发送证书以及选定的加密方式给客户端;

3. 客户端取得证书并进行证书验正:

    如果信任给其发证书的CA:

    1. 验正证书来源的合法性;用CA的公钥解密证书上数字签名;

    2. 验正证书的内容的合法性:完整性验正

    3. 检查证书的有效期限;

    4. 检查证书是否被吊销;

    5. 证书中拥有者的名字,与访问的目标主机要一致;

4. 客户端生成临时会话密钥(对称密钥),并使用服务器端的公钥加密此数据发送给服务器,完成密钥交换;

5. 服务用此密钥加密用户请求的资源,响应给客户端;


注意:SSL会话是基于IP地址创建;所以单IP的主机上,仅可以使用一个https虚拟主机;

回顾几个术语:PKI,CA,CRL,X.509 (v1, v2, v3)

配置httpd支持https:

(1) 为服务器申请数字证书;  $背会!$

测试:通过私建CA发证书

    (a) 创建私有CA

    (b) 在服务器创建证书签署请求

    (c) CA签证

(2) 配置httpd支持使用ssl,及使用的证书;

    yum -y install mod_ssl

配置文件:/etc/httpd/conf.d/ssl.conf

```

 //启用一个虚拟主机,蹦极上有多个虚拟主机时。访问默认的。

Document//虚拟主机有的都有

ServerName //xxx

```

配置修改:

```

    DocumentRoot   /PATH/TO/DIR

    ServerName     www.DOMAIN.com

    SSLCertificateFile    .crs   //证书

    SSLCertificateKeyFile    .key    //私钥文件

    SSLCipherSuite   //默认支持的加密方式

```

注意:如果在虚拟主机中centso7还应该在中加入的权限控制。或者在vhost文件的外面写上 权限。比较奇葩的设置。

如果用户忘记写https则网站需要些URL重定向来跳转至443在nginx中讲授。

(3) 测试基于https访问相应的主机;

```

openssl  s_client  [-connect host:port] [-cert filename] [-CApath directory] [-CAfile filename]

openssl s_client -connect www.magedu.com:443 -CAfile /etc/pki/CA/cacert.pem  //验证方式,不指C会失败

```

图形化界面应该选择授权中心导入证书。访问时的主机明和访问地址最好一样。不导入证书时会出现风险提示。 通常一个IP只能建立一个虚拟主机加密。

###18.httpd自带的工具程序

```

httpd -t  测试配置文件是否有错。

httpd -l  查看编译文件

httpd -M  //查看加载模块(静态和动态)

htpasswd:basic认证基于文件实现时,用到的账号密码文件生成工具;

apachectl:httpd自带的服务控制脚本,支持start和stop;

apxs:由httpd-devel包提供,扩展httpd使用第三方模块的工具;

rotatelogs:日志滚动工具,数字越大日期越靠前,通过时间和空间;

    access.log -->

    access.log, access.1.log  --》

    access.log, acccess.1.log, access.2.log

suexec:访问某些有特殊权限配置的资源时,临时切换至指定用户身份运行;

ab: apache bench //压力测试工具

```

apachectl

```

apchectl

    configtest    //检查设置文件中的语法是否正确。

  fullstatus    //显示服务器完整的状态信息.

    graceful    //重新启动Apache服务器,但不会中断原有的连接。

 help    //显示帮助信息。

 restart    //重新启动Apache服务器。

 start    //启动Apache服务器。

 status    //显示服务器摘要的状态信息。

 stop    //停止Apache服务器。

```

###19.httpd的压力测试

常见的压力测试工具:ab, webbench, http_load, seige

jmeter, loadrunner //图形化,后者是以个测试工具。

tcpcopy:网易开发开源,复制生产环境中的真实请求,并将之保存下来;

ab (Apache bench)自带测试工具,可以在web服务器本地发起测试,反映出测试的本质都是基于HTTP。

```

ab  [OPTIONS]  URL

    -n:总请求数;

    -c:模拟的并行数; c

    -k:以持久连接模式 测试;

    -t :持续时间。

```

反馈参数:


    Document length  //请求页面大小

    Concurrency Level   //并发量

    Time taken for tests  //测试总耗时。顺便提一下,某些Apache版本如2.2.4附带的ab,对于这一统计项存在一些计算上的bug,当总请求数较少时,其统计的总时间会无法小于0.1s。

    Complete requests  //完成请求

    Failed  requests //失败的请求    。表示失败的请求数,这里的失败是指请求的连接服务器、发送数据、接收数据等环节发生异常,以及无响应后超时的情况。对于超时时间的设置可以用ab的-t参数。而如果接受到的http响应数据的头信息中含有2xx以外的状态码,则会在测试结果显示另一个名为“Non-2xx     responses”的统计项,用于统计这部分请求数,这些请求并不算是失败的请求。

    Write errors 0 //错误

    Total transferred  //表示所有请求的响应数据长度总和,包括每个http响应数据的头信息和正文数据的长度。注意这里不包括http请求数据的长度,所以Totaltransferred代表了从Web服务器流向用户PC的应用层数据总长度。通过使用ab的-v参数即可查看详细的http头信息。

    HTML transferred  //表示所有请求的响应数据中正文数据的总和,也就是减去了Total transferred中http响应数据中头信息的长度。

    Requests per second   //(每秒请求数)这便是我们重点关注的吞吐率,它等于:Complete requests / Time taken for tests

    Time per request //这便是前面提到的用户平均请求等待时间,它等于:Time taken for tests / (Complete requests /Concurrency Level)

    Time per request?(across all concurrent requests)  //这便是前面提到的服务器平均请求处理时间,它等于:Time taken for tests / Complete requests

    这正是吞吐率的倒数。同时,它也等于:Time per request / Concurrency Level

    Transfer rate  //表示这些请求在单位时间内从服务器获取的数据长度,它等于:Total transferred / Time taken for tests    这个统计项可以很好的说明服务器在处理能力达到限制时,其出口带宽的需求量。
    利用前面介绍的有关带宽的知识,不难计算出结果。

    Percentage of the requests served within a certain time(ms)  //这部分数据用于描述每个请求处理时间的分布情况。


来源: https://blog.linuxeye.com/124.html


重要反馈:Connection Times  connect (建立连接时间太长,服务器和带宽)processing(处理连接,io问题)waiting(客户端等待时间从发完到接收完,带宽,客户端能力)total(总时间)

***

#httpd-2.4

##新特性:

(1) MPM支持运行为DSO机制;以模块形式按需加载;

(2) event MPM生产环境可用;

(3) 异步读写机制。和平台相关,后面讲;

(4) 支持每模块及每目录的单独日志级别定义,用不到;

(5) 每请求相关的专用配置;

(6) 增强版的表达式分析式;

(7) 毫秒级持久连接时长定义;

(8) 基于FQDN的虚拟主机也不再需要NameVirutalHost指令,废弃指令;

(9) 新指令,AllowOverrideList。哪些文件指令可以放置在.htaccess;

(10) 支持用户自定义变量;

(11) 更低的内存消耗;


新模块:

(1) mod_proxy_fcgi   //基于fcgi交互php服务器

(2) mod_proxy_scgi //反向代理时使用

(3) mod_remoteip        //基于IP的访问控制机制

##安装httpd-2.4

依赖于apr-1.4+, apr-util-1.4+, [apr-iconv]

apr: apache portable runtime  针对不同OS的底层像一个虚拟机,支撑不同平台编译上层apache。

###CentOS 6编译安装2.9:

默认:apr-1.3.9, apr-util-1.3.9

开发环境包组:Development Tools, Server Platform Development

开发程序包:pcre-devel 

编译安装步骤:

以下的内容并没有启动脚本。控制任务启动的脚本服务都是有rpm的制作者制作。改2.2的就行了。。

(1)apr-1.4+

```

./configure  --prefix=/usr/local/apr

make && make install

```

(2) apr-util-1.4+

```

./configure  --prefix=/usr/local/apr-util  --with-apr=/usr/local/apr

make && make install

```

(3) httpd-2.4

```

./configure --prefix=/usr/local/apache24 --sysconfdir=/etc/httpd24  --enable-so --enable-ssl --enable-cgi --enable-rewrite(支持url的重写) --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --enable-modules=most(大多数常用) --enable-mpms-shared=all --with-mpm=prefork

make  && make install

```

```

yum groupinstall "Development Tools"    "Server Platfrom Development"        //安装开发环境

yum install pcre-devel    //支持pcre模块

官方站点找apr,或者教室的网 Sources/sources/httpd/

下面步骤接上。

``` 

编译安装文件时用过的命令

`(安装目录)/build/config.nice`


    error   //请求错误的页面    

    htdocs //网页文件存放位置

    incons     //图标

    include    //库文件

    logs//日志    

    man    //帮助

    manual    //方文档    

    modules    //模块

自带的服务控制脚本:apachectl,这个命令不在PATH下。在/usr/local/apach(安装目录)/bin下

```

/usr/local/apche24/bin/apchectl  start|stop

```

加PATH,`export PATH=/usr/local/apache24/bin/bin:$PATH`或者添加到profile中,如下。

`vim/etc/profile.d/httpd.sh` `export PATH=/usr/local/apache24/bin/bin:$PATH`

ldconfig -v   //查看系统加载的库文件


```

cd /etc/rc.d/init.d/  cp httpd httpd24

vim httpd24

//将if [ -f /etc/sysconfig/httpd ] ;then   . /etc/sysconfig/httpd  注释掉

httpd=${HTTPD-(/usr/local/apache24)/bin/httpd}    //改文件路径,换成括号中的值

pidfile=${PIDFILE-(安装目录)/logs/httpd.pid}     //改pid路径,这里可以同时

lockfile=${LOCKFILE-//var/lock/subsys/(httpd24)}  //修改锁文件的信息。保存退出

chkconfig --add /etc/rc.d/init.d/httpd24

chkconfig --level 2345 httpd24  on //启动等级

chkconfig --list httpd24  //查看

```

###CentOS 7:

```

yum install  httpd

```

##配置

配置文件:


    /etc/httpd/conf/httpd.conf

    /etc/httpd/conf.modules.d/*.conf

    /etc/httpd/conf.d/*.conf

配置应用:

(1) 切换使用的MPM

编辑配置文件`/etc/httpd/conf.modules.d/00-mpm.conf`,启用要启用的MPM相关的LoadModule指令即可。注释管理。

>centos6上需要在/etc/httpd24/extra/里去掉注释`Include  /etc/httpd24/extra/httpd->mpm.conf`    并改掉LoadModule列表中的mpm项文件,换掉关键字。

>httpd -M查看加载的模块 -t 检查配置文件


没有虚拟主机,只改html所在位置的时候,改主配置文件。

在2.4中默认不许访问网页文件,必须加使用授权。但7上不使用order deny allow这种。

(2) 7基于IP的访问控制

vim /conf      找到/Directory /var/www/html 换掉目录,在底下的Require中修改all granted 

允许所有主机访问:Require  all  granted

拒绝所有主机访问:Require  all  deny

控制特定的IP访问:


    Require  ip  IPADDR:授权指定来源的IP访问;

    Require  not  ip  IPADDR:拒绝

控制特定的主机访问:

    Require  host  HOSTNAME:授权指定来源的主机访问;

    Require  not  host  HOSTNAME:拒绝

    HOSTNAME:

        FQDN:特定主机

domin.tld:指定域名下的所有主机,需要写在另外的容器中

```

Require all granted

Require not ip 172.16.100.2

```

(3) 虚拟主机

基于FQDN的虚拟主机也不再需要NameVirutalHost指令,6上有;

注释掉document目录,2.4中只有明确授权才允许访问。

```

    

    ServerName www.b.net

    DocumentRoot "/apps/b.net/htdocs"

    

    Options None

    AllowOverride None

    Require all granted

    

   

```

注意:任意目录下的页面只有显式授权才能被访问;

(4) ssl   是个单独的模块,安装后有模块文件,配置文件

(5)  KeepAliveTimeout  #ms 2秒就够短了。

在主文件中加入`KeepAlive On    KeepAliveTimeout  30ms    MaxkeepAliveRequests  20`

毫秒级持久连接时长定义;

***


***

#URL:Unifrom Resource Locator

URL方案:scheme

服务器地址:ip:port

资源路径:

`http://www.magedu.com:80/bbs/index.php, `

`https://`

##基本语法:


    ://:@:/;?#

    方案://账号密码@主机:端口/路径:参数?查询参数#定位锚点。

    params: 参数,类似于填入表单的数据。

        http://www.magedu.com/bbs/hello;gender=f   //传给服务器的参数

    query:传递给页面程序的selset向数据库发起查询操作

        http://www.magedu.com/bbs/item.php?username=tom&title=abc

    frag:片段,长页面做索引的锚定符。如下

https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html#ch-Boot-x86

子目录都是一个单独应用。资源路径省略将访问资源路径下的默认主页面。

相对URL(不完整的路径,相对于当前路径,获得下一个路径通常是同站内的文档);绝对URL(跨站时使用)

在讲到LVS时,可能通过上述三个选项来实现。

#http协议

http/0.9, http/1.0, http/1.1, http/2.0

本身stateless 无状态协议:

非持久连接(资源可能跨站,无法持续追踪访问者来源。例如访问网站刷新不知道密码张。)服务器无法持续追踪访问者来源

cookie, session(引入这两种机制,追踪同一个用户,避免重复认证,)

 引入cookid的服务器会发送一些随机数据给C可以唯一标识当前用户,C保存数据叫做cookie,C打开多个标签站点,回访网页时C段发送数据个网页。(软件有访问电脑的最高权限。)

后来出来了轻重cookis的概念,胖的记录信息丰富。就出现了轻cookie,但轻的不会记录太多,比如购物车、

出现基于session的机制,C/S两者结合,服务器为每一个客户端浏览器进程创建了一个小的数据结构,在内存记录了访问行为,session 会关联到某个cookie,第一次访问时加一个cookie发送给S,后续带着标识,告诉S,C做了什么。

cookie是基于主机的,session是基于服务器的。可以这么看。

在需要跟踪客户端是需要不断使用以上的机制。

###http事务:

一次响应+一次请求=事物

请求:request 

响应:response

##报文语法格式:


request报文

    

      //起始行,请求URL,http版本。

               //众多的首部 (请求不止一个),后面有两次换行。

               //请求实体。

response报文


       //响应http版本,状态码,原因短语(响应是什么)。

                //响应首部。后面也有两次换行。

                //    响应实体。

method: 请求方法,标明客户端希望服务器对资源执行的动作

GET ,POST ,PUT

version:

    HTTP/.

status:

    三位数字,如200,301, 302, 404, 502; 标记请求处理过程中发生的情况;

reason-phrase:

    状态码所标记的状态的简要描述;

headers:

    每个请求或响应报文可包含任意个首部;每个首部都有首部名称,后面跟一个冒号,而后跟上一个可选空格,接着是一个值;

entity-body:请求时附加的数据或响应时附加的数据;

method(方法):

    

    GET:从服务器获取一个资源;

    HEAD:只从服务器获取文档的响应首部(C请求的资源,会加装一个响应首部,使用get会都返回,使用head只要首部);

    POST:向服务器发送要处理的数据,提交要求,希望服务器对资源属性的操作

    PUT:将请求的主体部分存储在服务器上;

    DELETE:请求删除服务器上指定的文档;

    TRACE:追踪请求到达服务器中间经过的代理服务器;

    OPTIONS:请求服务器返回对指定资源支持使用的请求方法;

协议查看或分析的工具(报文嗅探器):

    

    tcpdump, tshark, wireshark

status(状态码):

方法是客户端请求服务器,而状态码是服务器告诉客户端,你的请求发生了什么

    

    1xx:100-101, 信息提示;

    2xx:200-206, 成功

    3xx:300-305, 重定向

    4xx:400-415, 错误类信息,客户端错误

    5xx:500-505, 错误类信息,服务器端错误

常用的状态码:

    

    200: 成功,请求的所有数据通过响应报文的entity-body部分发送;OK

    301: 请求的URL指向的资源已经被删除;但在响应报文中通过首部Location指明了资源现在所处的新位置;Moved Permanently永久重定向

    302: 与301相似,但在响应报文中通过Location指明资源现在所处临时新位置; Found暂时重定向

    304: 客户端发出了条件式请求,但服务器上的资源未曾发生改变,则通过响应此响应状态码通知客户端;Not Modified

    401: 需要输入账号和密码认证方能访问资源;Unauthorized

    403: 请求被禁止;Forbidden

    404: 服务器无法找到客户端请求的资源;Not Found

    500: 服务器内部错误;Internal Server Error

    502: 代理服务器从后端服务器收到了一条伪响应;Bad Gateway  //代理配置错误

headers:

格式:

    Name: Value    //有多个的话,一行一个。 


    Cache-Control:public, max-age=600

    Connection:keep-alive

    Content-Type:p_w_picpath/png

    Date:Tue, 28 Apr 2015 01:43:54 GMT

    ETag:"5af34e-ce6-504ea605b2e40"

    Last-Modified:Wed, 08 Oct 2014 14:46:09 GMT  //请求首部

    

    Accept:p_w_picpath/webp,*/*;q=0.8

    Accept-Encoding:gzip, deflate, sdch

    Accept-Language:zh-CN,zh;q=0.8

    Cache-Control:max-age=0

    Connection:keep-alive

    Host:access.redhat.com

    If-Modified-Since:Wed, 08 Oct 2014 14:46:09 GMT

    If-None-Match:"5af34e-ce6-504ea605b2e40"

    Referer:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html-single/Installation_Guide/index.html

    User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36  //响应首部,删了cookie了,太长。

##首部的分类:

    

    通用首部

    请求首部

    响应首部

    实体首部

    扩展首部

###通用首部:

    

    Date: 报文的创建时间

    Connection:指明连接状态,如keep-alive, close。

    Via:显示报文经过的中间节点,经过的代理。

    Cache-Control:控制缓存。

    Pragma:缓存相关,了解

###请求首部:

    

    Accept:通过服务器自己可接受的媒体类型;

    Accept-Charset:接受的字符集。

    Accept-Encoding:接受编码格式,如gzip

    Accept-Language:接受的语言(语言和charset是两回事。)

    

    Client-IP: //客户端IP

    Host: 请求的服务器名称和端口号

    Referer:包含当前正在请求的资源的上一级资源;

    User-Agent:客户端代理

条件式请求首部(缓存相关):

    

    Expect://期望,后边会详细

    If-Modified-Since:*自从指定的时间之后,请求的资源是否发生过修改(没修改的直接用缓存);

    If-Unmodified-Since:没修改过的时间。

    If-None-Match:*本地缓存中存储的文档的ETag标签是否与服务器文档的Etag不匹配(不匹配0);

    If-Match:是否匹配

安全请求首部:


    Authorization:向服务器发送认证信息,如账号和密码;

    Cookie: 客户端向服务器发送cookie

    Cookie2:2版本

代理请求首部:


    Proxy-Authorization: 向代理服务器认证

###响应首部:

信息性:

     

    Age:响应持续时长

    Server:服务器程序软件名称和版本,httpd,nginx

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


    Accept-Ranges:服务器可接受的请求范围类型

    Vary:服务器查看的其它首部列表;

安全响应首部:

    

    Set-Cookie:向客户端设置cookie;

    Set-Cookie2: 

    WWW-Authenticate:来自服务器的对客户端的质询认证表单

实体首部:

    

    Allow: 列出对此实体可使用的请求方法。

    Location:告诉客户端真正的实体位于何处。在重定向是使用


    Content-Encoding:编码格式。

    Content-Language:内容语言。

    Content-Length: 主体的长度。

    Content-Location: 实体真正所处位置;

    Content-Type:主体的对象类型

缓存相关:


    ETag:实体的扩展标签;

    Expires:实体的过期时间;

    Last-Modified:最后一次修改的时间;