HTTP

协议格式

请求(Request)

首行

  • Method(GET、POST、OPTIONS等)
  • URL(协议名、登录信息、域名、端口号、文件路径、查询字符串)
  • Version

请求头(Header):键值对结构,每个键值对占一行,键和值之间使用冒号空格分隔

  • Host
  • Content-Length
  • Content-Type
  • User-Agent
  • Referer
  • Cookie

空行:Header 结束标志

正文:可有可无

响应(Response)

首行 HTTP/1.1 200 OK

  • 版本号 HTTP/1.1
  • 状态码 200
  • 状态码描述 OK

响应头:键值对结构,每个键值对占一行,键和值之间使用冒号空格分隔

空行:Header的结束标志

正文:可有可无

响应状态码

1
2
3
4
5
1XX	Hold on 等会继续
2XX	Here you are 成功访问
3XX	Go away 重定向
4XX	You fucked up 服务器崩了
5XX	I fucked up 客服端的问题

浏览器输入一个网址,内部发生了什么?

  • DNS解析
  • TCP连接:获取到ip地址后,通过tcp协议与服务器建立连接
  • HTTP请求:一旦TCP建立成功,浏览器会向服务器发送HTTP请求,包括请求头、请求方法、请求体等信息。
  • 服务器处理请求
  • HTTP响应
  • 页面渲染
  • TCP连接断开

三次握手和四次挥手

三次握手,确认双方的发送能力和接收能力正常,指定自己的初始化序列号为后面可靠性传送做准备。

HTTP2比HTTP1.1性能

  • 头部压缩
  • 二进制格式(帧)
  • 并发传输
  • 服务器主动推送资源

HTTP3优化

  • 无对头阻塞(因为TCP原因换成UDP),某个流阻塞,不影响其他流
  • 更快的连接建立
  • 连接迁移(通过连接ID来标记通信的断电,不是通过TCP四元组)

HTTPS保证安全

作用

内容加密:建立信息安全通道,保证传输的安全

身份认证:确认网站的真实性

数据完整性:防止内容被篡改

SSL和TLS

SSL 安全套接字层

  • 记录协议:建立在可靠的传输协议(如TCP)之上
  • 握手协议:建立在记录协议之上,用于在传输数据之前进行身份认证、协商加密算法、交换加密密钥等

TLS 传输层安全协议

建立在SSL3.0规范之上,也分记录协议和握手协议

比SSL优势:

  • 消息认证密钥散列法
  • 增强伪随机功能
  • 改进的已完成消息验证
  • 一致证书处理
  • 特定报警消息

握手过程

客户端首次请求

客户端提供:

  • 支持协议版本,如TLS1.0
  • 生成的随机数,用于“对话密钥”
  • 支持加密算法,如RSA
  • 支持压缩方法

服务端首次回应

服务端提供:

  • 协议版本
  • 加密算法
  • 随机数
  • 服务器证书

客户端再次回应

  • 再产生一个随机数(第三个)
  • ChangeCipherSpec 告知服务端已切换到协商过的加密套件
  • 生成一个Session Secret

服务器再次响应

  • 对第三个随机数验证
  • 发送ChangeCipherSpec 告知已切换到协商过的加密套件
  • 使用Session Secret和加密套件加密一段Finish 消息发送给客户端,验证是否成功

SSL握手使用非对称加密(速度慢,耗费资源),传送数据使用非对称加密。

Nginx

全局调优

最多开启8各,8个以上性能就不会再提升了,稳定性会变低

worker_processes 2

cpu有多少个核,就有几位数,1代表内核开启,0代表内核关闭 10101010表示开启了第2,4,6,8内核,01010101表示开始了1,3,5,7内核

worker_cpu_affinity 01 10

用于设置一个 worker 进程所能打开的最多文件数量。其默认值与当前 Linux 系统可以打开的最大文件描述符数量相同

worker_rlimit_nofile 65535

events 模块下的调优

worker_connections 1024

accept_mutex on

accept_mutex_delay 500ms

multi_accept on

use epoll

漏桶算法限流

Linux系统排查

网络篇

网路不通

要定位问题,一般不断尝试不可能故障的地方,最终定位问题根源。

  1. 是否接入到网络

ethtool eth0

  1. 是否启用了相对应的网卡
1
ifconfig eth1
  1. 是否设置网关

