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 统一资源标识,分为URL 和 URN
- 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工作机制
- 一次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
|
|
|
http/1.0
|
|
|
http/1.1
|
|
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 相关文件
| 文件 | 文件路径及说明 |
配置文件 |
|
服务单元文件 |
|
服务控制和启动 |
|
站点网页文档根目录 |
|
模块文件路径 |
|
主服务器程序文件 |
|
| 主进程文件 |
|
| 日志文件目录 |
|
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
- APR官网:http://apr.apache.org
- 说明:安装httpd-2.4,依赖于apr-1.4+, apr-util-1.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

浙公网安备 33010602011771号