01-http协议与apache服务

http协议与apache服务

套接字地址

  • 套接字Socket是进程间通信IPC的一种实现,允许位于不同主机(或同一主机)上不同进程之间进行通信和数据交换,SocketAPI出现于1983年 BSD 4.2实现
  • 在建立通信连接的每一端,进程间的传输要有两个标志:IP地址和端口号,合称为套接字地址 socket address
  • 客户机套接字地址定义了一个唯一的客户进程
  • 服务器套接字地址定义了一个唯一的服务器进程

Socket API

  • 封装了内核中所提供的socket通信相关的系统调用
  • Socket Domain:根据其所使用的地址
    • AF_INET:Address Family IPv4
    • AF_INET6:IPv6
    • AF_UNIX:同一主机上不同进程之间通信时使用
  • Socket Type:根据使用的传输层协议
    • SOCK_STREAM:流,tcp套接字,可靠地传递、面向连接
    • SOCK_DGRAM:数据报,udp套接字,不可靠地传递、无连接
    • SOCK_RAW: 裸套接字,无须tcp或udp,APP直接通过IP包通信

客户/服务器程序的套接字函数

 

  • 套接字相关的系统调用:
    • socket():创建一个套接字
    • bind():绑定IP和端口
    • listen():监听
    • accept():接收请求
    • connect():请求连接建立
    • write():发送
    • read():接收
    • close():关闭连接 
#利用nc实现服务器端
[root@centos8 ~]#nc -l 8000
hello,I am CentOS8
hello,I am CentOS7
#利用nc实现客户端
[root@centos7 ~]#nc 10.0.0.8 8000
hello,I am CentOS8
hello,I am CentOS7
[root@centos8 ~]#strace -ff -o nc.log nc -l 8000
[root@centos7 ~]#nc 10.0.0.8 8000

HTTP 超文本传输协议

  • URL:万维网使用统一资源定位符(Uniform Resource Locator)来标志万维网上的各种文档,并使每个文档在整个因特网的范围内具有唯一的标识符URL。
  • HTTP是处于应用层的协议,使用TCP传输层协议进行可靠的传送。
  • 万维网是基于因特网的一种广泛因特网应用系统,万维网采用的是HTTP(80/TCP)和 HTTPS(443/TCP)的传输协议
  • HTML超文本标记语言(HyperTextMarkup Language)

浏览器访问网站的过程

 

 

 

 HTTP协议分层

URI和URL

  • URI: Uniform Resource Identifier 统一资源标识,分为URLURN
    • URN:Uniform Resource Naming,统一资源命名
    • URL:Uniform Resorce Locator,统一资源定位符,用于描述某服务器某特定资源位置 
    • 两者区别:URN如同一个人的名称,而URL代表一个人的住址。换言之,URN定义某事物的身份,而URL提供查找该事物的方法。URN仅用于命名,而不指定地址 

 

<scheme>://<user>:<password>@<host>:<port>/<path>;<params>?<query>#<frag>
scheme:方案,访问服务器以获取资源时要使用哪种协议
user:用户,某些方案访问资源时需要的用户名
password:密码,用户对应的密码,中间用:分隔
Host:主机,资源宿主服务器的主机名或IP地址
port:端口,资源宿主服务器正在监听的端口号,很多方案有默认端口号
path:路径,服务器资源的本地名,由一个/将其与前面的URL组件分隔
params:参数,指定输入的参数,参数为名/值对,多个参数,用;分隔
query:查询,传递参数给程序,如数据库,用?分隔,多个查询用&分隔
frag:片段,一小片或一部分资源的名字,此组件在客户端使用,用#分隔
#示例
http://www.chengzi.com:8080/images/logo.jpg
ftp://nameke:password@172.16.0.1/pub/linux.ppt
rtsp://videoserver/video_demo/ #Real Time Streaming Protocol
gcomm://192.168.56.8,192.168.56.18,192.168.56.28
http://www.chengzi.com/bbs/hello;gender=f/send;type=title
https://list.jd.com/list.html?
cat=670,671,672&ev=14_2&sort=sort_totalsales15_desc&trans=1
http://apache.org/index.html#projects-list

网站访问量

