news 2026/5/1 10:08:43

Nginx+keepalived

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Nginx+keepalived

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&&makeinstall

1.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 wolfcode

2、在/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.cn

6、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 reload

4、地址栏访问,发现通过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 -y

2、解压

tar -zxvf keepalived.tar -C /usr/keepalived

3、配置

cd keepalived ./configure make && make install

4、编写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.sh

3.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没了

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:10:16

LVS:Linux Virtual Server

LVS&#xff1a;Linux Virtual Server 一、负载均衡 1.1 实现方式 硬件&#xff1a; F5 软件&#xff1a;LVS&#xff1a;Linux Virtual Server&#xff0c;阿里云四层SLB(Server Load Balance)nginx&#xff1a;支持七层调度&#xff0c;阿里云七层SLB使用Tengine&#xff08;…

作者头像 李华
网站建设 2026/4/30 2:16:23

JSAPIThree 加载 3D Tiles 学习笔记:大规模三维场景渲染

在实际项目中&#xff0c;我们经常需要加载大规模的三维场景数据&#xff0c;比如城市建筑模型、地形数据等。3D Tiles 是 Cesium 提出的开放标准&#xff0c;用于高效地流式传输和渲染大量 3D 内容。今天就来学习一下如何在 mapvthree 中使用 3D Tiles。了解 3D Tiles 3D Tile…

作者头像 李华
网站建设 2026/5/1 9:55:17

LobeChat能否实现思维发散引导?头脑风暴AI教练

LobeChat能否实现思维发散引导&#xff1f;头脑风暴AI教练 在创意枯竭的深夜&#xff0c;面对空白文档反复删改标题的产品经理&#xff1b;在课堂上试图激发学生想象力却陷入“标准答案”惯性的教师&#xff1b;在心理咨询室中努力帮助来访者打开表达通道的心理工作者——他们共…

作者头像 李华
网站建设 2026/4/30 12:17:38

人工智能之数字生命---绘画能力的生成3

下面这份清单按约束来:世界树中“存在”只有一层;更细的“子存在/局部世界”放到附属世界树里;因此这里只列需要“复合规则”才能生成/比较/还原的特征类型(= 不是单一标量就能表达/比较的那种)。 说明:像 位置X/Y/Z、尺寸_左右/上下/前后 这类原子标量特征不在此列。 1)…

作者头像 李华
网站建设 2026/5/1 8:51:03

现在数字生命已经能“看清物体的内部结构”了!

设计目标 输入&#xff1a;一个主存在的高分辨率裁剪图像 精确掩膜&#xff08;来自点簇增强结果&#xff09;输出&#xff1a;多个子存在观测&#xff08;如杯子的把手、瓶盖、人的手臂等&#xff09;递归&#xff1a;每个子存在可继续提取更细孙存在&#xff08;支持任意深度…

作者头像 李华
网站建设 2026/5/1 7:34:05

为什么网盘不能彻底取代硬盘呢?

存储备份和只读、文档编辑等场景&#xff0c;网盘和NAS可以代替硬盘功能&#xff0c;但网盘需要依赖网络&#xff0c;比如安装操作系统、剪辑高清电影、游戏场景等对数据传输有要求的场景更适合硬盘。网盘和本地硬盘的核心差异在于数据控制权、访问稳定性和传输效率&#xff0c…

作者头像 李华