route -n

  1. DNS故障

有问题在文件 /etc/resolv.conf 查看配置,也可查看 cat /etc/sysconfig/network-scripts/ifcfg-eth0 永久配置

nslookup google.com

  1. 能否路由到目标主机

使用 traceroute 跟踪 traceroute google.com

  1. 远程端口是否开放

telnet ip port

telnet 无法判断是没有开放,还是被防火墙拦截了,nmap工具更强大

nmap -p ip prt 查看端口开放

netstat -lnp | grep PORT 在本地查看某个端口是否开放

  1. 查看防火墙规则

iptables -L

比如 iptables -t nat -n -L PREROUTING 查看转发

网络很慢

  1. DNS是否是问题的源头
  2. 路由过程哪些是瓶颈

traceroute 不仅查看路由正确性,还可以查看网络中每一跳的延时

  1. 查看带宽的使用情况

iftop 工具

tcpdump 工具

1
2
3
4
5
6
# tcpdump -n port N    //只捕捉特定端口的流量
# tcpdump -n port N1 or port N2    //捕获多个端口的流量
# tcpdump -w output.pcap    //数据包转储,将原始数据包保留到output.pcap
# tcpdump -C 10 -w output.pcap    //限制每个转储文件的上限,达到上限后将文件分卷(以MB为单位)
# tcpdump -C 10 -W 5 -w output.pcap    //不仅限制每个卷的上限,而且限制卷的总数
# tcpdump -r output.pcap    //重播已经保存的数据包记录

其它思路,鸟哥的Linux私房菜中也提供了一些类似的网络排查思路:

  1. 网卡是否工作,包括硬件和驱动:lspci,dmesg
  2. IP参数是否正确设置:ifconfig
  3. 局域网内通信是否正常:ping
  4. 路由信息是否正常:route -n
  5. DNS状态:dig, nslookup
  6. 路由节点状况与延时:traceroute
  7. 服务监听端口:netstat -lnp
  8. 防火墙:iptables, SELinux

CPU篇

uptime查看负载,w查看负载

top查看cpu使用率

us 用户进程占用

sy 内核进程占用

wa 低,id 高,排除cpu资源瓶颈可能

wa高,说明io占用了大量cpu时间,检查交换空间使用,内存充足徐检查那个进程占用大量io资

iostat 查看系统io占用

iotop 也可查看

sysstat 工具与负载历史回放

sar 命令

IO篇

遇到只读的文件系统

重新挂载分区

磁盘满

df -h 磁盘空间

df -i 查看文件节点数

  • 删除大量文件
  • 移动大量文件
  • 压缩大量文件成一个
  • 备份当前文件系统的所有文件,重新格式化,获取更多节点,再复制回去(不推荐)

内存篇

内存硬件查看

dmidecode -t memory

内存大体使用

free -m/-h

内核态占用

slabtop

内存动态变化

vmstat

MQTT协议

是一种消息传递模式,它将发送消息的客户端(发布者)与接收消息的客户端(订阅者)解耦。

代理(Broker)的中间角色负责所有消息的路由和分发工作,发布者将带有主题的消息发送给代理,订阅者则向代理订阅主题来接收消息。

主题和订阅者无法被提前注册或创建,不存在任何订阅消息将被丢弃。

发布者

一次只能向一个主题发送数据

订阅者

一次可订阅多个主题。

代理

负责接收发布者的消息,并将消息转发至符合条件的订阅者。代理也需要负责处理客户端发起的连接、断开连接、订阅、取消订阅等请求。

主题

MQTT进行消息路由的基础,类似url路径

Docker

启动服务(构建或重新创建,启动并附加到容器) docker-compose up -d

停止服务 docker-compose down

列出所有运行容器 docker-compose ps

查看服务日志 docker-compose logs

构建 docker-compose build

启动、停止、重启 docker-compose start | stop | restart

容器生命周期管理

  • 创建容器 docker create
  • 运行容器 docker run
    • -d
    • -i
    • -p
    • -P
    • -t
  • 暂停容器(可选)docker pause | unpause
  • 取消暂停容器(可选)
  • 启动容器 docker start | stop | restart
  • 停止容器
  • 重启容器
  • 杀死容器 docker kill
  • 销毁容器 docker exec

容器操作

镜像仓库

本地镜像管理