week08


redis搭建哨兵原理和集群实现


LVS常用模型工作原理、LVS的负载策略有哪些,各应用在什么场景,通过LVS DR任意实现1-2种场景


web http协议通信过程

1 dns解析IP地址
1.1 优先查找本地缓存
1.2 其次查询路由器缓存
1.3 dns递归查询
2 tcp 连接
2.1获取服务器ip地址和端口号
2.2创建tcp套接字
2.3连接到服务器ip,端口号
2.4创建tcp套接字,绑定在80端口
2.5允许套接字连接
2.6等待连接
2.7客户端连接成功
3.发送http协议
3.1客户端发送http报文数据
3.2服务器端通知应用程序有链接到来
3.3开始读取请求
3.4处理http报文
3.5发送http报文
4.解析http协议
4.1处理http报文
4.2关闭连接

http报文详解:
第一部分:
开始行:http方法 空格 url 空格 版本 回车换行
示例:get / http/1.1
首部行: 字段名:值 回车换行
示例: Accept: /
实体行:
示例: post form数据
常用http状态

  • 1xx 信息提示

  • 2xx 成功
    200 成功

  • 3xx 重定向
    301 资源已删除,但响应的报文中指明新的资源位置
    303 新资源位置
    304 服务器端资源未改变
    307 浏览器内部重定向

  • 4xx:错误
    401 服务器端要求验证
    403 请求被禁止
    404 资源不存在
    499 客户端连接超时

  • 5xx 服务器端异常
    500 服务器内部错误
    502 网关错误,后端服务返回了无效的响应,没有正确返回资源
    503 后端服务不能响应,后端服务挂掉了,不能提供服务
    504 网关超时,后端服务不能及时响应,后端服务可以联通,但长时间没有返回响应报文

总结网络IO模型和nginx架构

用户线程从网络读取数据,需要经过两个阶段,第一个阶段数据从网络copy到内核空间,第二阶段从内核空间copy到用户空间

  • 同步阻塞:用户线程发起IO调用后,等待数据到来。直到数据copy到用户空间。

  • 非阻塞IO:用户线程发起IO调用后,通过轮询方式,不断检测内核空间是否有数据

  • IO多路复用:用户线程发起IO调用后,继续完成其他任务,把等待数据交给内核,内核负责监控数据是否准备好,内核数据准备好后通知用户线程

  • 信号驱动IO:用户线程发起IO调用后,继续完成其他任务,内核数据准备好后发送信号给用户线程,用户线程收到信号后开始读取内核数据

  • 异步IO: 用户线程发起IO调用后,继续完成其他任务,内核数据copy到用户空间后,通知用户线程

nginx架构:
nginx是一个主进程 、多个work进程架构,通常按照cpu核心数启动work进程数量。

用户发起请求后,主进程接收请求后交给worker进程处理。

nginx模块:

  • 核心模块 nginx服务器运行必不可少的模块,提供错误日志记录、配置文件解析、事件驱动、进程管理
  • 标准http模块 提供http协议解析
  • 可选http模块 主要用于扩展http功能
  • stream服务模块 实现反向代理 包括tcp代理
  • 第三方模块 扩展nginx服务器应用,完成开发者自定义功能
  • 负载均衡模块 平衡客户端请求,发送到后端服务器
  • 静态文件处理模块 用户快速传输静态文件
  • 缓存模块 允许nginx对响应进行响应
  • ssl/tls模块 提供ssl/tls的身份加密和验证
  • 日志模块 自定义配置日志

