1 Nginx介绍
Nginx是一个高性能的HTTP和反向代理服务器。支持高达50000个并发连接数的响应。
官网:https://nginx.org/
1.1 正向代理和反向代理
正向代理:比如要访问google,不能直接访问,只能先找翻墙软件,通过翻墙软件才能访问google,这叫正向代理。
反向代理:指的是用户要访问google,但是google悄悄地把这个请求交给后台N台服务器中的其中一台来做,这叫反向代理。
1.2 负载均衡方案
- 使用硬件负载均衡策略,如使用F5、Array等负载均衡器(一台服务器上百万,但是并发能力也很强,支持每秒上百万的请求)
- 使用软件负载均衡
- 使用阿里云服务器均衡SLB
- 使用Nginx+keepalived
- 其他软件负载均衡,如LVS(Linux Virtual Server)、haproxy等技术
1.3 下载和安装
#解压tar-zxvf nginx.tar#安装依赖yuminstall-y pcre pcre-devel yum -yinstallopenssl openssl-devel#配置cdnginx ./configure#安装make&&makeinstall1.4 常用命令
#启动nginxnginx -c nginx.conf#停止nginxnginx -s quit#重新载入nginx,当配置信息发生修改时nginx -s reload#查看版本nginx -v启动nginx,浏览器访问到如下页面,启动成功
1.5 模块介绍
1.5.1 主模块
daemon
语法:daemon on | off
默认值:on
是否以守护进程方式运行nginx
master_process
语法:master_process on | off
默认值:on
是否以master/worker方式进行工作,在实际环境中,nginx是以一个master进程管理多个worker进程的方式运行的,关闭后nginx就不会fork出work子进程来处理请求,而是用master进程自身来处理请求。worker_processes默认是1,在master/worker运行方式下worker进程的数目,一般情况下用户要配置于CPU核心数相等的worker进程。
pid
存储进程号,指定pid文件可以使用kill 命令来终止进程
user
使用哪个用户启动nginx
#user nobody;worker_processes
nginx子进程数量,默认是1
worker_processes 1;event
表示同时可以接收1024个连接
events { worker_connections 1024; }
1.5.2 处理HTTP的核心模块功能
listen
nginx监听的端口号,默认80
server_name
nginx监听的域名,多个域名使用空格分隔
server
虚拟主机配置
# 虚拟主机配置 server { # 该虚拟主机监听的端口 listen 80; # 虚拟主机监听的域名或IP server_name caro2o.wolfcode.cn; # 当请求到当前虚拟主机后,映射到什么访问路径,斜杠表示映射根路径请求到哪里 location / { # 表示访问当前路径时,返回哪个目录中的内容 # 此时的html前面不带/,表示一个相对路径,相对路径是相对于nginx的安装目录 root html; # 当请求路径后面不携带任意文件时,默认访问的文件名 # 基于当前配置,此文件的完整路径是:/nginx安装目录/html/index.html index index.html; } }
1.5.3 负载均衡模块
upstream backend { server www.test1.com weight=5 server www.test2.com weight=5 } server { location / { proxy_pass http://backend; } }负载均衡策略
ip_hash
基于客户端连接的IP地址来分发请求。这个功能将保证这个客户端请求总是被转发到同一台服务器上面
好处是,不需要做多台机器间的session共享了。坏处是,每一次都请求到同一台机器上面,就没有负载均衡效果了
2 常见配置
2.1 虚拟主机配置
一个nginx下面可以配置多个虚拟主机,如上图,设置了虚拟主机1和虚拟主机2。两个虚拟主机的域名相同,端口不同。这样启动nginx后就会占用两个端口:80和8080
类似地,我们可以为虚拟主机1和2设置不同的域名。当访问域名shop.wolfcode.cn就访问虚拟主机1,访问域名api.wolfcode.cn就访问虚拟主机2。
有了虚拟主机,就可以在一个nginx下面部署多个应用,实现应用的反向代理和负载均衡。
如上图,设置了虚拟主机1和2,并为两个虚拟主机设置了路径映射。
当访问http://shop.wolfcode.cn/,会由nginx请求到虚拟主机1,然后根据路径映射,最终转发到/usr/local/nginx/html/index.html这个地址,其中/usr/local/nginx是nginx的安装目录。
当访问http://api.wolfcode.cn:8080/,会由nginx请求到虚拟主机2,然后根据路径映射,最终转发到/www/wolfcode/api/index.html这个地址。
下面尝试通过nginx的配置文件实现上面的映射关系。
1、首先创建统一的项目路径/www/wolfcode
mkdir /www cd /www mkdir wolfcode2、在/www/wolfcode目录下面创建两个文件夹
在两个文件夹下面创建index.html,内容分别如下:
<h1>CARO2O project 1</h1><h1>WOLF2W project 2</h1>3、接着修改nginx的配置文件nginx.conf
http { # 虚拟主机1配置 server { # 该虚拟主机监听的端口 listen 80; # 虚拟主机监听的域名或IP server_name caro2o.wolfcode.cn; # 当请求到当前虚拟主机后,映射到什么访问路径,斜杠表示映射根路径请求到哪里 location / { root /www/wolfcode/caro2o; index index.html; } } # 虚拟主机2配置 server { # 该虚拟主机监听的端口 listen 80; # 虚拟主机监听的域名或IP server_name wolf2w.wolfcode.cn; # 当请求到当前虚拟主机后,映射到什么访问路径,斜杠表示映射根路径请求到哪里 location / { root /www/wolfcode/wolf2w; index index.html; } } }4、重启nginx,访问ip地址。可以看到输出是CARO2O project 1,是因为CARO2O配置靠前
5、要访问wolf2w,由于两个服务的ip和端口都相同,要区分两个服务,只能通过域名来区分了。但是,直接访问域名是访问不通的,因为这个域名是不存在的。需要我们修改C:\Windows\System32\drivers\etc\hosts文件,添加如下内容
192.168.52.130 caro2o.wolfcode.cn 192.168.52.130 wolf2w.wolfcode.cn6、hosts添加之后通过域名访问
2.2 location语法规则
2.3 反向代理配置
现有有一个tomcat服务器,里面有一个页面hello.jsp。我们现在不想让用户直接访问tomcat,而是让用户先访问nginx,由nginx反向代理到tomcat。
1、单独访问nginx,可以访问
2、单独访问tomcat,可以访问
3、接着配置nginx反向代理
server { listen 80; server_name caro2o.wolfcode.cn; #反向代理 location ^~ /tomcat/ { proxy_pass http://localhost:8081/; } }重启nginx
nginx -s reload4、地址栏访问,发现通过nginx的80端口访问到了tomcat
2.4 负载均衡配置
upstream backend { server www.test1.com weight=5 server www.test2.com weight=5 } server { location / { proxy_pass http://backend; } }3 搭建高可用环境
Nginx本质上也是一个服务器,它也存在着宕机风险,而且当Nginx代理服务器宕机后可能整个系统都会崩溃。所以通常会准备一个备用的Nginx代理服务器,当主服务器宕机后用户仍然可以通过备用的Nginx服务器去分发用户的请求到相应的服务器,这就是Nginx的高可用(HA)。
现在用户通过nginx,进而访问tomcat。如果nginx挂了,就访问不到tomcat。就需要为nginx搭建高可用环境。
如上图,一个主nginx,一个备nginx。正常情况下都是访问主nginx,进而访问tomcat。如果主nginx挂了,切换为备nginx提供服务。但是nginx是不具备自动切换功能的
要实现自动切换功能,需要借助两个组件VIP虚拟IP和keepalived。此时,域名是绑定到nginx虚拟IP上面的。虚拟IP是在主nginx上面,从nginx的虚拟IP是空的。主备nginx都有keepalived,用来检查nginx是否存活。
当主nginx挂了,就会切换到备nginx。发生IP漂移,VIP跑到了备nginx,备nginx对外提供服务。
这种机制可以保证nginx的高可用。但是,这种模式属于主备模式,正常情况下请求永远会打到主节点,备节点是没有请求的。它和主从是不同的,主从的从节点是可以分摊主节点压力的。设想,如果主节点请求压力过大导致主节点挂了,此时自动切换到备节点,备节点还是会挂掉。
3.1 keepalived简介
keepalived是一个类似于layer3, 4 & 5交换机制的软件,也就是我们平时说的第3层、第4层和第5层交换。Keepalived是自动完成,不需人工干涉。Keepalived的作用是检测服务器的状态,如果有一台web服务器宕机,或工作出现故障,Keepalived将检测到,并将有故障的服务器从系统中剔除,同时使用其他服务器代替该服务器的工作,当服务器工作正常后Keepalived自动将服务器加入到服务器群中,这些工作全部自动完成,不需要人工干涉,需要人工做的只是修复故障的服务器;keepalived是基于VRRP(虚拟路由冗余协议)协议的。
Keepalived双机主备原理:在原来的处理流程中用户的请求是直接发送到Nginx服务器的,在加入Keepalived服务以后,用户的请求不会直接发送到Nginx服务器,而是先申请一个虚拟IP,由于虚拟IP是和Nginx服务器绑定到一起,所以可以通过该虚拟IP直接访问到Nginx服务器的资源,当主Nginx服务器宕机后,用户的虚拟Ip就会和备用的Nginx服务器绑定到一起。
3.2 keepalived安装
1、安装依赖
yum install gcc openssl-devel libnl3-devel popt-devel iptables-devel libnfnetlink-devel net-snmp-devel psmisc -y2、解压
tar -zxvf keepalived.tar -C /usr/keepalived3、配置
cd keepalived ./configure make && make install4、编写nginx是否存活检测脚本
vi /etc/keepalived/nginx_check.sh加入如下内容
#!/bin/bash A=`ps -C nginx -no-header | wc -l` if [$A -eq 0 ];then /usr/local/nginx/sbin/nginx sleep 2 if[ `ps -C nginx -no-header | wc -l` -eq 0 ];then killall keepalived fi fi赋予执行权限
chmod +x /etc/keepalived/nginx_check.sh3.3 环境准备
准备两台机器http://192.168.52.130/和http://192.168.52.128/,在两台机器上面都安装好tomcat、nginx和keepalived。通过nginx可以成功访问到tomcat
3.4 主备配置
| 主机 | 192.168.52.130 |
|---|---|
| 备机 | 192.168.52.128 |
1、配置主机
vi /etc/keepalived/keepalived.conf加入如下内容:
! Configuration File for keepalived global_defs { router_id wolfcode ##路由器标志 } # 集群资源监控,组合track_script进行 vrrp_script check_haproxy { script "/etc/keepalived/nginx_check.sh" #检测nginx状态的脚本路径 interval 2 #检测时间间隔 weight -20 #条件成立,权重减去20 } vrrp_instance PROXY { #设置当前主机为主节点,如果是备用节点,则设置为BACKUP state MASTER # 指定监测网络接口,可以用ifconfig查看 interface ens33 #虚拟路由表示,同一个VRRP实例要是有同一个标识 virtual_router_id 80 # 机器ip unicast_src_ip 192.168.52.130 #设置优先级,确保主节点的优先级高过备用节点 priority 100 #用于设定主备节点间同步检查时间间隔 advert_int 2 #设置主备节点间的通信验证类型及密码,同一个VRRP实例需要一致 authentication { auth_type PASS auth_pass wolfcode } #集群资源监控,组合vrrp_script进行 track_script { check_haproxy } #设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中。当状态切换到BACKUP时,此IP会自动从系统中删除。可以通过ip add查看切换后的状态 virtual_ipaddress { 192.168.52.100 #虚拟IP设置完成之后就使用它来访问 } }2、配置备机
vi /etc/keepalived/keepalived.conf加入如下内容:
! Configuration File for keepalived global_defs { router_id wolfcode ##路由器标志 } # 集群资源监控,组合track_script进行 vrrp_script check_haproxy { script "/etc/keepalived/nginx_check.sh" #检测nginx状态的脚本路径 interval 2 #检测时间间隔 weight -20 #条件成立,权重减去20 } vrrp_instance PROXY { #设置当前主机为主节点,如果是备用节点,则设置为BACKUP state BACKUP # 指定监测网络接口,可以用ifconfig查看 interface ens33 #虚拟路由表示,同一个VRRP实例要是有同一个标识 virtual_router_id 80 # 机器ip unicast_src_ip 192.168.52.128 #设置优先级,确保主节点的优先级高过备用节点 priority 90 #用于设定主备节点间同步检查时间间隔 advert_int 2 #设置主备节点间的通信验证类型及密码,同一个VRRP实例需要一致 authentication { auth_type PASS auth_pass wolfcode } #集群资源监控,组合vrrp_script进行 track_script { check_haproxy } #设置虚拟IP地址,当keepalived状态切换为MASTER时,此IP会自动添加到系统中。当状态切换到BACKUP时,此IP会自动从系统中删除。可以通过ip add查看切换后的状态 virtual_ipaddress { 192.168.52.100 #虚拟IP设置完成之后就使用它来访问 } }3.5 高可用测试
同时启动130和128机器上面的tomcat、nginx和keepalived
1、通过ip addr命令查看主备节点信息
主节点。可以看到我们的VIP已经加上了
备节点。是没有VIP信息的
2、通过VIP访问。此时访问的是主节点130
3、将主节点130关机,在128机器上面执行ip addr,可以看到VIP加上了
此时,通过VIP仍然可以访问
4、将主节点130开机,启动tomcat、nginx、keepalived,再次在主备机器上面执行ip addr命令
主节点。可以看到VIP又回到主节点上面了
备节点。可以看到备节点的VIP没了