网站访问量统计的重要指标

  • IP(独立IP):即Internet Protocol,指独立IP数。一天内来自相同客户机IP 地址只计算一次,记录远程客户机IP地址的计算机访问网站的次数,是衡量网站流量的重要指标
  • PV(访问量): 即Page View, 页面浏览量或点击量,用户每次刷新即被计算一次,PV反映的是浏览某网站的页面数,PV与来访者的数量成正比,PV并不是页面的来访者数量,而是网站被访问的页面数量
  • UV(独立访客):即Unique Visitor,访问网站的一台电脑为一个访客。一天内相同的客户端只被计算一次。可以理解成访问某网站的电脑的数量。网站判断来访电脑的身份是通过cookies实现的。如果更换了IP后但不清除cookies,再访问相同网站,该网站的统计中UV数是不变的
  • 网站统计:http://www.alexa.cn/rank/ 

HTTP工作机制

  • 一次http事务包括
    • http请求:http request
    • http响应:http resp
  • Web资源类型:
    • 静态文件:无需服务端做出额外处理,服务器端和客户端的文件内容相同,文件后缀:.html, .txt, .jpg, .js, .css, .mp3, .avi 等
    • 动态文件:服务端执行程序,返回执行的结果,服务器端和客户端的文件内容不相同,文件后缀:.php, .jsp ,.asp等
  • 并行与串行:提高HTTP连接性能
    • 并行连接:通过多条TCP连接发起并发的HTTP请求
    • 持久连接:keep-alive,重用TCP连接,以消除连接和关闭的时延,以事务个数和时间来决定是否关闭连接
    • 管道化连接:通过共享TCP连接,发起并发的HTTP请求
    • 复用的连接:交替传送请求和响应报文(实验阶段)

HTTP 协议版本 

协议版本 特点
http/0.9
  • 1991,原型版本,功能简陋,只有一个命令GET。GET /index.html ,服务器只能回应HTML格式字符串,不能回应别的格式
http/1.0
  • 1996年5月,支持cache, MIME, method
  • 每个TCP连接只能发送一个请求,发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建 一个连接
  • 引入了POST命令和HEAD命令,头信息是ASCII码
  • 数据由Content-Type字段值决定,常见Content-Type值:text/xml image/jpeg audio/mp3
http/1.1
 
  • 1997年1月,引入了持久连接(persistent connection),即TCP连接默认不关闭,可以被多个请求复用,不用声明Connection: keep-alive。
  • 在同一个TCP连接里,客户端可以同时发送多个请求,进一步改进了HTTP协议的效率,新增方法:PUT、PATCH、OPTIONS、DELETE
  • 同一个TCP连接里,所有的数据通信是按次序进行的,造成"队头堵塞"(Head-of-line blocking);
    为避免上述问题,两种方法:一是减少请求数,二是同时多开持久连接
  • HTTP 协议不带有状态,每次请求都必须附上所有信息。请求的很多字段都是重复的,浪费带宽,影响
    速度

HTTP1.0和HTTP1.1的区别

  • 缓存处理,在HTTP1.0中主要使用header里的If-Modified-Since,Expires来做为缓存判断的标准,HTTP1.1则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略 
  • 带宽优化及网络连接的使用,HTTP1.0中,存在一些浪费带宽的现象,例如:客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点续传功能,HTTP1.1则在请求头引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便了开发者自由的选择以便于充分利用带宽和连接
  • 错误通知的管理,在HTTP1.1中新增24个状态响应码
  • Host 头处理,在HTTP1.0中认为每台服务器都绑定一个唯一的IP地址,因此,请求消息中的URL并没有传递主机名(hostname);HTTP1.1的请求消息和响应消息都应支持Host头域,且请求消息中如果没有Host头域会报告一个错误(400 Bad Request)
  • 长连接,HTTP 1.1支持持久连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection: keep-alive,弥补了HTTP1.0每次请求都要创建连接的缺点

HTTP1.0和1.1的问题

  • HTTP1.x在传输数据时,每次都需要重新建立连接,无疑增加了大量的延迟时间
  • HTTP1.x在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,无法保证数据的安全性
  • HTTP1.x在使用时,header里携带的内容过大,增加了传输的成本,并且每次请求header基本不怎么变化,尤其在移动端增加用户流量
  • 虽然HTTP1.x支持了keep-alive,来弥补多次创建连接产生的延迟,但是keep-alive使用多了同样会给服务端带来大量的性能压力,并且对于单个文件被不断请求的服务(例如图片存放网站),keep-alive可能会极大的影响性能,因为它在文件被请求之后还保持了不必要的连接很长时间

