运维体系-单机架构
从一个http请求开始:
单机时代 --单机模式
单台web服务器+DB , 日志每日凌晨进行备份。
动静分离:ngix+php 进行动静分离。
组件分离:静态服务器使用单独的服务器,使用一级域名防止cookie提交,使用多个二级域名提高加载速度,静态资源作为NFS ,存放在NFS上,数据库每日凌晨备份,保存在NFS上。
说明:浏览器针对一个域名 有下载线程的限制,所以使用不同域名来提高加载速度。还有 懒加载的手段,监听页面下滑的事件,往下拉页面时在读取相应的内容,这样可以降低首屏显示的时间,还可以减少带宽。
源端口 为随机端口。
TCP 三次握手
说明:SYN = 1 ,ACK = 1是把 报文中的SYN,ACK 标志位 设为1;
SYN(用于连接),ACK,FIN(用于关闭) 标志位 位于报文图中的 CONtrol bits 位置处。
首次客户端发给 服务器的seq ***=x 是随机生成的,服务器返回的ack = x + 1 说明 收到了客户端的请求。
第二次客户端发给服务器的seq=x +1 ,和ack = y+1 也是保证 客户端收到了服务器发送的请求。至此两者都变成EST状态,连接成功。
在进行连接时,客户端与服务器一共涉及到了 五钟状态,CLOSE,LISTEN,SYN-SEND, SYN-RCVD,ESTAB-LISHED
TCP断开 需要四次挥手。
需要四次挥手的原因: 因为TCP是全双工的, 需要两者共同确认才能断开。
说明:客户端首先发送FIN 要断开,服务器返回ACK,确定客户端可以关闭。
然后服务器在向客户端发送FIN 要断开,然后客户端返回ACK,确定服务器可以关闭。
如果服务器有很多端口处于CLOSE-WAIT状态,说明程序写的有问题。因为服务器向客户端发送FIN请求失败了,这时可能客户端已经关闭了,服务器就会一直处于CLOSE-WAIT 状态。
服务器发送FIN请求,变成LAST-ACK 状态,如果收到了ACK 就直接关闭了。客户端处于TIME-WAIT 状态会 持续一段时间。
TIME-WAIT状态 出现在 主动关闭的地方,总共会持续60s. 持续60s 时间是为了 完全断开连接。
这里就可以对 TIME-WAIT 状态进行一个优化,因为处于该状态时,会占用该端口,来新连接时不能创建。
优化时,涉及三个参数
reuse : 0 关闭 1 打开。复用,一个socket 处于 TIME-WAIT状态时,如果新来一个连接请求,可以复用该socket, 这时就必须开启
timestamp 参数 设为1,因为不同连接之间要通过时间戳来区分,从而不同连接间的数据不会混乱。
recycle 该参数 会关闭 处于TIME-WAIT状态的socket。 这个参数不能用户NAT 模式的网络下(例如负载均衡 ngnix),因为NAT 模式下内部网络 对外是 一个ip 地址。
出现socket限制的根本原因是原目的ip 只有一个,端口也是固定的,如果 原目的ip 设置为多个,那么就不会出现限制。http-proxy 就可以 做这个事情,支持设置ip 地址来解决一个限制问题,不用进行参数调优。