什么是正向代理?什么是反向代理?
-
正向代理服务器
-
客户端和目标服务器之间的服务器,客户端向代理发送一个请求指定目标服务器,然后代理向目标服务器请求并获得内容,并返回给客户端,平时说的代理服务器一般是正向代理服务器
-
核心:用户知道自己访问的目标服务器
-
场景:跳板机、访问原来无法访问的网站, 比如国外的一些站点
-
-
反向代理服务器(Nginx)
- 客户端和目标服务器之间的服务器,客户端向代理发送一个请求,然后代理向目标服务器请求并获得内容,并返回给客户端。反向代理隐藏了真实的服务器
- 核心:客户端不知道要访问的目标服务器是哪台服务器,代理会根据一定的策略选择一个真实的服务器进行请求
- 场景:访问淘宝,知道访问的域名是taobao.com, 但是后面提供数据的具体是什么域名或ip我们是不知道的
Nginx访问日志的用处
Nginx统计站点访问量、高频url统计
- 查看访问最频繁的前100个IP
awk '{print $1}' access_temp.log | sort -n |uniq -c | sort -rn | head -n 100
- 统计访问最多的url 前20名
cat access_temp.log |awk '{print $7}'| sort|uniq -c| sort -rn| head -20 | more
-
基础
awk 是文本处理工具,默认按照空格切分,$N 是第切割后第N个,从1开始 sort命令用于将文本文件内容加以排序,-n 按照数值排,-r 按照倒序来排 案例的sort -n 是按照第一列的数值大小进行排序,从小到大,倒序就是 sort -rn uniq 去除重复出现的行列, -c 在每列旁边显示该行重复出现的次数。 head -n 100 前100条 空格是分割符 $取第几个
自定义日志格式,统计接口响应耗时
-
日志格式增加 $request_time
从接受用户请求的第一个字节到发送完响应数据的时间,即包括接收请求数据时间、程序响应时间、输出响应数据时间 $upstream_response_time:指从Nginx向后端建立连接开始到接受完数据然后关闭连接为止的时间 $request_time一般会比upstream_response_time大,因为用户网络较差,或者传递数据较大时,前者会耗时大很多 -
配置自定义日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" $request_time'; server { listen 80; server_name aabbcc.com; location / { root /usr/local/nginx/html; index xdclass.html; } #charset koi8-r; # access_log logs/host.access.log main; } -
统计耗时接口, 列出传输时间超过 2 秒的接口,显示前5条
cat time_temp.log|awk '($NF > 2){print $7}'|sort -n|uniq -c|sort -nr|head -5
备注:$NF 表示最后一列, awk '{print $NF}'
压缩是时间换空间,还是空间换时间?
-
web层主要涉及浏览器和服务器的网络交互,而网络交互显然是耗费时间的
-
要尽量减少交互次数
-
降低每次请求或响应数据量。
-
开启压缩
- 在服务端是时间换空间的策略,服务端需要牺牲时间进行压缩以减小响应数据大小
- 压缩后的内容可以获得更快的网络传输速度,时间是得到了优化
- 所以是双向的
Nginx的第三方利器OpenResty+Lua介绍
简介: 介绍Nginx的扩展 整合框架OpenResty
-
什么是OpenResty, 为什么要用OpenResty?
由章亦春发起,是基于Ngnix和Lua的高性能web平台,内部集成精良的LUa库、第三方模块、依赖, 开发者可以方便搭建能够处理高并发、扩展性极高的动态web应用、web服务、动态网关。 OpenResty将Nginx核心、LuaJIT、许多有用的Lua库和Nginx第三方模块打包在一起 Nginx是C语言开发,如果要二次扩展是很麻烦的,而基于OpenResty,开发人员可以使用 Lua 编程语言对 Nginx 核心模块进行二次开发拓展 性能强大,OpenResty可以快速构造出1万以上并发连接响应的超高性能Web应用系统
拓展
让Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL, Memcaches 以及 Redis 等都进行一致的高性能响应。所以对于一些高性能的服务来说,可以直接使用 OpenResty 访问 Mysql或Redis等,而不需要通过第三方语言(PHP、Python、Ruby)等来访问数据库再返回,这大大提高了应用的性能
-
什么是ngx_lua
ngx_lua是Nginx的一个模块,将Lua嵌入到Nginx中,从而可以使用Lua来编写脚本,部署到Nginx中运行, 即Nginx变成了一个Web容器;开发人员就可以使用Lua语言开发高性能Web应用了。 -
OpenResty提供了常用的ngx_lua开发模块
- lua-resty-memcached
- lua-resty-mysql
- lua-resty-redis
- lua-resty-dns
- lua-resty-limit-traffic
通过上述的模块,可以用来操作 mysql数据库、redis、memcached等,也可以自定义模块满足其他业务需求, 很多经典的应用,比如开发缓存前置、数据过滤、API请求聚合、AB测试、灰度发布、降级、监控、限流、防火墙、黑白名单等
OpenResty + Lua相关环境准备
简介:OpenResty和Lua相关环境准备
-
OpenResty安装
# add the yum repo:
wget https://openresty.org/package/centos/openresty.repo
sudo mv openresty.repo /etc/yum.repos.d/
# update the yum index:
sudo yum check-update
sudo yum install openresty
#安装命令行工具
sudo yum install openresty-resty
# 列出所有 openresty 仓库里的软件包
sudo yum --disablerepo="*" --enablerepo="openresty" list available
#查看版本
resty -V
注意:如果需要指定配置文件 nginx -c 配置文件路径
比如 ./nginx -c /usr/local/nginx/conf/nginx.conf
Nginx+OpenResty +Lua开发内网访问限制
简介: 讲解Nginx+OpenRestry开发网络访问限制
- 生产环境-管理后台一般需要指定的网络才可以访问,网段/ip等
- Nginx+OpenRestry+Lua开发
http{
# 这里设置为 off,是为了避免每次修改之后都要重新 reload 的麻烦。
# 在生产环境上需要 lua_code_cache 设置成 on。
lua_code_cache off;
# lua_package_path可以配置openresty的文件寻址路径,$PREFIX 为openresty安装路径
# 文件名使用“?”作为通配符,多个路径使用“;”分隔,默认的查找路径用“;;”
# 设置纯 Lua 扩展库的搜寻路径
lua_package_path "$prefix/lualib/?.lua;;";
# 设置 C 编写的 Lua 扩展模块的搜寻路径(也可以用 ';;')
lua_package_cpath "$prefix/lualib/?.so;;";
server {
location / {
access_by_lua_file lua/white_ip_list.lua;
proxy_pass http://lbs;
}
}
- lua/white_ip_list.lua
local black_ips = {["127.0.0.1"]=true}
local ip = ngx.var.remote_addr
if true == black_ips[ip] then
ngx.exit(ngx.HTTP_FORBIDDEN)
return;
end
-
拓展
- 如何做一个动态黑名单控制?
- 里面 /usr/local/openresty/lualib/resty 很多第三方模块
Nginx+OpenRestry开发下载限速
-
限速限流应用场景
-
下载限速:保护带宽及服务器的IO资源
-
请求限流:防止恶意攻击,保护服务器及资源安全
- 限制某个用户在一个给定时间段内能够产生的HTTP请求数
- 限流用在保护上游应用服务器不被在同一时刻的大量用户访问
-
-
openResty下载限速案例实操
- Nginx 有一个
$limit_rate,这个反映的是当前请求每秒能响应的字节数, 该字节数默认为配置文件中limit_rate指令的设值
#当前请求的响应上限是 每秒 300K 字节 location /download { access_by_lua_block { ngx.var.limit_rate = "300K" } alias /usr/local/software/app; } 网盘静态资源下载限速实现原理
- Nginx 有一个
简介: 讲解常见的资源下载限速实现原理
-
下载限速实现原理
- 目的:限制下载速度
- 常用的是漏桶原理和令牌桶原理
-
什么是漏桶算法
- 备注:如果是请求限流,请求先进入到漏桶里,漏桶以固定的速度出水,也就是处理请求,当水加的过快也就是请求过多,桶就会直接溢出,也就是请求被丢弃拒绝了,所以漏桶算法能强行限制数据的传输速率或请求数
-
什么是令牌桶算法
-
备注:只要突发并发量不高于桶里面存储的令牌数据,就可以充分利用好机器网络资源。
如果桶内令牌数量小于被消耗的量,则产生的令牌的速度就是均匀处理请求的速度
-
Ngnix高可用解决方案LVS+KeepAlived
- Nginx集群架构(vip )
-
Nginx高可用解决方案-基础
国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系。 从低到高分别是: 物理层、数据链路层、网络层、传输层、会话层、表示层和应用层 四层工作在OSI第四层 也就是传输层 七层工作在最高层,也就是应用层-
F5、LVS(四层负载 tcp)
- 用虚拟ip+port接收请求,再转发到对应的真实机器
-
HAproxy、Nginx(七层负载)
- 用虚拟的url或主机名接收请求,再转向相应的处理服务器
-
讲解业界主流高可用方案Linux虚拟服务器 LVS讲解
-
什么是LVS
LVS是Linux Virtual Server,Linux虚拟服务器,是一个虚拟的服务器集群系统
项目是由章文嵩博士成立,是中国国内最早出现的自由软件项目之一
Linux2.4 内核以后,LVS 已经是 Linux 标准内核的一部分
软件负载解决的两个核心问题是:选谁、转发
- 提供了10多种调度算法: 轮询、加权轮询、最小连接、目标地址散列、源地址散列等
-
三种负载均衡转发技术
- NAT:数据进出都通过 LVS, 前端的Master既要处理客户端发起的请求,又要处理后台RealServer的响应信息,将RealServer响应的信息再转发给客户端, 容易成为整个集群系统性能的瓶颈; (支持任意系统且可以实现端口映射)
- DR: 移花接木,最高效的负载均衡规则,前端的Master只处理客户端的请求,将请求转发给RealServer,由后台的RealServer直接响应客户端,不再经过Master, 性能要优于LVS-NAT; 需要LVS和RS集群绑定同一个VIP(支持多数系统,不可以实现端口映射)
- TUNL:隧道技术,前端的Master只处理客户端的请求,将请求转发给RealServer,然后由后台的RealServer直接响应客户端,不再经过Master;(支持少数系统,不可以实现端口映射))
讲解业界主流高可用方案keepalived讲解
-
什么是keepalived
- 核心:监控并管理 LVS 集群系统中各个服务节点的状态
keepalived是一个类似于交换机制的软件,核心作用是检测服务器的状态,如果有一台web服务器工作出现故障,Keepalived将检测到并将有故障的服务器从系统中剔除,使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成。
后来加入了vrrp(虚拟路由器冗余协议),除了为lvs提供高可用还可以为其他服务器比如Mysql、Haproxy等软件提供高可用方案
- 安装
yum install -y keepalived
#路径
cd /etc/keepalived
- 启动和查看命令
#启动
service keepalived start
#停止
service keepalived stop
#查看状态
service keepalived status
#重启
service keepalived restart
#停止防火墙
systemctl stop firewalld.service
- 注意: 如果有缺少依赖可以执行下面的命令
yum install -y gcc
yum install -y openssl-devel
yum install -y libnl libnl-devel
yum install -y libnfnetlink-devel
yum install -y net-tools
yum install -y vim wget
Keepalived核心配置讲解
简介:Keepalived核心配置讲解
- 配置/etc/keepalived/keepalived.conf
! Configuration File for keepalived
global_defs {
router_id LVS_DEVEL # 设置lvs的id,在一个网络内应该是唯一的
enable_script_security #允许执行外部脚本
}
#配置vrrp_script,主要用于健康检查及检查失败后执行的动作。
vrrp_script chk_real_server {
#健康检查脚本,当脚本返回值不为0时认为失败
script "/usr/local/software/conf/chk_server.sh"
#检查频率,以下配置每2秒检查1次
interval 2
#当检查失败后,将vrrp_instance的priority减小5
weight -5
#连续监测失败3次,才认为真的健康检查失败。并调整优先级
fall 3
#连续监测2次成功,就认为成功。但不调整优先级
rise 2
user root
}
#配置对外提供服务的VIP vrrp_instance配置
vrrp_instance VI_1 {
#指定vrrp_instance的状态,是MASTER还是BACKUP主要还是看优先级。
state MASTER
#指定vrrp_instance绑定的网卡,最终通过指定的网卡绑定VIP
interface ens33
#相当于VRID,用于在一个网内区分组播,需要组播域内内唯一。
virtual_router_id 51
#本机的优先级,VRID相同的机器中,优先级最高的会被选举为MASTER
priority 100
#心跳间隔检查,默认为1s,MASTER会每隔1秒发送一个报文告知组内其他机器自己还活着。
advert_int 1
authentication {
auth_type PASS
auth_pass 1111
}
#定义虚拟IP(VIP)为192.168.159.100,可多设,每行一个
virtual_ipaddress {
192.168.159.100
}
#本vrrp_instance所引用的脚本配置,名称就是vrrp_script 定义的容器名
track_script {
chk_real_server
}
}
# 定义对外提供服务的LVS的VIP以及port
virtual_server 192.168.159.100 80 {
# 设置健康检查时间,单位是秒
delay_loop 6
# 设置负载调度的算法为rr
lb_algo rr
# 设置LVS实现负载的机制,有NAT、TUN、DR三个模式
lb_kind NAT
# 会话保持时间
persistence_timeout 50
#指定转发协议类型(TCP、UDP)
protocol TCP
# 指定real server1的IP地址
real_server 192.168.159.146 80 {
# 配置节点权值,数字越大权重越高
weight 1
# 健康检查方式
TCP_CHECK { # 健康检查方式
connect_timeout 10 # 连接超时
retry 3 # 重试次数
delay_before_retry 3 # 重试间隔
connect_port 80 # 检查时连接的端口
}
}
}
-
配置注意
router_id后面跟的自定义的ID在同一个网络下是一致的 state后跟的MASTER和BACKUP必须是大写;否则会造成配置无法生效的问题 interface 网卡ID;要根据自己的实际情况来看,可以使用以下方式查询 ip a 查询 在BACKUP节点上,其keepalived.conf与Master上基本一致,修改state为BACKUP,priority值改小即可 authentication主备之间的认证方式,一般使用PASS即可;主备的配置必须一致,不能超过8位
Nginx高性能原理和课程总结
Nginx基础架构master-worker进程剖析
简介:Nginx基础架构模型剖析
- master 进程负责管理 Nginx 本身和其他 worker 进程
-
高性能原理
- nginx 通过 多进程 + io多路复用(epoll) 实现了高并发
- 采用多个worker 进程实现对 多cpu 的利用 通过eopll 对 多个文件描述符 事件回调机制
- 拓展:linux I/O多路复用有select,poll,epoll
I/O模式一般分为同步IO和异步IO。
同步IO会阻塞进程,异步IO不会阻塞进程。
目前linux上大部分用的是同步IO,异步IO在linux上还不太成熟(有部分)
同步IO又分为阻塞IO,非阻塞IO,IO多路复用, 很多人对这个就有疑问了????
同步IO会阻塞进程,为什么也包括非阻塞IO? 因为非阻塞IO虽然在请求数据时不阻塞,但真正数据来临时,也就是内核数据拷贝到用户数据时,此时进程是阻塞的。
推荐书籍《Unix网络编程》