HTTPS特点

  • HTTPS协议需要到CA申请证书,一般免费证书很少,需要交费
  • HTTP协议运行在TCP之上,所有传输的内容都是明文;HTTPS运行在SSL/TLS之上,SSL/TLS运行在TCP之上,所有传输的内容都经过加密的
  • HTTP和HTTPS使用的是不同的连接方式,端口不同,前者是80,后者是443
  • HTTPS可以有效的防止运营商劫持,解决了防劫持的一个大问题
  • HTTPS 实现过程降低用户访问速度,但经过合理优化和部署,HTTPS 对速度的影响还是可以接受的

SPDY协议

SPDY:2009年谷歌研发,综合HTTPS和HTTP两者有点于一体的传输协议,主要特点
  • 降低延迟,针对HTTP高延迟的问题,SPDY优雅的采取了多路复用(multiplexing)
  • 请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,重要的请求就会优先得到响应。
  • header压缩
  • 基于HTTPS的加密协议传输,大大提高了传输数据的可靠性 
  • 服务端推送(server push)

HTTP2协议

http/2.0:2015年,HTTP2.0是SPDY的升级版 
  • 头信息和数据体都是二进制,称为头信息帧和数据帧
  • 复用TCP连接,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,且不用按顺序一一对应,避免了"队头堵塞",此双向的实时通信称为多工(Multiplexing)
  • 引入头信息压缩机制(header compression),头信息使用gzip或compress压缩后再发送;客户端和服务器同时维护一张头信息表,所有字段都会存入这个表,生成一个索引号,不发送同样字段,只发送索引号,提高速度
  • HTTP/2 允许服务器未经请求,主动向客户端发送资源,即服务器推送(server push)

HTTP2.0和SPDY区别:

  • HTTP2.0 支持明文 HTTP 传输,而 SPDY 强制使用 HTTPS
  • HTTP2.0 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE 

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

1、建立连接:接收或拒绝连接请求
2、接收请求:接收客户端请求报文中对某资源的一次请求的过程
3、处理请求:服务器对请求报文进行解析,并获取请求的资源及请求方法等相关信息,根据方法,资源,首部和可选的主体部分对请求进行处理
常用请求Method: GET、POST、HEAD、PUT、DELETE、TRACE、OPTIONS
4、访问资源:服务器获取请求报文中请求的资源web服务器,即存放了web资源的服务器,负责向请求者提供对方
请求的静态资源,或动态运行后生成的资源
5、构建响应报文:一旦Web服务器识别了出资源,就执行请求方法中描述的动作,并返回响应报文。响应报文中 包含有响应状态码、响应首部,如果生成了响应主体的话,还包括响应主体
1)响应实体:如果事务处理产生了响应主体,就将内容放在响应报文中回送过去。响应报文中通常包括:
描述了响应主体MIME类型的Content-Type首部
描述了响应主体长度的Content-Length
实际报文的主体内容
2)URL重定向:web服务构建的响应并非客户端请求的资源,而是资源另外一个访问路径
3)MIME类型: Web服务器要负责确定响应主体的MIME类型。多种配置服务器的方法可将MIME类型与资源管理起来
魔法分类:Apache web服务器可以扫描每个资源的内容,并将其与一个已知模式表(被称为魔法文件)进行匹配,以决定每个文件的MIME类型。这样做可能比较慢,但很方便,尤其是文件没有标准扩展名时
显式分类:可以对Web服务器进行配置,使其不考虑文件的扩展名或内容,强制特定文件或目录内容拥有某个MIME类型
类型协商: 有些Web服务器经过配置,可以以多种文档格式来存储资源。在这种情况下,可以配置Web服务器,使其可以通过与用户的协商来决定使用哪种格式(及相关的MIME类型)"最好"
6、发送响应报文
Web服务器通过连接发送数据时也会面临与接收数据一样的问题。服务器可能有很多条到各个客户端的连接,有些是空闲的,有些在向服务器发送数据,还有一些在向客户端回送响应数据。服务器要记录连接的状态,还要特别注意对持久连接的处理。对非持久连接而言,服务器应该在发送了整条报文之后,关闭自己这一端的连接。对持久连接来说,连接可能仍保持打开状态,在这种情况下,服务器要正正确地计算Content-Length首部,不然客户端就无法知道响应什么时候结束
7、记录日志:最后,当事务结束时,Web服务器会在日志文件中添加一个条目,来描述已执行的事务

httpd 安装和组成

常见 http 服务器程序

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

apache 功能

  • 提供http协议服务
  • 多个虚拟主机:IP、Port、FQDN
  • CGI:Common Gateway Interface,通用网关接口,支持动态程序
  • 反向代理
  • 负载均衡
  • 路径别名
  • 丰富的用户认证机制:basic,digest
  • 支持第三方模块 

