文件服务
目标:
- FTP端口号,分别是什么作用
- FTP主动模式和被动模式的区别
FTP(文件传输协议):
控制连接(端口号21):
- 主要用来传送在实际通信过程中需要执行的FTP命令以及命令的响应
- 只需要很小的网络带宽
- FTP服务端监听21端口,来等待控制链接的建立。
- 建立控制链接后,还需要验证客户的身份来确定是否建立数据连接。
- 当需要目录列表,文件传输时,才建立连接,并且每次客户都是用不同的端口号来建立数据连接,数据传输完毕,就中断这条临时的数据连接
在FTP连接期间,控制连接始终保持连接状态,在数据连接存在期间,控制连接必须存在,一旦控制中断,数据连接也会自动关闭。
数据连接(端口号20):
FTP服务端监听20端口来等待数据连接
- 数据连接依赖于控制连接
- 数据连接的建立方式有两种,一种是主动模式,一种是被动模式,这里的主动模式和被动模式是相对于服务端来说的。
主动模式:
- 通过TCP三次握手建立控制连接,客户端的端口是高位随机端口,目标端口是服务端的21端口
- 建立控制连接后,客户端进行身份验证,协商数据连接采用主动模式,随后客户端会向服务端发送port报文,里面包含了自己监听的ip+端口,并等待服务器向自己监听的ip+端口发送连接请求。
- 服务端发送数据连接请求,建立数据连接
被动模式:
- 通过三次握手建立控制连接请求,客户端源端口是高位随机端口,服务器端口是21端口。
- 控制连接建立后,客户端进行身份验证,协商数据连接采用被动模式,随后客户端会向服务器发送PASV报文,表示用被动模式
- 服务端收到PASV报文,向客户端发送Port报文,表明自己监听的IP+端口
- 客户端主动发起数据连接请求。
总的来说:FTP协议有两种工作模式,一种是主动另外一种是被动模式,这是相对于服务端来说的。
在主动模式下,客户端随机开启一个大于1024的端口N向服务端的21端口发起控制连接请求,协商用主动模式进行传输,然后会开启一个N+1号端口,并且将这个端口通过控制连接告诉服务端,服务端会通过自己本地的数据连接端口20向客户端的N+1号端口发起数据连接请求
在被动模式,客户端随机开启要给大于1024的端口N向服务端的21端口发起连接,协商采用被动模式,并且开启N+1号端口,并且发送一个PASV报文,通知服务端自己处于被动模式,然后服务端收到命令后,会开放一个大于1024的端口P进行监听,然后用PORT报文通知客户端。自己的数据端口是P,客户端收到命令后通过N+1号端口与P端口进行连接。
主动模式与被动模式的区别:
主动模式是服务端主动去请求连接客户端,被动模式是客户端主动访问服务端。被动模式可以确保位于局域网中的客户端能够访问到外面的FTP服务器。
总的来说,主动模式的FTP是指服务器主动连接客户端的数据端口,被动模式的FTP是指服务器被动地等 待客户端连接自己的数据端口。 被动模式的FTP通常用在处于防火墙之后的FTP客户访问外界FTp服务器的情况,因为在这种情况下,防 火墙通常配置为不允许外界访问防火墙之后主机,而只允许由防火墙之后的主机发起的连接请求通过。 因此,在这种情况下不能使用主动模式的FTP传输,而被动模式的FTP可以良好的工作。
他们的利弊如何去分析呢:
从随机开启端口的角度,和防火墙的角度去分析
主动模式,对服务端有利,因为只需要开启20和21端口。对客户端不利,因为服务端20端口号连接客户端的数据端口时可能被防火墙给拦掉。
NFS:
NFS协议模型:
RPC远程过程调度:
- NFS协议本身并没有网络传输功能,它只是提供一个共享功能,而它的网络功能是通过RPC远程过程调度协议实现
- 提供一个面向过程的远程服务接口
- 可以通过网络从远程主机程序请求服务,而不需要了解底层网络技术的协议
- 工作在osi模型的会话层,它可以为遵从RPC协议应用层协议提供端口注册功能
- 很多服务都可以向RPC注册端口
- RPC使用网络端口111来监听客户端的请求
RPC协议模型:
- 基于RPC的服务,在启动时会向portmapper注册端口
- 基于rpc的客户端联系服务端portmapper询问服务的端口号
- portmapper告知客户端某基于RPC服务使用的端口号
- 基于rpc的客户端访问被告知基于rpc服务的端口
- 基于rpc的服务响应客户端的请求
-
工作流程:
NFS协议用来做静态网页共享存储。这个案例是有一个NFS服务端,和三个NFS客户端。其中服务端通过NFS协议设置共享的文件,然后NFS客户端,通过将这个文件挂载到自己的目录下,实现文件的共享,其中还能设定客户端访问的文件有那些权限。
参数配置:
SAMAB:
总结:
- IPtables的五链四表,SNAT,DNAT。
- 设置端口转发的iptables规则
- firewall实现端口放行和端口禁用
- FTP的主动模式和被动模式
- NFS协议中RPC协议的具体内容,以及如何通过NFS实现静态网页共享
网站服务
Apache网站服务
目标:
- HTTP协议中常⻅状态码的作⽤(⽐如304是什么意思)
- HTTP端⼝号,HTTPS端⼝号
- HTTPS/TLS的认证过程
- POST和GET请求⽅式的区别
- 什么是⻓连接,有什么作⽤
- apache的mpm多路处理模块
用户在输入完域名后会发生什么?
输入URL之后的流程:
- 浏览器输入URL并按下回车
- 浏览器查找当前URL是否存在缓存,并且缓存是否过期
- DNS解析域名对应的IP
- 根据IP建立TCP连接(三次握手)
- HTTP发起请求
- 服务器处理请求,浏览器接受HTTP响应
- 渲染页面
- 关闭TCP连接(四次挥手)
URL:
统一资源定位符,唯一标识了互联网上的唯一资源,,URI唯一资源标识符,URL是URI的子集。
URL一般由几部分组成:
https://www.jianshu.com/p/7eea6fbc5fcd
协议://主机域名或者IP地址:端口号/目录的路径/query查询的参数/fragment一般用来定位到某个位置。
页面缓存:
判断浏览器是否存在缓存
- 用户请求资源,查看是否有浏览器缓存,否就直接向服务器请求,请求响应,缓存协商,如果有缓存,就判断expires过期时间,如果资源没有过期则会直接将缓存资源返回,如果expire过期了,则先判断Etag是否改变,没有改变就向服务器请求if-none-match服务器返回200还是304如果304的话直接读取本地缓存,200的话就进行下一步协商,如果Etag改变了就看last-modified,如果改变了就向服务器请求,没有改变,就向服务器请求if-modieiled-since看服务器返回304还是200。
浏览器缓存:
最后修改时间 系统调用会获取文件的最后修改时间,如果没有发生变化就返回给浏览器304 的状态码,表示没有发生 变化,然后浏览器就使用的本地的缓存展示资源。 Etag标记 基于Etag标记是否一直做判断页面是否发生过变化,比如基于Nginx的Etag on来实现 过期时间 expires 以上两种都需要发送请求,即不管资源是否过期都要发送请求进行协商,这样会消耗不必要的时间,因 此有了缓存的过期时间 Expire 是 HttpHeader 中代表资源的过期时间,由服务器端设置。如果带有 Expire ,则在 Expire 过期 前不会发生 Http 请求,直接从缓存中读取。用户强制 F5 例外 第一次请求资源时,响应报文带有资源的过期时间,默认为30天,当前此方式使用的比较多,但是无法保 证客户的时间都是准确并且一致的,因此会加入一个最大生存周期,使用用户本地的时间计算缓存数据 是否超过多少天,假如过期时间Expires:为2028年,但是缓存的最大生存周期Cache-Control: maxage=315360000,计算为天等于3650天即10年
混合使用和缓存刷新 通常 Last-Modified,Etag,Expire 是一起混合使用的 特别是 Last-Modified 和 Expire 经常一起使用,因为 Expire 可以让浏览器完全不发起 Http 请 求,而当浏览器强制 F5 的时候又有 Last-Modified ,这样就很好的达到了浏览器段缓存的效果。 Etag 和 Expire 一起使用时,先判断 Expire ,如果已经过期,再发起 Http 请求,如果 Etag 变化 了,则返回 200 响应。如果 Etag 没有变化,则返回 304 响应。 Last-Modified,Etag,Expires 三个同时使用时。先判断 Expire ,然后发送 Http 请求,服务器先判 断 last-modified ,再判断 Etag ,必须都没有过期,才能返回 304 响应。 缓存刷新 第一次访问,获取最新数据,返回 200响应码 鼠标点击二次访问 (Cache),输入地址后回车,浏览器对所有没有过期的内容直接使用本地缓存。 F5或点刷新按钮, 会向服务器发送请求缓存协商信息,last-modified和etag会有影响,但expires本地 过期时间不受影响,无变化返回304 按Ctrl+F5强制刷新,所有缓存不再使用,直接连接服务器,获取最新数据,返回200响应码
DNS查询:
首先会查询浏览器缓存,然后本地缓存,然后是路由器缓存,然后是isp缓存如果都没有的话,则会开始迭代查询,从根域名,然后到顶级域名,主机名服务器。如果查到的话会保存结果到缓存
根域名服务器是最大的DNS服务器,全球共有13个,它保存了顶级域名的所有IP
建立TCP三次握手:
TCP三次握手与四次挥手:
发送请求报文:
各字段解释:
请求报文包括了请求行,请求头,空行,请求主体。
请求行:包括了请求方法,请求协议,请求信息
请求头:包括了客户端的有关信息说明
请求主体:使用get方法时没有请求主体,使用post方法时没有请求主体信息。
请求方法:
- GET:请求指定页面的信息
- HEAD:类似GET方法,但请求的仅仅是头部信息,一个使用场景是在下载一个大文件前先获取其大小再决定是否要下载,以此节约带宽资源
- POST:向指定资源提交数据进行处理请求(例如提交表单和上传文件)
- PUT:从客户端向服务器传送的数据取代指定页面的内容
- DELETE:请求服务器删除指定页面的内容
- CONNECT:预留给能够将连接改为管道方式的代理服务器
- OPTIONS:允许客户端查看服务器的性能
- TRACE:回显服务器收到的请求,用于测试或者诊断
- GET和POST的区别:1.GET是把提交的内容放到url之后用?相隔参数之间用&符号连接,但是POST方法会将内容放到请求主体中。2.GET提交的数据有一定的限制,因为URL有长度限制,但是POST方法提交的数据没有限制、3.因为GET把提交的内容放到URL的后面所有如果是提交一些用户名密码什么的会有一定的风险。但是POST放在请求主体中会相对安全一点。
请求信息:index.html
请求协议:
HTTP0.9 HTTP1.0 HTTP1.1(支持持久连接,长连接) HTTP2.0
请求头:客户端有关信息介绍说明,包括了COOKIE也在里面
请求主体:GET方式没有请求主体,POST方法没有请求信息。
响应报文:
起始行:
- 协议版本
- 状态码
1xx:指示信息—表示请求已经接收,继续处理
2xx:成功—表示请求处理完成
3xx:重定向—表示请求需要进一步处理
4xx:客户端错误—请求语法有错误或者是请求无法实现
5xx:服务端错误—请求未能被实现
常见状态码:
200:ok,正常处理
301:请求永久重定向
302:请求临时重定向
304:请求重定向到本地缓存
400:客户端请求出现语法错误
401:客户端请求没有经过授权
403:客户端的请求被拒绝,一般认为客户端没有访问权限
404:页面不存在或者被删除
500:服务端发生永久错误
503:服务端发生临时错误
响应头部
空行
响应主体
网站测评指标:
ip,pv,uv,
网站并发:单位时间内同时处理的请求数
吞吐率:服务器并发处理能力的量化描述,单位是reqs/s,指的是在某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。
ip:根据用户访问的源ip进行统计
pv:根据用户页面访问量进行统计
uv:根据用户访问的cookie信息,统计用户访问数量
对网站进行压力测试:
yum install httpd-tools -y
ab -n 100 -c 10
Apache服务介绍
Apache介绍:
它是Apache基金会下一个开源免费的web服务软件。它可以运行在广泛的计算机平台上,因其平台型和很好的安全性而被广泛使用。
特点:
功能强大,性能稳定可靠,采用MPM多路处理模块,配置简单,速度快,可以做代理服务器和负载均衡,双向认证,支持第三方模块。高度模块化。
应用场合:
使用Apache运行静态网页,图片
- 使用Apache结合PHP,Mysql,linux可以组成LAMP经典架构
-
MPM多路处理模块:
prefork:多进程io模型,一个主进程多个子进程,每个子进程处理一个请求
- woker:复用的多进程io模型,一个主进程管理多个子进程,一个子进程管理多个子线程,每个线程处理一个请求
- event:事件驱动模型,一个主进程管理多个子进程,一个进程处理多个请求。
进程线程协程的概念:
总结:
持久连接:
持久连接,每个资源获取完成后不会断开连接,而是继续等待其他的请求完成。
多路处理模块:
- prefork
多进程IO模型,一个主进程,多个子进程,每个子进程处理一个请求。
优点:适合于没有线程安全库,需要避免线程兼容性问题的系统,要是要求每个请求相互独立的情况下最好的MPM,这样若一个请求出问题不会影响到其他请求
缺点:一个进程会占用更多的系统资源,消耗更多的内存,而且它不擅长处理高并发的请求,在这种情况下一般会把请求放进队列中,一直等到有可用的进程,请求才会被处理,这样的情况导致吞吐率不会很高。
- woker
复用的多进程IO模型,一个主进程,多个子进程,一个子进程,管理多个线程,线程去处理请求。
优点:线程比进程更轻量,因为线程共享父进程的内存空间,因此内存的占用会减少一些,在高并发的情况下选择woker模式效率会更高一点
缺点:如果一个线程出现了问题也会导致同一进程下的其他线程受到影响,如果是多个线程出现问题,也只是影响apache的一个小部分,由于用到多线程,需要考虑到线程的安全。
- event
事件驱动模型epoll,和worker模式很像, 最大的 区别在于,它解决了keep-alive场景下,长期被占用的线程的资源浪费问题(某些线程因为被keep-alive,挂载哪里等待,中间没有请求过来,一直等到超时) event中会有一个监听线程来管理这些keep-alive类型的线程,当线程处理完请求后,会将会话保持交给监听线程,自己不再负责这一段会话,当有请求过来时监听线程将请求传递给服务线程,执行完毕后,又允许它释放。这样,一个线程就能处理几个请求了,实现了异步非阻塞。
HTTPS/TLS:
https://zhuanlan.zhihu.com/p/440612523
Nginx网站服务
目标:
- nginx的进程结构
- rewrite的作⽤
- select poll epoll的区别
- 惊群效应是什么
- https://blog.csdn.net/lyztyycode/article/details/78648798
- 为什么要做动静分离
-
Nginx特点:
支持高并发,消耗内存资源少
- 具有多种功能:网站web服务功能,负载均衡功能,正向代理与反向代理功能,网站缓存功能
- 在多种平台部署
- nginx实现网络通讯时采用异步网络io模型,epoll模型。
工作原理:
Nginx由内核和一系列模块组成,内核提供Nginx的web服务基本功能,如启用网络协议,创建运行环境,接受和分配用户的请求,处理模块之间的交互。Nginx的各种功能和操作都由模块来实现,Nginx的模块从结构上分为,核心模块,基础模块,第三方模块。
- 核心模块: HTTP模块、EVENT模块和MAIL模块
- 基础模块: HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块
- 第三方模块: HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块及用 户自己开发的模块
Nginx架构和进程
Nginx架构:
Nginx进程结构:
web请求处理机制:
- 多进程方式:服务器每收到一个客户端请求后,服务端的主进程生成一个对应的子进程去处理这个请求,直到客户端关闭连接,这样的优势是处理速度快,子进程间相互独立,但是很消耗硬件资源。
- 多线程方式:与多进程类似,但是每收到一个请求后服务端的主进程就会派生出一个子进程来与客户端进行连接,因为一个线程是共享子进程的空间,一个子进程可以创建多个子线程,这在很大程度上解决了资源问题,但是它也有对应的缺点,即子进程中的多个线程会互相影响。
Nginx就是采用了多进程组织模型,而且是由一个主进程Master和多个Worker进程组成。
Nginx主进程和子进程的功能:
主进程的功能:
- 读取Nginx配置文件并验证文件的有效性和正确性
- 对外暴露端口,接受外部的信号
- 对内转发:根据外部的操作不同,通过信号管理worker
- 监控:监控worker进程的状态,对出现异常的worker进行重新启动
- 建立,绑定,和建立Socker连接
- 按照配置管理,生成,结束工作进程
- 接受外界的指令,例如重启,升级和退出服务器
- 不中断服务,实现平滑升级,重启服务并应用新的配置文件,升级失败进行回滚处理
- 开启日志文件,获取文件描述符
- 编译和处理perl脚本
Nginx为什么能不中断,实现平滑升级:
- 在不停掉来进程的情况下,启动新进程。
- 老进程负责处理仍然没有处理完的请求,但不再接受新的请求
- 新进程接受新请求
- 老进程处理完所有请求,关闭所有连接后,停止。
https://blog.csdn.net/IT_ZRS/article/details/108802347
Nginx主进程支持的信号:
- TERM,INT:立即退出
- QUIT:等工作进程结束后再退出
- KILL:强制终止进程
- HUB:重新加载配置文件,使用新的配置启动工作进程,并逐步 关闭旧进程
- USR1:重新打开日志文件
- USR2:启动新的主进程,实现热升级
- WINCH:逐步关闭工作进程
Nginx工作进程支持的信号量:
- TERM,INT:立即退出
- QUIT:等待请求处理结束后再退出
- USR1:重新打开配置文件
平滑启动的流程:
总结:nginx平滑升级和加载模块,主要思想是,编译安装一个新的版本,然后将源文件的nginx启动软件替换为我们重新下载的版本,然后通过kill发送信号给主进程,让主进程热启动。
工作进程的功能:
- 所有work进程都是平等的
- 网络请求都是由worker进程处理的
- worker进程数量,在Nginx.conf中配置,一般设置为核心数,充分利用CPU资源,防止进程数量过多,避免进程竞争CPU资源,增加上下文切换的损耗
- 接受处理客户的请求
- 将请求一次送入到各个功能模块进行处理
- io调用,获取响应数据
- 与后端服务器通信,接受后端服务器的处理结果
- 缓存数据,访问缓存索引,查询和调用缓存数据
- 发送请求结果,响应客户的请求
- 接受主程序的指令,例如重启,升级和退出等。
Nginx进程间通信
⼯作进程是有主进程⽣成的,主进程由root启用,主进程使⽤fork()函数,在Nginx服务器启动过程中主 进程根据配置⽂件决定启动⼯作进程的数量,然后建⽴⼀张全局的⼯作表⽤于存放当前未退出的所有的 ⼯作进程,主进程⽣成⼯作进程后会将新⽣成的⼯作进程加⼊到⼯作进程表中,并建⽴⼀个单向的管道 并将其传递给⼯作进程,该管道与普通的管道不同,它是由主进程指向⼯作进程的单项通道,包含了主 进程向⼯作进程发出的指令、⼯作进程ID、⼯作进程在⼯作进程表中的索引和必要的⽂件描述符等信 息,单向管道,工作进程只能监听内容之后读取指令。 主进程与外界通过信号机制进⾏通信,当接收到 需要处理的信号时,它通过管道向相关的⼯作进程发送正确的指令,每个⼯作进程都有能⼒捕获管道中 的可读事件,当管道中有可读事件的时候,⼯作进程就会从管道中读取并解析指令,然后采取相应的执 ⾏动作,这样就完成了主进程与⼯作进程的交互。 ⼯作进程之间的通信原理基本上和主进程与⼯作进程之间的通信是⼀样的,只要⼯作进程之间能够取得 彼此的信息,建⽴管道即可通信,但是由于⼯作进程之间是完全隔离的,因此⼀个进程想要知道另外⼀ 个进程的状态信息就只能通过主进程来设置了。 为了实现⼯作进程之间的交互,主进程在⽣成⼯作进程之后,在⼯作进程表中进⾏遍历,将该新进程的 ID以及针对该进程建⽴的管道句柄传递给⼯作进程中的其他进程,为⼯作进程之间的通信做准备,当⼯ 作进程1向⼯作进程2发送指令的时候,⾸先在主进程给它的其他⼯作进程⼯作信息中找到2的进程ID, 然后将正确的指令写⼊指向进程2的管道,⼯作进程2捕获到管道中的事件后,解析指令并进⾏相关操 作,这样就完成了⼯作进程之间的通信
https://www.runoob.com/linux/linux-comm-netstat.html
Nginx代理和缓存
正向代理和反向代理:
正向代理一般由客户端架设,架设在客户端和真实服务器之间,它的运用场景是客户端A想访问自己访问不到的服务器,于是就将请求发给正向代理服务器,然后正向代理服务器替用户去访问,并把资源缓存到本地,将资源发送给客户端。
反向代理服务器一般由服务端架设,它的目的是接受用户的访问请求,并将请求分发给后端的真实服务器,并把收到的内容缓存到本地,将内容发给客户端。对用户来说是透明的
Nginx和Apache比较:
链接:https://www.zhihu.com/question/19571087/answer/1903966621
Nginx和Apache一样,都是HTTP服务器软件,在功能实现上都采用模块化结构设计,都支持通用的语言接口,如PHP、Perl、Python等,同时还支持正向和反向代理、虚拟主机、URL重写、压缩传输、SSL加密传输等。
- 在功能实现上,Apache的所有模块都支持动、静态编译,而Nginx模块都是静态编译的,
- 对FastCGI的支持,Apache对Fcgi的支持不好,而Nginx对Fcgi的支持非常好;
- 在处理连接方式上,Nginx支持epoll,而Apache却不支持;
在空间使用上,Nginx安装包仅仅只有几百K,和Nginx比起来Apache绝对是庞然大物。
Nginx相对apache的优点
轻量级,同样起web 服务,比apache 占用更少的内存及资源
- 静态处理,Nginx 静态处理性能比 Apache 高 3倍以上
- 抗并发,nginx 处理请求是异步非阻塞的,而apache则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。在- - Apache+PHP(prefork)模式下,如果PHP处理慢或者前端压力很大的情况下,很容易出现Apache进程数飙升,从而拒绝服务的现象。
- 高度模块化的设计,编写模块相对简单
-
apache相对nginx的优点
rewrite,比nginx 的rewrite 强大
- 模块超多,基本想到的都可以找到
- 少bug,nginx的bug相对较多
- 超稳定
Apache对PHP支持比较简单,Nginx需要配合其他后端用
选择Nginx的优势所在
作为Web服务器: Nginx处理静态文件、索引文件,自动索引的效率非常高。
- 作为代理服务器,Nginx可以实现无缓存的反向代理加速,提高网站运行速度。
- 作为负载均衡服务器,Nginx既可以在内部直接支持Rails和PHP,也可以支持HTTP代理服务器对外进行服务,同时还支持简单的容错和利用算法进行负载均衡。
- 在性能方面,Nginx是专门为性能优化而开发的,在实现上非常注重效率。它采用内核Poll模型(epoll and kqueue ),可以支持更多的并发连接,最大可以支持对50 000个并发连接数的响应,而且只占用很低的内存资源。
- 在稳定性方面,Nginx采取了分阶段资源分配技术,使得CPU与内存的占用率非常低。Nginx官方表示,Nginx保持10 000个没有活动的连接,而这些连接只占用2.5MB内存,因此,类似DOS这样的攻击对Nginx来说基本上是没有任何作用的。
- 在高可用性方面,Nginx支持热部署,启动速度特别迅速,因此可以在不间断服务的情况下,对软件版本或者配置进行升级,即使运行数月也无需重新启动,几乎可以做到7×24小时不间断地运行。
同时使用Nginx和Apache
由于Nginx和Apache各自的优势,现在很多人选择了让两者在服务器中共存。在服务器端让Nginx在前,Apache在后。由Nginx做负载均衡和反向代理,并且处理静态文件,将动态请求(如PHP应用)交给Apache去处理。
一个web请求的过程
总结:
- 在浏览器输入了URL之后发生了什么
- HTTP请求方法
- Apache的MPM多路处理模块
- HTTP状态码
- HTTPS/TLS认证的过程
- Nginx的epoll模型
- Nginx平滑升级
- Nginx进程的通信方式
- Apache和Nginx的区别