- Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器 [13] ,同时也提供了IMAP/POP3/SMTP服务
- 其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
反向代理
- 正向代理
- 反向代理
实例1:浏览器输入www.123.com跳转到我们的tomcat服务器中
实现步骤:
- 在window访问页面,修改hosts文件,在文件中添加下面的内容
默认在 C:\Windows\System32\drivers\etc
IP地址 www.123.com - 现在我们就可以通过www.123.com:8080访问到服务器了,接下来我们用Nginx来进行请求转发
- 配置nginx,修改配置文件
反向代理2
1 实验效果
访问http://IP:9001/edu/ 直接跳转到127.0.0.1:8080
访问http://IP.1:9001/vod/ 直接跳转到127.0.0.1:8081
2 准备工作
①准备两台tomcat服务器,一个8080端口,一个8081端口
②创建文件夹和测试页面
3 具体配置
①找到nginx配置文件,进行反向代理
负载均衡
-
在网站创立初期,我们一般都使用单台机器对台提供集中式服务,但随着业务量越来越大,无论性能还是稳定性上都有了更大的挑战。这时候我们就会想到通过扩容的方式来提供更好的服务。我们一般会把多台机器组成一个集群对外提供服务。然而,我们的网站对外提供的访问入口都是一个的,比如www.taobao.com。那么当用户在浏览器输入www.taobao.com的时候如何将用户的请求分发到集群中不同的机器上呢,这就是负载均衡在做的事情。
-
当前大多数的互联网系统都使用了服务器集群技术,集群即将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是Web应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等。在实际应用中,在Web服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为Web服务器流量的入口,挑选最合适的一台Web服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不需要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的是后端的集群。
-
软件负载解决的两个核心问题是:选谁、转发,其中最著名的是LVS(Linux Virtual Server)
- 一个典型的互联网应用的拓扑结构是这样的:
- 负载均衡的测量
- 轮序(默认)按请求顺序逐一分配到后台服务器,如果后端服务器down掉,自动剔除。
- weight
3. ip_hash 每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解诀session的问题.
4. fair(第三方)按后端服务器的响应时间来分配请求,响应时间短的优先分配
动静分离
- Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
- 动静分离技术其实是采用代理的方式,在server{}段中加入带正则匹配的location来指定匹配项是静态的还是动态的:静态页面交给Nginx处理,动态页面交给PHP-FPM模块或Apache处理。在Nginx的配置中,是通过location配置段配合正则匹配实现静态与动态页面的不同处理方式
- 在root中创建data文件夹。在data中创建www,image文件夹。按照以下配置nginx,就可以访问到www,image文件夹下的静态文件了。
高可用
为了防止Ningx宕机,我们可以准备一台备用的Nginx服务器,这样就算主服务器宕机了,工作也是照常执行,这就是高可用性
1 准备工作
①需要两台服务器
②在两台服务器上安装nginx
③在两台服务器中安装keepalived
keepalived负责检查nginx服务器是否存活
- keepalived; 使用yum install keepalived -y安装。 在/etc/keepalived目录下查看keepalive.conf
在src目录下创建一个脚本文件nginx_check.sh
#!/bin/bash
A=`ps -C nginx -no-header |wc -1`
if [ $A -eq 0 ];then
/usr/local/nginx/sbin/nginx
sleep 2
if [ `ps -C nginx --no-header |wc -1` -eq 0 ];then
killall keepalived
fi
fi
然后通过systemctl start keepalived启动keepalived 启动nginx
然后通过我们定义好的虚拟ip访问,结果显示是可以的,我们就配置好了
- keepalived.conf 配置详解
! Configuration File for keepalived
global_defs { #全局配置
router_id LVS_DEVEL #此处注意router_id为负载均衡标识,在局域网内应该是唯一的。主机的名字,通过他能找到主机。在/etc/host 中有 127.0.0.1 LVS_DEVEL命名,查看就好了。通过LVS_DEVEL就能找到主机。
script_user root
enable_script_security
}
vrrp_script chk_service_state {
script "/etc/keepalived/check_port.sh" #脚本条件成立做一下操作。
#script "killall -0 nginx"
interval 2 #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
weight -20 # 脚本中条件成立,此机器的权重就是-20
# rise 2 #表示需要连续成功2次才能认为是成功的
# fall 2 #表示需要连续失败2次才能认为是失败的
# timeout 2 #脚本检测超时时间,超过这个时间则认为检测失败
}
vrrp_script avoid_brain_split {
script "/usr/bin/ping -c 1 -w 1 10.20.50.254"
interval 2 #脚本检测的时间间隔,表示每n秒就检查一次,默认1秒就检测一次
weight -20
rise 2 #表示需要连续成功2次才能认为是成功的
fall 2 #表示需要连续失败2次才能认为是失败的
timeout 2 #脚本检测超时时间,超过这个时间则认为检测失败
}
vrrp_instance VI_1 { #vrrp 实例部分定义,VI_1自定义名称
state MASTER #指定 keepalived 的角色,必须大写 可选值:MASTER|BACKUP
interface eth0 #网卡设置,lvs需要绑定在网卡上,realserver绑定在回环口。区别:lvs对访问为外,realserver为内不易暴露本机信息 ifconfig 去查看。
virtual_router_id 51 #虚拟路由标识,是一个数字,同一个vrrp 实例使用唯一的标识,MASTER和BACKUP 的 同一个 vrrp_instance 下 这个标识必须保持一致
priority 100 #定义优先级,数字越大,优先级越高。
advert_int 1 #设定 MASTER 与 BACKUP 负载均衡之间同步检查的时间间隔,单位为秒,两个节点设置必须一样,检测服务器是否还活着。
authentication { #设置验证类型和密码,两个节点必须一致
auth_type PASS
auth_pass 1111
}
virtual_ipaddress { #设置虚拟IP地址,可以设置多个虚拟IP地址,每行一个
10.20.40.100/24
}
track_script { #脚本监控状态
chk_service_state #可加权重,但会覆盖声明的脚本权重值。chk_nginx_service weight -20
}
notify_master /etc/keepalived/slave2master.sh
notify_backup /etc/keepalived/master2slave.sh
}
nginx 工作原理
1 master&worker
有两个进程,一个是mester,一个是worker,mester主要负责分配和管理,worker做任务,worker会有多个,他们之间是互相竞争的关系,他们会争抢做任务
2 master-workers 的机制的好处
首先, 对于每个 worker 进程来说, 独立的进程, 不需要加锁, 所以省掉了锁带来的开销, 同时在编程以及问 题查找时, 也会方便很多。 其次, 采用独立的进程, 可以让互相之间不会影响, 一个进程退出后, 其它进程还在工作, 服务不会中断, master 进程则很快启动新的 worker 进程。 当然, worker 进程的异常退出, 肯定是程序有 bug 了, 异常退出, 会导致当前 worker 上的所有请求失败, 不过不会影响到所有请求, 所以降低了风险。 3 需要设置多少个 worker Nginx 同 redis 类似都采用了 io 多路复用机制, 每个 worker 都是一个独立的进程, 但每个进程里只有一个主线 程, 通过异步非阻塞的方式来处理请求, 即使是千上万个请求也不在话下。 每个 worker 的线程可以把一个 cpu 的性能发挥到极致。 所以 worker 数和服务器的 cpu 数相等是最为适宜的。 设少了会浪费 cpu, 设多了会造成 cpu 频繁切换上下文带 来的损耗。
4 连接数 worker_connection
这个值是表示每个 worker 进程所能建立连接的最大值, 所以, 一个 nginx 能建立的最大连接数, 应该是
worker_connections * worker_processes。 当然, 这里说的是最大连接数, 对于 HTTP 请求本地资源来说, 能够支持的
最大并发数量是 worker_connections * worker_processes, 如果是支持 http1.1 的浏览器每次访问要占两个连接, 所以
普通的静态访问最大并发数是: worker_connections * worker_processes /2, 而如果是 HTTP 作为反向代理来说, 最
大并发数量应该是 worker_connections * worker_processes/4。 因为作为反向代理服务器, 每个并发会建立与客户端
的连接和与后端服务的连接, 会占用两个连接
本文部分内容来自尚硅谷课程,感谢尚硅谷免费课程。