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//正在读取的数量,写的数量,等待的数量
添加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
|