心情追忆- Nginx + OpenResty 构建高可用网关

之前,我独自一人开发了一个名为“心情追忆”的小程序,旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端(小程序)开发、后端搭建到最终部署。经过一个月的努力,通过群聊分享等方式,用户量也有了将近200人。虽然取得了初步的成绩,但我希望小程序能够持续发展。
小程序的后台主要部署在家里的高性能电脑上(i9处理器,10核20线程,4090显卡,32G内存)。为了降低成本,我没有选择昂贵的云服务,而是利用家里的电脑作为服务器。然而,昨天家里突然停电,导致服务中断,而我当时正在上班,无法及时处理这一情况。

为了解决这个问题,我希望构建一个高可用性的架构,确保即使某一处出现故障,用户仍然可以正常访问服务。为此,我想到了了之前双十一买的一台低配云服务器(2G内存,2核4线程CPU), 毕竟云服务停电的概率比家里很多很多。

研究与决策
1. 硬件评估与需求分析

首先,我对现有硬件资源进行了评估:

  • 线上服务器:配置较低(2GB内存,2核4线程CPU),适合用作轻量级入口网关,不适合运行 MySQL 和 Redis。
  • 家用电脑:配置非常高(i9处理器,10核20线程,4090显卡,32G内存),非常适合运行 Java 应用、MySQL 数据库和 Redis 缓存服务。
  • 办公电脑:配置非常高(MacBook MAX 64G内存版),非常适合运行 Java 应用、MySQL 数据库和 Redis 缓存服务。

由于家中电脑可能会因停电而不可用,我需要确保分布式架构能够在其中一台宕机时继续提供服务。

2. 分布式架构设计

基于硬件评估,我决定将关键服务分布在家用电脑和办公电脑上,并使用线上服务器作为入口网关。具体来说:

  • Java应用、MySQL数据库和Redis缓存:分别部署在家用电脑和办公电脑上,确保两套环境互为备份。
  • 入口网关:使用线上服务器,负责流量分发和服务健康检查。
3. 方案调研

在确定了分布式架构后,我开始调研具体的实现方案:

  • Gateway + Nacos:这是一个常见的微服务解决方案,Nacos 可以用于服务发现和配置管理,结合 Spring Cloud Gateway 实现动态路由和服务治理。然而,经过调研预估,我发现由于线上服务器的内存只有2GB,运行 Nacos 可能会显得吃力,不太适合当前的硬件条件。

  • Keepalived:主要用于高可用性集群中的VIP漂移功能,虽然它可以实现主备切换,但并不直接提供健康检查和负载均衡的功能。

  • Nginx + OpenResty:OpenResty 是一个增强版的 Nginx,集成了 Lua 脚本语言,支持更复杂的功能开发,如通过心跳包检测来监控服务器健康状态并进行负载均衡。相比其他方案,Nginx + OpenResty 更加轻量且高效,特别适合我的硬件条件。

最终,我决定采用 Nginx + OpenResty 来搭建一个高可用性的网关,确保即使家中停电,服务也能通过线上服务器继续提供给用户。

Nginx + OpenResty 的安装与配置

以下是详细的安装和配置步骤:

1. 安装 Nginx
1.1 更新系统包并添加 Nginx 源
# 更新系统包列表
sudo apt-get update# 添加 Nginx 官方源(适用于 Debian/Ubuntu)
sudo apt-get install -y software-properties-common
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update
1.2 安装 Nginx
# 安装 Nginx
sudo apt-get install -y nginx
2. 安装 OpenResty
2.1 更新系统包并安装依赖项
# 更新系统包列表并安装必要的编译工具和库文件
sudo apt-get update && sudo apt-get install -y build-essential libpcre3 libpcre3-dev zlib1g zlib1g-dev libssl-dev wget curl git
2.2 下载并解压 OpenResty 源码
# 下载 OpenResty 源码压缩包
wget https://openresty.org/download/openresty-1.21.4.1.tar.gz
# 解压下载的压缩包
tar -zxvf openresty-1.21.4.1.tar.gz
# 进入解压后的目录
cd openresty-1.21.4.1/
2.3 编译安装 OpenResty
# 配置编译选项,启用 HTTP SSL 模块和支持 LuaJIT
./configure --with-http_ssl_module --with-luajit
# 编译源码
make
# 安装编译好的程序到系统中
sudo make install
3. 配置 Nginx + OpenResty

编辑 /usr/local/openresty/nginx/conf/nginx.conf 文件,添加如下内容以实现健康检查和负载均衡,并为每一行添加注释以便理解:

