关于Apache

时间:2024-03-21 12:54:43

文章目录

    • 一、httpd 安装组成
      • 1、常见http 服务器程序
      • 2、apache 介绍和特点
        • 2.1 关于apache
          • 2.1.1 apache 功能
          • 2.1.2 apache特性
        • 2.2 MPM multi-processing module 工作模式
          • 2.2.1 prefork
          • 2.2.2 worker
          • 2.2.3 event
      • 3、Httpd 安装和相关文件
        • 3.1 包安装httpd并启动httpd服务
          • 3.1.1 版本说明
          • 3.1.2 安装方式
        • 3.2 httpd-2.4 相关文件
          • 3.2.1 配置文件
          • 3.2.2 检查配置语法
          • 3.2.3 服务单元文件
          • 3.2.4 服务控制和启动
          • 3.2.5 站点网页文档根目录
          • 3.2.6 模块文件路径
          • 3.2.7 主服务器程序文件
    • 二、httpd常见配置
      • 1、指定服务器名
      • 2、包含其它配置文件
        • 2.1 include 子配置文件
        • 2.2 总目录
      • 3、监听地址
      • 4、隐藏服务器版本信息
      • 5、持久连接
      • 6、DSO (Dynamic Shared Object)
      • 7、MPM (Multi-Processing Module)多路处理模块
      • 8、prefork模式相关的配置
      • 9、worker 和 event 模式相关的配置
      • 10、定义Main server的文档页面路径
      • 11、定义站点默认主页面文件
      • 12、虚拟主机
        • 12.1 基于ip地址
        • 12.2 基于端口地址
        • 12.3 基于域名
    • 三、Cookie和session
      • 1、Cookie
      • 2、Session
        • 2.1 cookie和session的相同和不同
        • 2.2 cookie缺点
        • 2.3 session 缺点
    • 四、Web相关工具
      • 1、Weget相关工具
      • 2、curl
      • 3、压力测试工具

一、httpd 安装组成

  • http 服务基于 C/S 结构

1、常见http 服务器程序

  • httpd apache,存在C10K(10K connections)问题
  • nginx 解决C10K问题lighttpd
  • tomcat .jsp 应用程序服务器
  • IIS .asp 应用程序服务器
  • jetty 开源的servlet容器,基于Java的web容器
  • Resin CAUCHO公司,支持servlets和jsp的引擎
  • webshpere:IBM公司
  • weblogic:BEA,Oracle
  • jboss:RedHat,IBM
  • oc4j:Oracle

2、apache 介绍和特点

2.1 关于apache

apache 名字来源,流传最广的解释是(也是最显而易见的):这个名字来自于一个事实,当Apache在1995年初开发的时候,它是由当时最流行的HTTP服务器NCSA HTTPd 1.3的代码修改而成的,因此是"一个修补的(a patchy)”服务器。然而,在Apache服务器官方网站的FAQ中是这么解释的:"Apache这个名字是为了纪念名为Apache的美洲原住民印第安人的一支,众所周知他们拥有高超的作战策略和无穷的耐性。”贝伦多夫说:"我选择阿帕奇这个名字是取其积极含义。阿帕奇族是最后一个屈服于美国*的民族。当时我们担心大公司迟早会参与竞争并‘教化’这块最早的网络之地,所以在我看来,阿帕奇是个很好的名称,也有人说这个词一语双关-因为正如Apache(与"a patchy"谐音)的名字所表明的那样,他们确实是在给服务器打补丁。”

apache官网:

 www.apache.org

软件基金会

  • ASF:apache software foundation
  • FSF:Free Software Foundation
2.1.1 apache 功能
  • 提供http协议服务(提供web网页)
  • 多个虚拟主机:IP、Port、FQDN
  • CGI:Common Gateway Interface,通用网关接口,支持动态程序
  • 反向代理
  • 负载均衡
  • 路径别名
  • 丰富的用户认证机制:basic,digest
  • 支持第三方模块
2.1.2 apache特性
  • 高度模块化:core + modules
  • DSO:Dynamic Shared Object 动态加载/卸载
  • MPM:multi-processing module 多路处理模块

**总结:**apache 功能多,稳定,善于处理静态资源

**HTTP 和 Apache 之间的关系是:**HTTP定义了客户端和服务器之间的通信规则,而 Apache 是一种能够处理这些 HTTP 请求并提供网页内容的 Web 服务器软件。

