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

发布于:2024-12-19 ⋅ 阅读:(11) ⋅ 点赞:(0)

之前,我独自一人开发了一个名为“心情追忆”的小程序,旨在帮助用户记录日常的心情变化及重要时刻。我从项目的构思、设计、前端(小程序)开发、后端搭建到最终部署。经过一个月的努力,通过群聊分享等方式,用户量也有了将近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_servers
    upstream 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 或 3xx
        check_http_expect_alive http_2xx http_3xx;
    }

    # 定义服务器块,监听 80 端口
    server {
        listen 80;

        # 处理所有根路径请求
        location / {
            # 将请求代理到上游服务器组 backend_servers
            proxy_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 的高可用性网关,确保即使家中停电,服务也能通过线上服务器继续提供给用户。这套方案不仅提高了系统的可靠性,还帮助我在成本有限的情况下实现了业务连续性。