http {# 定义上游服务器组 backend_serversupstream backend_servers {# 使用最少连接算法分配请求least_conn;# 添加第一台后端服务器(办公电脑),设置最大失败次数和超时时间server 192.168.1.100:8080 max_fails=3 fail_timeout=30s; # 办公电脑 IP 地址# 添加第二台后端服务器(家用电脑),设置最大失败次数和超时时间server 192.168.1.101:8080 max_fails=3 fail_timeout=30s; # 家用电脑 IP 地址# 启用健康检查模块,设置检查间隔、成功/失败阈值和超时时间check interval=3000 rise=2 fall=5 timeout=1000 type=http;# 发送 HTTP 请求进行健康检查,发送 HEAD 请求至 /health 接口check_http_send "HEAD /health HTTP/1.0\r\n\r\n";# 设置预期的健康响应状态码为 2xx 或 3xxcheck_http_expect_alive http_2xx http_3xx;}# 定义服务器块,监听 80 端口server {listen 80;# 处理所有根路径请求location / {# 将请求代理到上游服务器组 backend_serversproxy_pass http://backend_servers;# 设置转发头信息,确保后端服务器能获取正确的客户端信息proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}}
}

重启 Nginx 使配置生效:

# 重新加载 Nginx 配置文件,应用新的配置
sudo /usr/local/openresty/nginx/sbin/nginx -s reload
4. 测试与验证

确保每台后端服务器都暴露了 /health 接口,以便 Nginx 进行健康检查。你可以通过以下命令测试 Nginx 是否正确分发流量:

# 测试 Nginx 是否正确代理请求
curl http://localhost

此外,可以通过模拟一台服务器宕机来验证 Nginx 的自动切换机制是否正常工作。

总结

通过上述配置,我成功地构建了一个基于 Nginx + OpenResty 的高可用性网关,确保即使家中停电,服务也能通过线上服务器继续提供给用户。这套方案不仅提高了系统的可靠性,还帮助我在成本有限的情况下实现了业务连续性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/492128.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

灵活接入第三方接口,解析第三方json数据,返回我们想要的json格式

需求&#xff1a;我想接入任意第三方http 接口&#xff08;暂不考虑鉴权问题&#xff09;、接口返回任意json数据。 1、要求返回的json数据通过我的R< T > 返回。 2、我的R< T > 里面包含参数 data&#xff0c;code&#xff0c;msg&#xff0c;success标识。 3、…

Nginx 在不同操作系统下的安装指南

Nginx 在不同操作系统下的安装指南 一、Linux 系统下 Nginx 的安装 &#xff08;一&#xff09;基于 Ubuntu 系统 更新软件包列表 打开终端&#xff0c;首先执行sudo apt-get update命令。这一步是为了确保系统的软件包列表是最新的&#xff0c;能够获取到最新版本的 Nginx 及…

docker redis 详细教程

1. 拉取镜像 docker pull redis 2. 创建数据存储目录 cd /home/ mkdir redis cd redis mkdir data mkdir log mkdir conf 3.创建容器并且运行 docker run \ -p 6379:6379 \ --name redis \ -v /home/redis/data:/data \ -d redis 参考链接 史上最详细Docker安装Redis &am…

学技术学英文:代码中的锁:悲观锁和乐观锁

本文导读&#xff1a; 1. 举例说明加锁的场景&#xff1a; 多线程并发情况下有资源竞争的时候&#xff0c;如果不加锁&#xff0c;会出现数据错误&#xff0c;举例说明&#xff1a; 业务需求&#xff1a;账户余额>取款金额&#xff0c;才能取钱。 时间线 两人共有账户 …

云计算赋能:TSP 问题求解与创新定价机制的全景剖析

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f916;编程探索专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年12月18日14点02分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文源地址&#xff1a; Aspiringco…

二、windows环境下vscode使用wsl教程

本篇文件介绍了在windows系统使用vscode如何连接使用wsl&#xff0c;方便wsl在vscode进行开发。 1、插件安装 双击桌面vscode&#xff0c;按快捷键CtrlShiftX打开插件市场&#xff0c;搜索【WSL】点击安装即可。 2、开启WSL的linux子系统 点击左下方图标【Open a Remote Win…

QScreen在Qt5.15与Qt6.8版本下的区别

简述 QScreen主要用于提供与屏幕相关的信息。它可以获取有关显示设备的分辨率、尺寸、DPI&#xff08;每英寸点数&#xff09;等信息。本文主要是介绍Qt5.15与Qt6环境下&#xff0c;QScreen的差异&#xff0c;以及如何判断高DPI设备。 属性说明 logicalDotsPerInch&#xff1…

【已解决】在Visual Studio里将应用与Microsoft Store关联时提示网络异常

发布Windows应用时。在Visual Studio里点击"发布“&#xff0c;将应用与Microsoft Store关联时&#xff0c;一直提示网络错误。 查了一下论坛&#xff0c;发现之前也经常出现&#xff0c;但我是第一次遇到。 不能就这样一直被卡着呀&#xff0c;研究了一下&#xff0c;还…

【从零开始入门unity游戏开发之——C#篇10】循环结构——while、do-while、for、foreach的使用