2.2 MPM multi-processing module 工作模式
2.2.1 prefork

yum安装默认的是prefork工作模式

多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型一个主进程:生成和回收n个子进程,创建套接字,不响应请求多个子进程,工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求

Prefork MPM预派生模式,有一个主控制进程,然后生成多个子进程,每个子进程有一个独立的线程响应用户请求,相对比较占用内存,但是比较稳定,可以设置最大和最小进程数,是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景

image-20240314181945837

  • 优点:稳定

  • 缺点:慢,占用资源,不适用于高并发场景

2.2.2 worker
  • 复用的多进程I/O模型,多进程多线程,IIS使用此模型

一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n

worker MPM是一种多进程和多线程混合的模型,有一个控制进程,启动多个子进程,每个子进程里面包含固定的线程,使用线程程来处理请求,当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,由于其使用了线程处理请求,因此可以承受更高的并发。

  • 优点:相比prefork 占用的内存较少,可以同时处理更多的请求

  • 缺点:使用keep-alive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直等待到超时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用。(该问题在prefork模式下,同样会发生)

2.2.3 event
  • 事件驱动模型(worker模型的变种),CentOS8 默认模型

一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求:m*n,有专门的监控线程来管理这些keep-alive类型的线程,当有真实请求时,将请求传递给服务线程,执行完毕后,又允许释放。这样增强了高并发场景下的请求处理能力。

event MPM是Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型. 属于事件驱动模型(epoll),每个进程响应多个请求,在现在版本里的已经是稳定可用的模式。它和worker模式很像,最大的区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)。event MPM中,会有一个专门的线程来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场景下的请求处理能力event只在有数据发送的时候才开始建立连接,连接请求才会触发工作线程,即使用了TCP的一个选项,叫做延迟接受连接TCP_DEFER_ACCEPT,加了这个选项后,若客户端只进行TCP连接,不发送请求,则不会触发Accept操作,也就不会触发工作线程去干活,进行了简单的防攻击(TCP连接)

image-20240314182840638

image-20240314182950361

  • 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放

  • 缺点:没有线程安全控制

httpd-2.4:event 稳定版,centos7 以后默认

httpd-2.2:event 测试版,centos6 默认

3、Httpd 安装和相关文件

3.1 包安装httpd并启动httpd服务
3.1.1 版本说明

CentOS 7 以上,默认系统是httpd 2.4,CentOS 6 版默认为httpd 2.2

Ubuntu 18.04 默认 Apache/2.4.29

3.1.2 安装方式
  • 包安装: centos发行版,稳定,建议使用
  • 编译:定制或特殊需求