httpd-2.4 新特性

  • MPM支持运行为DSO机制;以模块形式按需加载
  • event MPM生产环境可用
  • 异步读写机制
  • 支持每模块及每目录的单独日志级别定义
  • 每请求相关的专用配置
  • 增强版的表达式分析式
  • 毫秒级持久连接时长定义
  • 基于FQDN的虚拟主机不需要NameVirutalHost指令
  • 新指令
  • 支持用户自定义变量
  • 更低的内存消耗

MPM multi-processing module 工作模式 

  • prefork:多进程I/O模型,每个进程响应一个请求,CentOS 7 httpd默认模型
    • 一个主进程:生成和回收n个子进程,创建套接字,不响应请求
    • 多个子进程:工作 work进程,每个子进程处理一个请求;系统初始时,预先生成多个空闲进程,等待请求
    • 优点:稳定
    • 缺点:慢,占用资源,不适用于高并发场景 
  • worker:复用的多进程I/O模型,多进程多线程,此模型一个主进程:生成m个子进程,每个子进程负责生个n个线程,每个线程响应一个请求,并发响应请求
  • event:事件驱动模型(worker模型的变种),CentOS8 默认模型
    • 优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
    • 缺点:没有线程安全控制 

包安装httpd并启动httpd服务

  • 版本说明:
    • CentOS 7 以上,默认系统是httpd 2.4;CentOS 6 版默认为httpd 2.2
    • Ubuntu 18.04 默认 Apache/2.4.29 
  • 范例:安装httpd
#范例:centos8安装httpd2.4
dnf -y install httpd httpd -v systemctl enable --now httpd
httpd -t ss
-antl|grep :80 #范例: ubuntu 安装 httpd 2.4 apt install apache2 -y apache2 -v
apache2 -t systemctl status apache2

httpd-2.4 相关文件

文件 文件路径及说明

