news 2026/2/26 17:50:24

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/2/24 0:51:39

30分钟极速改造:让小爱音箱拥有高级AI智能的完整指南

30分钟极速改造&#xff1a;让小爱音箱拥有高级AI智能的完整指南 【免费下载链接】mi-gpt &#x1f3e0; 将小爱音箱接入 ChatGPT 和豆包&#xff0c;改造成你的专属语音助手。 项目地址: https://gitcode.com/GitHub_Trending/mi/mi-gpt 还在为小爱音箱的机械式回答感到…

作者头像 李华
网站建设 2026/2/21 6:58:15

人工智能之数字生命--工程实践:获取高精度轮廓等信息

先把“双目差异”变成“深度/视差”&#xff0c;再用深度做分割&#xff0c;这样“存在”就变得非常清晰。 推荐流程&#xff1a;双目 → 视差/深度 → 存在掩膜 → 轮廓标定 极线校正&#xff08;Rectify&#xff09; 没有这一步&#xff0c;后面的视差会非常飘&#xff0c;轮…

作者头像 李华
网站建设 2026/2/26 10:49:43

Zotero插件市场:让文献管理插上智能翅膀

Zotero插件市场&#xff1a;让文献管理插上智能翅膀 【免费下载链接】zotero-addons Zotero add-on to list and install add-ons in Zotero 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-addons 你是否曾经为了安装一个Zotero插件&#xff0c;在浏览器和软件之…

作者头像 李华
网站建设 2026/2/23 12:38:40

3分钟精通B站视频下载:downkyi完全配置手册

3分钟精通B站视频下载&#xff1a;downkyi完全配置手册 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;。 …

作者头像 李华
网站建设 2026/2/27 9:17:12

Bypass Paywalls Clean:解锁付费内容的终极解决方案

在信息获取成本日益高涨的今天&#xff0c;你是否也曾被各大媒体的付费墙挡在门外&#xff1f;知名财经媒体、国际权威期刊、主流新闻机构等顶级媒体的深度内容触手可及&#xff0c;却因订阅费用而望而却步。现在&#xff0c;一款名为Bypass Paywalls Clean的浏览器扩展将彻底改…

作者头像 李华
网站建设 2026/2/20 23:37:05

Linux/Windows下Anaconda与深度学习框架安装指南

Linux/Windows 下 Anaconda 与 PaddlePaddle 深度学习环境搭建实战 在当前 AI 开发日益普及的背景下&#xff0c;一个稳定、高效且易于管理的本地开发环境是每位开发者的基本需求。尤其对于中文 NLP、OCR 和工业级视觉任务而言&#xff0c;PaddlePaddle 凭借其强大的国产生态支…

作者头像 李华