nginx编译安装脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#************************************
#Author: 白展躺
#Date: 2023-06-29
#Copyright: 2023
#************************************
NG_VERSION="1.24.0"
SRC_DIR="/usr/src/nginx-${NG_VERSION}/"
INSTALL_DIR="/apps/nginx"
source /etc/os-release
color () {
RES_COL=60
MOVE_TO_COL="echo -en \\033[${RES_COL}G"
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \E[0m"
echo -n "$1" && $MOVE_TO_COL
echo -n "["
if [ $2 = "success" -o $2 = "0" ] ;then
${SETCOLOR_SUCCESS}
echo -n $" OK "
elif [ $2 = "failure" -o $2 = "1" ] ;then
${SETCOLOR_FAILURE}
echo -n $"FAILED"
else
${SETCOLOR_WARNING}
echo -n $"WARNING"
fi
${SETCOLOR_NORMAL}
echo -n "]"
echo
}

function install(){
yum -y install pcre-devel openssl-devel zlib-devel
tar xf /usr/local/src/nginx-${NG_VERSION}.tar.gz -C /usr/src/
cd /usr/src/nginx-${NG_VERSION}/
useradd -s /sbin/nologin nginx
./configure --prefix=${INSTALL_DIR} --pid-path=${INSTALL_DIR}/nginx.pid --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module
make && make install
ln -s ${INSTALL_DIR}/sbin/nginx /usr/sbin/
cat > /usr/lib/systemd/system/nginx.service << EOF
[Unit]
Description=nginx - high performance web server
After=network.target

[Service]
Type=forking
PIDFile=${INSTALL_DIR}/nginx.pid
ExecStartPre=/usr/sbin/nginx -t -c ${INSTALL_DIR}/conf/nginx.conf
ExecStart=/usr/sbin/nginx -c ${INSTALL_DIR}/conf/nginx.conf
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/usr/sbin/nginx -s stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

EOF
systemctl enable --now nginx.service
}

install

核心配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 - worker_processes  auto; //工作进程,按照cpu核心数自动设置
- worker_cpu_affinity 0001 0010 0100 1000; //绑定cpu 按照cpu核心数的二进制代码 绑定 0001 =第一个cpu 0010 = 第二个cpu
- worker_priority -10;//工作进程优先级
worker_rlimit_nofile 4096; //所有工作进程打开的最大文件数

events {
worker_connections 1024; //单个worker进程打开的文件数
accept_mutex on;//启用互斥锁,在多个进程之间只有一个进程能够接受新连接。这样可以一定程度上避免惊群现象
multi_accept on ; //一次性接受多个新连接
}

http{
//自定义日志格式
log_format access_json '{"@timestamp":"$time_iso8601",'
'"host":"$server_addr",'
'"clientip":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,' #总的处理时间
'"upstreamtime":"$upstream_response_time",'
'"upstreamhost":"$upstream_addr",' #后端应用服务器处理时间
'"http_host":"$host",'
'"uri":"$uri",'
'"xff":"$http_x_forwarded_for",'
'"referer":"$http_referer",'
'"tcp_xff":"$proxy_protocol_addr",'
'"http_user_agent":"$http_user_agent",'
'"status":"$status"}';

}

常规配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
server {
listen 80;
server_name 10.1.0.13;
access_log logs/host.access.pc.log access_json;
location / {
root /var/www/web;
index index.html;
expires 1d;
}

location /api {
client_max_body_size 10M;
proxy_pass http://realserver;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
root /data/nginx/pc;
index index.html;
}
location /status {
stub_status;
auth_basic "auth login";
auth_basic_user_file /apps/nginx/conf/.htpasswd;

}
}

upstream realserver{
hash $remote_addr consistent;
server 10.1.0.19:80;

}

常用命令

1
2
3
4
ls -l /proc/1073/fd //查看进程打开文件数
cat /proc/1066/limits //查看主进程最大打开文件数
系统服务启动的进程 在service中配置最大打开文件数
普通用户启动的进程修改 /etc/security/limits.conf

url正则匹配规则

1
2
3
4
5
6
7
8
= 与url精确匹配
^~ 与url开头匹配
~ 与url包含匹配,区分大小写
~* 与url包含匹配,不区分大小写
不带符号,匹配url所有场景
\ 转移字符 可以将. * ? 转义为普通符号
优先级 = ,^~,~/~*,不带符号

nginx状态:
编译with-http_stub_status_module 模块
配置:

1
2
3
4
5
6
7
8
location /status {
stub_status;
auth_basic "auth login";
auth_basic_user_file /apps/nginx/conf/.htpasswd;

}
#添加访问用户名密码
htpasswd -b /apps/nginx/conf/.htpasswd test 123456

Active connections: 1 //活动连接数
accepts handled requests //已接收请求,已处理的请求,总的请求数
Reading: 0 Writing: 1 Waiting: 0//正在读取的数量,写的数量,等待的数量
1692762783187

添加echo-nginx-module-0.63 模块

1
--prefix=/apps/nginx --pid-path=/apps/nginx/nginx.pid --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/usr/src/echo-nginx-module-0.63

添加测试地址

1
2
3
4
5
6
location /echo {
echo $remote_addr;

}

curl 192.168.1.8/echo