yum  install   httpd -y
#安装httpd 2.4
3.2 httpd-2.4 相关文件
3.2.1 配置文件
  • /etc/httpd/conf/httpd.conf 主配置文件
  • /etc/httpd/conf.d/*.conf 子配置文件
  • /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件

image-20240314185418293

3.2.2 检查配置语法
  • httpd -t 或 apache2 -t

image-20240314185645130

3.2.3 服务单元文件
  • /usr/lib/systemd/system/httpd.service
  • 配置文件:/etc/sysconfig/httpd
3.2.4 服务控制和启动
  • systemctl enable|disable httpd.service
  • systemctl {start|stop|restart|status|reload} httpd.service
  • apachectl start|stop|restart|configtest
  • service httpd start|stop|restart|configtest
3.2.5 站点网页文档根目录

httpd主页面位置:/var/www/html/index.html

3.2.6 模块文件路径
  • /etc/httpd/modules
  • /usr/lib64/httpd/modules
3.2.7 主服务器程序文件
  • /usr/sbin/httpd

二、httpd常见配置

1、指定服务器名

httpd -t
#检查语法

#修改配置文件
vim /etc/httpd/conf/httpd.conf
 95 ServerName www.example.com:80
#取消95行注释

httpd -t
#再次查看语法问题

##注意:修改配置文件之前最好先备份,以防修改错误

image-20240314192754039

2、包含其它配置文件

Include file-path|directory-path|wildcard
IncludeOptional file-path|directory-path|wildcard

说明:

  • Include和IncludeOptional功能相同,都可以包括其它配置文件
  • 但是当无匹配文件时,include会报错,IncludeOptional会忽略错误
2.1 include 子配置文件
[root@localhost conf]#grep -i include /etc/httpd/conf/httpd.conf
Include conf.modules.d/*.conf
    #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
# Possible values include: debug, info, notice, warn, error, crit,
    # If you include a trailing / on /webpath then the server will
    # To parse .shtml files for server-side includes (SSI):
    # (You will also need to add "Includes" to the "Options" directive.)
    AddOutputFilter INCLUDES .shtml
IncludeOptional conf.d/*.conf

image-20240314193239041

2.2 总目录
[root@localhost conf]#grep -i serverroot /etc/httpd/conf/httpd.conf
# with "/", the value of ServerRoot is prepended -- so 'log/access_log'
# with ServerRoot set to '/www' will be interpreted by the
# ServerRoot: The top of the directory tree under which the server's
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# same ServerRoot for multiple httpd daemons, you will need to change at
ServerRoot "/etc/httpd"

image-20240314193340762

3、监听地址

Listen [IP:]PORT

说明:

  • 省略IP表示为本机所有IP

  • Listen指令至少一个,可重复出现多次

vim /etc/httpd/conf/httpd.conf
42 Listen 80
#监听本机所有的80端口

image-20240314193652433

4、隐藏服务器版本信息

语法:

ServerTokens Major|Minor|Min[imal]|Prod[uctOnly]|OS|Full

相关指令:

ServerTokens Prod[uctOnly] :Server: Apache
ServerTokens Major: Server: Apache/2
ServerTokens Minor: Server: Apache/2.0
ServerTokens Min[imal]: Server: Apache/2.0.41
ServerTokens OS: Server: Apache/2.0.41 (Unix)
ServerTokens Full (or not specified): Server: Apache/2.0.41 (Unix) PHP/4.2.2 MyMod/1.2 此为默认值
[root@liuyanfen12 ~]#curl -I 192.168.10.11
#访问192.168.10.11,可以看到版本号

#修改配置文件
vim /etc/httpd/conf/httpd.conf
servertokens prod
#在空白地方,添加此行(大小写不敏感)

systemctl restart httpd
#重启服务

[root@liuyanfen12 ~]#curl -I 192.168.10.11
#此时查看,版本号隐藏

image-20240314221747122

image-20240314221916801

5、持久连接

Persistent Connection:连接建立,每个资源获取完成后不会断开连接,而是继续等待其它的请求完成,默认开启持久连接

断开条件:

  • 时间限制:以秒为单位, 默认5s,httpd-2.4 支持毫秒级
  • 请求数量:请求数达到指定值,也会断开

**副作用:**对并发访问量大的服务器,持久连接会使有些请求得不到响应

**折中:**使用较短的持久连接时间

相关指令:

KeepAlive On|Off
KeepAliveTimeout 15      #连接持续15s,可以以ms为单位,默认值为5s
MaxKeepAliveRequests 500  #持久连接最大接收的请求数,默认值100
#修改配置文件
vim /etc/httpd/conf/httpd.conf
Listen 80
KeepAlive On            #默认开启长连接
KeepAliveTimeout 300    #超时时间300s
MaxKeepAliveRequests 2  #最大接受请求数为2

cd /var/www/html
#切换目录

echo x > x
echo x1 >x1
echo x2 > x2
#写入文件

systemctl restart httpd
#重启服务

#使用telnet命令模拟长连接
[root@liuyanfen12 ~]#telnet 192.168.10.11 80
GET /x HTTP/1.1
HOST:www.a.com
#输入之后,回车,第一次连接

GET /x1 HTTP/1.1
HOST:www.a.com
#输入之后,回车,第二次连接

GET /x2 HTTP/1.1
HOST:www.a.com
#输入之后,回车,第三次连接,超过两次连接,会自动退出

image-20240314224859952

image-20240314230259724

image-20240314225707834

6、DSO (Dynamic Shared Object)

Dynamic Shared Object,加载动态模块配置,不需重启即生效动态模块所在路径: /usr/lib64/httpd/modules/

主配置 /etc/httpd/conf/httpd.conf 文件中指定加载模块配置文件

ServerRoot "/etc/httpd"
Include conf.modules.d/*.conf
httpd -l    #查看静态编译的模块

httpd -M    #查看静态编译及动态加载的模块

image-20240314231436849

httpd -M |grep basic
#过滤basic模块

cd /etc/httpd/conf.modules.d
#切换目录

#编辑模块配置文件
vim 00-base.conf
 10 #LoadModule auth_basic_module modules/mod_auth_basic.so
#将basic模块行注释掉

httpd -M |grep basic
#此时过滤basic模块,不会显示basic模块

##可以使用此方法,注释掉不需要的模块

image-20240314232155486

7、MPM (Multi-Processing Module)多路处理模块

httpd 支持三种MPM工作模式:prefork, worker, event

cd /etc/httpd/conf.modules.d
#切换目录

#配置文件
vim 00-mpm.conf
#LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#LoadModule mpm_worker_module modules/mod_mpm_worker.so
LoadModule mpm_event_module modules/mod_mpm_event.so
#三种工作模式,只能开启一种,不能同时开启

image-20240314233231609

8、prefork模式相关的配置

StartServers     100  #一开始开启进程100个
MinSpareServers   50  #如果一直空闲,最少预留50个进程
MaxSpareServers   80  #如果空闲,最多预留80个
ServerLimit     2560  #最多进程数,最大值20000
MaxRequestWorkers    2560  #最大的并发连接数,默认256
MaxConnectionsPerChild  4000  #子进程最多能处理的请求数量。在处理MaxRequestsPerChild 个请求之后,子进程将会被父进程终止,这时候子进程占用的内存就会释放(为0时永远不释放)
MaxRequestsPerChild 4000  #从httpd.2.3.9开始被MaxConnectionsPerChild代替
cd /etc/httpd/conf.modules.d
#切换目录

#修改配置文件
vim 00-mpm.conf
LoadModule mpm_prefork_module modules/mod_mpm_prefork.so
#开启prefork工作模式

systemctl restart httpd
#重启服务

pstree -p |grep httpd
#查看httpd服务进程,此时开启4个

#修改配置文件
vim 00-mpm.conf
startservers 8
#设置httpd服务最开始进程数为8个

httpd -t
#检查语法

systemctl restart httpd
#重启服务

pstree -p |grep httpd
#查看httpd服务进程,此时开启8个

image-20240314234107985

image-20240314234331424

9、worker 和 event 模式相关的配置

ServerLimit         16  #最多进程数,最大值20000
processes               #启动时创建的工作进程数量
StartServers        10  #一开始开启进程10个
MaxRequestWorkers  150  #最大的并发连接数,默认256
simultaneously         
MinSpareThreads     25  
MaxSpareThreads     75  
ThreadsPerChild     25  #一个进程中,可以开启多少个子线程

10、定义Main server的文档页面路径

DocumentRoot   "/path”
<directory /path>
 Require all granted
</directory>

说明:

  • DocumentRoot指向的路径为URL路径的起始位置
  • /path 必须显式授权后才可以访问
cd /etc/httpd/conf
#切换目录

#编辑配置文件
vim httpd.conf
DocumentRoot "/data/html"
#修改页面路径
<Directory "/data/html">
    # Allow open access:
    Require all granted
</Directory>
#为主页面文件授权

mkdir /data/html -p
#创建文件夹

cd /data/html
#切换目录

echo this is zhuyemian > index.html
#主页面文件写入内容

##验证
[root@liuyanfen12 ~]#curl 192.168.10.11
this is zhuyemian
#显示设置的主页面内容

image-20240315001303127

image-20240315001357407

11、定义站点默认主页面文件

DirectoryIndex index.php index.html

针对目录和URL实现访问控制

Options指令:

  • 后跟1个或多个以空白字符分隔的选项列表,在选项前的+,-表示增加或删除指定选项

常见选项:

  • Indexes:指明的URL路径下不存在与定义的主页面资源相符的资源文件时,返回索引列表给用 户
  • FollowSymLinks:允许访问符号链接文件所指向的源文件。
  • None:全部禁用
  • AIl:全部允许
    Options 可以写在目录里<> ,也可以写在外面

12、虚拟主机

  • httpd 支持在一台物理主机上实现多个网站,即多虚拟主机

网站的唯一标识:

  • IP相同,但端口不同
  • IP不同,但端口均为默认端口
  • FQDN(域名)不同, IP和端口都相同

多虚拟主机有三种实现方案:

  • 基于ip:为每个虚拟主机准备至少一个ip地址
  • 基于port(端口):为每个虚拟主机使用至少一个独立的port
  • 基于FQDN(域名):为每个虚拟主机使用至少一个FQDN,请求报文中首部
12.1 基于ip地址
#修改配置文件
vim /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.10.11>
    ServerAdmin support@jfedu.net
    DocumentRoot "/data/html/11"
    ServerName www.accp.com
    ErrorLog "logs/11_error_log"
    CustomLog "logs/11_access_log" common
</VirtualHost>

<VirtualHost 192.168.10.22>
    ServerAdmin support@jfedu.net
    DocumentRoot "/data/html/22"
    ServerName www.accp.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/22_error_log"
    CustomLog "logs/22_access_log" common
</VirtualHost>

<Directory "/data/html">
    # Allow open access:
    Require all granted
</Directory>
#授权

cd /data/html/
#切换目录

mkdir 11
mkdir 22
#创建文件夹

echo 11 > 11/index.html
echo 22 > 22/index.html
#写入页面内容

httpd -t
#检查语法

systemctl restart httpd
#重启服务

ifconfig ens33:0 192.168.10.22/24
#添加临时网卡

##验证
[root@liuyanfen12 ~]#curl 192.168.10.11
[root@liuyanfen12 ~]#curl 192.168.10.22
#使用另一台设备访问

image-20240315210425025

image-20240315210527954

  • 验证

image-20240315210643656

12.2 基于端口地址
#修改配置文件
vim /etc/httpd/conf/httpd.conf
Listen 80
Listen 1128
#加入需要监听的新端口号
KeepAlive On
KeepAliveTimeout 300
MaxKeepAliveRequests 2
<VirtualHost 192.168.10.11:80>
    ServerAdmin support@jfedu.net
    DocumentRoot "/data/html/11"
    ServerName www.accp.com
    ErrorLog "logs/11_error_log"
    CustomLog "logs/11_access_log" common
</VirtualHost>

<VirtualHost 192.168.10.11:1128>
    ServerAdmin support@jfedu.net
    DocumentRoot "/data/html/22"
    ServerName www.accp.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/22_error_log"
    CustomLog "logs/22_access_log" common
</VirtualHost>

<Directory "/data/html">
    # Allow open access:
    Require all granted
</Directory>

systemctl restart httpd
#重启服务

##验证
[root@liuyanfen12 ~]#curl 192.168.10.11
[root@liuyanfen12 ~]#curl 192.168.10.11:1128
#使用另一台设备访问

image-20240316103916909

  • 验证

image-20240316103944676

12.3 基于域名
#修改配置文件
vim /etc/httpd/conf/httpd.conf
<VirtualHost 192.168.10.11>
    ServerAdmin support@jfedu.net
    DocumentRoot "/data/html/11"
    ServerName www.lucky.com
    ErrorLog "logs/11_error_log"
    CustomLog "logs/11_access_log" common
</VirtualHost>

<VirtualHost 192.168.10.11>
    ServerAdmin support@jfedu.net
    DocumentRoot "/data/html/22"
    ServerName www.work.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "logs/22_error_log"
    CustomLog "logs/22_access_log" common
</VirtualHost>

<Directory "/data/html">
    # Allow open access:
    Require all granted
</Directory>

systemctl restart httpd
#重启服务

#访问的设备需要添加域名解析
[root@liuyanfen12 ~]#vim /etc/hosts
192.168.10.11  www.lucky.com  www.work.com


##验证
[root@liuyanfen12 ~]#curl www.lucky.com
[root@liuyanfen12 ~]#curl www.work.com
#使用另一台设备访问

image-20240315213514369

  • 验证

image-20240315213548457

image-20240315213356570

三、Cookie和session

无状态协议是指协议对事物处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它应答就很快。

HTTP是超本文传输协议,顾名思义,这个协议支持超文本的传输。什么是超文本?说白了就是使用HTML编写的页面。通常,我们使用客户端浏览器访问服务器的资源,最常见的URL也是以html为后缀的文件,因此可以说超文本是网络上最主要的资源。

既然HTTP协议的目的是在于支持超文本的传输,也就是资源的传输,那么客户端浏览器向HTTP服务器发送请求,继而HTTP服务器将相信资源发回给客户端这样一个过程中,无论对于客户端还是服务器,都没有必要记录这个过程,因为每一次请求和响应都是相对独立的,一般而言,一个URL对应着一个唯一的超文本,正是因为这样的唯一性,使得记录用户的行为状态变得毫无意义,所以,HTTP协议被设计为无状态的连接协议符合它本身的需求。

HTTP协议这种特性有优点也有缺点,优点在于解放了服务器,每一次请求"点到为止",不会造成不必要的连接占用,缺点在于如果为了保留状态,每次请求都会传输大量的重复信息内容。

可是随着 Web 的不断发展,很多业务都需要对通信状态进行保存.如果是一次性会话的过程: 打开浏览器 -> 访问一些服务器内容 -> 关闭浏览器但目前有很多WEB访问场景,并不是一次性会话,而是多次相关的会话,比如:

  • 登录场景:

打开浏览器 -> 浏览到登陆页面 -> 输入用户名和密码 -> 访问到用户主页(显示用户名) -> 修改密码(输入原密码)-> 修改收货地址…

问题:在此处登录会话过程中产生的数据(用户会话数据)如何保存下来呢?

  • 购物场景:

打开浏览器 -> 浏览商品列表 -> 加入购物车(把商品信息保存下来) -> 关闭浏览器打开浏览器-> 直接进入购物车 -> 查看到上次加入购物车的商品 -> 下订单 -> 支付

问题: 在购物会话过程中,如何保存商品信息?

以上场景都需要保留会话数据,需要会话管理机制。

会话管理: 管理浏览器客户端和服务器端之间会话过程中产生的会话数据。

为了会话管理,HTTP就需要传输大量重复信息内容的问题,造成大量的网络带宽消耗。于是 Cookie 和Session 技术闪亮登场了,它们可以为用户进行会话管理,实现保存状态。

1、Cookie

Cookie 又称为"小甜饼”。类型为"小型文本文件”,指某些网站为了辨别用户身份而储存在用户本地终端(Client Side)上的数据(通常经过加密)。由网景公司的前雇员卢·蒙特利在1993年3月发明

因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。在典型的网上购物场景中,用户浏览了几个页面,买了一盒饼干和两瓶饮料。最后结帐时,由于HTTP的无状态性,不通过额外的手段,服务器并不知道用户到底买了什么,所以Cookie就是用来绕开HTTP的无状态性的"额外手段”之一。服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

在上面的购物场景中,当用户选购了第一项商品,服务器在向用户发送网页的同时,还发送了一段Cookie,记录着那项商品的信息。当用户访问另一个页面,浏览器会把Cookie发送给服务器,于是服务器知道他之前选购了什么。用户继续选购饮料,服务器就在原来那段Cookie里追加新的商品信息。结帐时,服务器读取发送来的Cookie就行了。

Cookie基于HTTP协议,也叫Web Cookie或浏览器Cookie,是服务器发送到用户浏览器并保存在客户端本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie使基于无状态的HTTP协议记录稳定的状态信息成为了可能。

#第一次请求过程
浏览器第一次发送请求时,不会携带任何cookie信息
服务器接收到请求之后,发现请求中没有任何cookie信息
服务器生成和设置一个cookie.并将此cookie设置通过set_cookie的首部字段保存在响应报文中返回给浏览器
浏览器接收到这个响应报文之后,发现里面有cookie信息,浏览器会将cookie信息保存起来

#第二次及其之后的过程
当浏览器第二次及其之后的请求报文中自动 cookie的首部字段携带第一次响应报文中获取的cookie信息
服务器再次接收到请求之后,会发现请求中携带的cookie信息,这样的话就认识是谁发的请求了
之后的响应报文中不会再添加set_cookie首部字段

Cookie主要用于以下三个方面:

  • 会话状态管理(如用户登录状态、购物车、游戏分数或其它需要记录的信息)
  • 个性化设置(如用户自定义设置、主题等)
  • 浏览器行为跟踪(如跟踪分析用户行为等)

Cookie 技术通过在请求和响应报文中写入 Cookie 信息来控制客户端的状态。当服务器收到HTTP请求时,服务器可以在响应头里面添加一个Set-Cookie选项。浏览器收到响应后通常会保存下Cookie,之后对该服务器每一次请求中都通过Cookie请求头部将Cookie信息发送给服务器。服务器端发现客户端发送过来的 Cookie 后,会去检查究竟是从哪一个客户端发来的连接请求,然后对比服务器上的记录,最后得到之前的状态信息.另外,Cookie的过期时间、域、路径、有效期、适用站点都可以根据需要来指定。

2、Session

2.1 cookie和session的相同和不同
  • cookie通常是在服务器生成,但也可以在客户端生成,session是在服务器端生成的
  • session 将数据信息保存在服务器端,可以是内存,文件,数据库等多种形式,cookie 将数据保存在客户端的内存或文件中
  • 单个cookie保存的数据不能超过4K,每个站点cookie个数有限制,比如IE8为50个、Firefox为50个、Opera为30个;session存储在服务器,没有容量限制
  • cookie存放在用户本地,可以被轻松访问和修改,安全性不高;session存储于服务器,比较安全
  • cookie有会话cookie和持久cookie,生命周期为浏览器会话期的会话cookie保存在缓存,关闭浏览器窗口就消失,持久cookie被保存在硬盘,知道超过设定的过期时间;随着服务端session存储压力增大,会根据需要定期清理session数据
  • session中有众多数据,只将sessionID这一项可以通过cookie发送至客户端进行保留,客户端下次访问时,在请求报文中的cookie会自动携带sessionID,从而和服务器上的的session进行关联
2.2 cookie缺点
  • 使用cookie来传递信息,随着cookie个数的增多和访问量的增加,它占用的网络带宽也很大,试想假如cookie占用200字节,如果一天的PV有几个亿,那么它要占用多少带宽?

  • cookie并不安全,因为cookie是存放在客户端的,所以这些cookie可以被访问到,设置可以通过插件添加、修改cookie。所以从这个角度来说,我们要使用sesssion,session是将数据保存在服务端的,只是通过cookie传递一个sessionId而已,所以session更适合存储用户隐私和重要的数据

2.3 session 缺点
  • 不容易在多台服务器之间共享,可以使用session绑定,session复制,session共享解决

  • session存放在服务器中,所以session如果太多会非常消耗服务器的性能cookie和session各有优缺点,在大型互联网系统中,单独使用cookie和session都是不可行的

四、Web相关工具

1、Weget相关工具

格式:

wget [OPTION]... [URL]...

常用选项:

-q 静默模式
-c 断点续传
-P /path 保存在指定目录
-O filename 保存为指定文件名,filename 为 - 时,发送至标准输出
--limit-rate= 指定传输速率,单位K,M等

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

格式:

curl [options] [URL...]

选项:

-A/--user-agent <string> 设置用户代理发送给服务器
-e/--referer <URL> 来源网址
--cacert <file> CA证书 (SSL)
-k/--insecure   允许忽略证书进行 SSL 连接
--compressed 要求返回是压缩的格式
-H/--header "key:value” 自定义首部字段传递给服务器
-i 显示页面内容,包括报文首部信息
-I/--head 只显示响应报文首部信息
-D/--dump-header <file>将url的header信息存放在指定文件中
--basic 使用HTTP基本认证
-u/--user <user[:password]>设置服务器的用户和密码
-L   如果有3xx响应码,重新发请求到新位置
-O 使用URL中默认的文件名保存文件到本地
-o <file> 将网络文件保存为指定的文件中
--limit-rate <rate> 设置传输速度
-0/--http1.0 数字0,使用HTTP 1.0
-v/--verbose 更详细
-C 选项可对文件使用断点续传功能
-c/--cookie-jar <file name> 将url中cookie存放在指定文件中
-x/--proxy <proxyhost[:port]> 指定代理服务器地址
-X/--request <command> 向服务器发送指定请求方法
-U/--proxy-user <user:password> 代理服务器用户和密码
-T 选项可将指定的本地文件上传到FTP服务器上
--data/-d 方式指定使用POST方式传递数据
-s --silent   Silent mode
-b name=data 从服务器响应set-cookie得到值,返回给服务器
-w <format> 显示相应的指定的报文信息,如:%{http_code},%{remote_ip}等
-m, --max-time <time> 允许最大传输时间

3、压力测试工具

httpd的压力测试工具:

  • ab, webbench, http_load, seige
  • Jmeter 开源
  • Loadrunner 商业,有相关认证
  • tcpcopy:网易,复制生产环境中的真实请求,并将之保存

ab 来自httpd-tools包

命令格式:

ab [OPTIONS] URL

选项:

-n:总请求数
-c:模拟的并发数
-k:以持久连接模式测试