配置文件

  • /etc/httpd/conf/httpd.conf 主配置文件
  • /etc/httpd/conf.d/*.conf 子配置文件
  • /etc/httpd/conf.d/conf.modules.d/ 模块加载的配置文件

服务单元文件

  • /usr/lib/systemd/system/httpd.service
  • 配置文件:/etc/sysconfig/httpd 

服务控制和启动

  • systemctl enable|disable httpd.service
  • systemctl {start|stop|restart|status|reload} httpd.service
  • apachectl start|stop|restart|configtest
  • service httpd configtest

站点网页文档根目录

  • /var/www/html

模块文件路径

  • /etc/httpd/modules
  • /usr/lib64/httpd/modules

主服务器程序文件

  • /usr/sbin/httpd
主进程文件
  • /etc/httpd/run/httpd.pid
日志文件目录
  • /var/log/httpd
    • access_log: 访问日志
    • error_log:错误日志

httpd 配置文件的组成

  • 范例:CentOS 8.0 默认配置文件
[root@centos8 ~]#grep -Ev '^ *#|^$' /etc/httpd/conf/httpd.conf 
ServerRoot "/etc/httpd"
Listen 80
Include conf.modules.d/*.conf
User apache
Group apache
ServerAdmin root@localhost
<Directory />
   AllowOverride none
   Require all denied
</Directory>
DocumentRoot "/var/www/html"
<Directory "/var/www">
   AllowOverride None
   Require all granted
</Directory>
<Directory "/var/www/html">
   Options Indexes FollowSymLinks
   AllowOverride None
   Require all granted
</Directory>
<IfModule dir_module>
   DirectoryIndex index.html
</IfModule>
<Files ".ht*">
   Require all denied
</Files>
ErrorLog "logs/error_log"
LogLevel warn
<IfModule log_config_module>
   LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\""
combined
   LogFormat "%h %l %u %t \"%r\" %>s %b" common
   <IfModule logio_module>
     LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I 
%O" combinedio
   </IfModule>
   CustomLog "logs/access_log" combined
</IfModule>
<IfModule alias_module>
   ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
</IfModule>
<Directory "/var/www/cgi-bin">
   AllowOverride None
   Options None
   Require all granted
</Directory>
<IfModule mime_module>
   TypesConfig /etc/mime.types
   AddType application/x-compress .Z
   AddType application/x-gzip .gz .tgz
   AddType text/html .shtml
   AddOutputFilter INCLUDES .shtml
</IfModule>
AddDefaultCharset UTF-8
<IfModule mime_magic_module>
   MIMEMagicFile conf/magic
</IfModule>
EnableSendfile on
IncludeOptional conf.d/*.conf

centos7编译安装httpd2.4

编译安装httpd-2.4准备

#安装相关包:
yum -y install gcc make pcre-devel openssl-devel expat-devel
#下载源代码并解压缩:
cd /home/nameke/tools/
wget -c https://downloads.apache.org/apr/apr-1.7.0.tar.bz2
wget -c https://downloads.apache.org//apr/apr-util-1.6.1.tar.bz2
wget -c https://downloads.apache.org//httpd/httpd-2.4.46.tar.bz2
tar zxf apr-1.7.0.tar.bz2
tar zxf apr-util-1.6.1.tar.bz2
tar zxf httpd-2.4.46.tar.bz2

编译安装httpd-2.4 方法一 

  • 编译安装apr
cd apr-1.7.0
./configure --prefix=/apps/apr
make && make install
cd ../
  • 编译安装apr-util 
cd apr-util-1.6.1
./configure --prefix=/apps/apr-util --with-apr=/apps/apr/
make -j 2 && make install
cd ../
  • 编译安装 httpd-2.4
cd httpd-2.4.46
./configure --prefix=/apps/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-apr=/apps/apr/ \
--with-apr-util=/apps/apr-util/ \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork

make -j 4 && make install

编译安装httpd-2.4方法二

  • 将apr 和apr-util源码与httpd 源码合并
cd /home/nameke/tools/
tar
zxf apr-1.7.0.tar.bz2 tar zxf apr-util-1.6.1.tar.bz2 tar zxf httpd-2.4.46.tar.bz2 mv apr-1.7.0 httpd-2.4.46/srclib/apr mv apr-util-1.6.1 httpd-2.4.46/srclib/apr-util ls -l httpd-2.4.46/srclib/
  • 将三者一并编译并安装
cd httpd-2.4.46/
./configure \
--prefix=/apps/httpd24 \
--enable-so \
--enable-ssl \
--enable-cgi \
--enable-rewrite \
--with-zlib \
--with-pcre \
--with-included-apr \
--enable-modules=most \
--enable-mpms-shared=all \
--with-mpm=prefork  
make -j 4 && make install

编译安装后配置

  • Httpd编译过程:/apps/httpd24/build/config.nice
  • 自带的服务控制脚本:/apps/httpd24/bin/apachectl
  • 配置用户与环境变量
#创建专用用户
useradd -s /sbin/nologin -r apache

#指定运行httpd的用户
vim /apps/httpd24/conf/httpd
user apache
group apache

#配置环境变量
echo 'PATH=/apps/httpd24/bin:$PATH' > /etc/profile.d/httpd.sh
. /etc/profile.d/httpd.sh
httpd -v

#配置帮助
vim /etc/man_db.conf
MANDATORY_MANPATH           /apps/httpd24/man

#设置开机自动启动
vim /etc/rc.d/rc.local
/apps/httpd24/bin/apachectl start
chmod +x /etc/rc.d/rc.local
  • 创建service unit文件(CentOS 7 以上版本)
cat >/usr/lib/systemd/system/httpd24.service<<EOF
[Unit]
Description=The Apache HTTP Server
After=network.target remote-fs.target nss-lookup.target
Documentation=man:httpd(8)
Documentation=man:apachectl(8)
[Service]
Type=forking
#EnvironmentFile=/etc/sysconfig/httpd
ExecStart=/apps/httpd24/bin/apachectl start
#ExecStart=/apps/httpd24/bin/httpd $OPTIONS -k start
ExecReload=/apps/httpd24/bin/apachectl graceful
#ExecReload=/apps/httpd24/bin/httpd $OPTIONS -k graceful
ExecStop=/apps/httpd24/bin/apachectl stop
KillSignal=SIGCONT
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
  • 创建启动脚本(CentOS 6 以前版本) 
#自定义启动脚本(参考httpd-2.2的服务脚本)
cp   /etc/rc.d/init.d/httpd /etc/rc.d/init.d/httpd24
vim /etc/rc.d/init.d/httpd24
apachectl=/apps/httpd24/bin/apachectl
httpd=${HTTPD-/apps/httpd24/bin/httpd}
pidfile=${PIDFILE-/apps/httpd24/logs/httpd.pid}
lockfile=${LOCKFILE-/var/lock/subsys/httpd24}
chkconfig -add httpd24 
chkconfig -list httpd24

 

posted @ 2022-08-23 17:51  西瓜的春天  阅读(138)  评论(0)    收藏  举报