文章目录 一、while 循环1、语法&#xff1a;2、示例&#xff1a; 二、 do-while 循环1、语法&#xff1a;2、示例&#xff1a; 三、for 循环1、语法&#xff1a;2、示例&#xff1a; 四、foreach 循环1、语法&#xff1a;2、示例&#xff1a; 五、总结对比六、注意事项七、使用…

【数据分析】数据结构数据内容概述

文章目录 表格结构数据特征数据类别结构化数据表格结构数据层级表格结构的数据类型单元格的格式属性 表格结构数据获取方法从企业后台数据库系统获取后台数据库系统获取数据流程前端操作平台获取从企业外部渠道获取数据 表格结构数据使用方法单元格值的引用方法单元格区域值的引…

控制策略和算法:两者的类型、应用领域

目录 控制策略类型&#xff1a; 控制算法类型&#xff1a; 应用领域&#xff1a; 其他学术知识 控制策略类型&#xff1a; 开环控制&#xff1a; 在没有反馈的情况下&#xff0c;控制信号是根据对系统模型的预测或设定目标生成的。适用于系统动态特性已知且外部干扰较小的情…

Nacos 3.0 考虑升级到 Spring Boot 3 + JDK 17 了!

Nacos 由阿里开源&#xff0c;是 Spring Cloud Alibaba 中的一个重要组件&#xff0c;主要用于发现、配置和管理微服务。 由于 Spring Boot 2 的维护已于近期停止&#xff0c;Nacos 团队考虑升级到 Spring Boot 3 JDK 17&#xff0c;目前正在征求意见和建议。 这其实是一件好…

【笔记】RT-Thread Studio+STM32CubeMX联合开发,使用SPI+DMA驱动WS2812B RGB灯条,实现单独操控任意灯珠。

硬件平台&#xff1a;STM32L431RCT6 软件版本&#xff1a;RT-Thread Studio 2.2.8&#xff0c;STM32CubeMX 6.12.0 RT-Thread版本&#xff1a;4.1.0 言&#xff1a;之前写过一篇WS2812B的教程&#xff0c;但是最近扒出来用发现不能单独点亮或者熄灭特定位置的灯珠&#xff0c;只…

Vue 中实现节点对齐

Vue 如何将两个 Dom 节点进行对对齐&#xff0c;在前端页面中如何快速的对两个节点元素进行对齐操作&#xff0c;最简单的方式就是使用 Postion&#xff1a;Relative 加 Absolute 实现两个元素的相对位置。今天使用 dom-align 库实现节点对齐&#xff0c;实现以下效果&#xff…

计算机网络-HTTP协议

HTTP HTTP是一种不保存状态&#xff0c;即无状态的协议。HTTP协议自身不对请求和响应之间的通信进行保存。为了保存状态因此后面也有一些技术产生比如Cookies技术。 HTTP是通过URI定位网上的资源&#xff0c;理论上将URI可以访问互联网上的任意资源。 如果不是访问特定的资源…

端到端自动驾驶大模型:视觉-语言-动作模型 VLA

模型框架定义、模型快速迭代能力是考查智驾团队出活能力的两个核心指标。在展开讨论Vision-Language-Action Models(VLA)之前&#xff0c;咱们先来讨论端到端自动驾驶大模型设计。 目录 1. 端到端自动驾驶大模型设计 1.1 模型输入设计 1.2 模型输出设计 1.3 实现难点分析 …

NLP 分词技术浅析

一、NLP 分词技术概述 &#xff08;一&#xff09;定义 自然语言处理&#xff08;NLP&#xff09;中的分词技术是将连续的文本序列按照一定的规则切分成有意义的词语的过程。例如&#xff0c;将句子 “我爱自然语言处理” 切分为 “我”、“爱”、“自然语言处理” 或者 “我…

深度学习面试相关-2024.12.15记录

深度学习 面试相关- 2024.12.15记录 目录 深度学习 面试相关- 2024.12.15记录整体常问问题1数学基础1.1 概率统计1.2 线代 2机器学习算法2.1 深度学习算法2.2 机器学习算法 整体常问问题 https://www.nowcoder.com/discuss/353154899112304640 1数学基础 1.1 概率统计 htt…

SEO初学者-搜索引擎如何工作

搜索引擎基础搜索引擎是如何建立索引的搜索引擎如何对网页进行排名搜索引擎是如何个性化搜索结果的 搜索引擎的工作方式是使用网络爬虫抓取数十亿个页面。爬虫也称为蜘蛛或机器人&#xff0c;它们在网络上导航并跟踪链接以查找新页面。然后&#xff0c;这些页面会被添加到搜索引…

构建centos docker基础镜像

1、介绍 比较老的版本docker镜像&#xff0c;不太好找&#xff0c;可以尝试自己构建 各版本构建基础镜像方法不太一样&#xff0c;方式也不同&#xff0c;自己尝试&#xff0c;本文只介绍了我自己的尝试 2、构建centos5.11 docker镜像 准备iso文件 &#xff08;1&#xff09;安…