前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >『学习笔记』Nginx 作为 API 网关的配置与使用

『学习笔记』Nginx 作为 API 网关的配置与使用

原创
作者头像
数字扫地僧
发布2024-12-05 16:33:11
发布2024-12-05 16:33:11
4650
举报
文章被收录于专栏:活动

🎈今日推荐——https://cloud.tencent.com/developer/article/2473731

GraphQL 中的权限与认证:一分钟浅谈——这篇文章讨论了GraphQL中的权限与认证机制,包括认证(确定用户身份)和授权(确定用户权限)。文章解释了如何在GraphQL中实现JWT认证和基于角色的授权,以及常见的易错点和解决方案。通过代码示例,展示了认证和授权的具体实现,帮助开发者保护API免受未授权访问。


随着微服务架构的普及,API 网关在现代应用中的作用愈发重要。API 网关充当着系统前端与后端服务之间的中介,负责路由请求、负载均衡、安全控制、速率限制、身份验证、日志记录等功能。Nginx 作为一个高效的反向代理服务器,其强大的配置能力和高性能使得它成为实现 API 网关的理想选择。

API 网关概述

什么是 API 网关?

API 网关(API Gateway)是微服务架构中的一个重要组件,它作为前端客户端与后端服务之间的中介,主要负责以下几个功能:

序号

功能描述

说明

1

请求路由

根据请求的 URL 路径、HTTP 方法等信息将请求路由到对应的后端服务。

2

负载均衡

在多个后端服务之间分发请求,确保流量的均衡。

3

身份认证与授权

验证请求的身份,确保请求的合法性。

4

速率限制

控制每个客户端的请求频率,避免 DDoS 攻击。

5

请求与响应的转换

根据业务需求对请求和响应进行转换,例如 JSON 和 XML 格式的转换。

6

日志记录与监控

记录请求日志,并监控服务的健康状态。

Nginx 作为 API 网关的优势

Nginx 作为 API 网关的优势主要体现在以下几个方面:

序号

特性描述

说明

1

高性能

Nginx 是基于事件驱动的异步架构,能够处理大量并发请求,适合高流量场景。

2

易于配置与扩展

Nginx 的配置语法简洁且功能强大,能够灵活满足各种需求。

3

负载均衡与路由

Nginx 内建负载均衡算法和路由能力,能够高效地将请求分发到后端服务。

4

支持多种协议

除了 HTTP,Nginx 还支持 TCP、UDP 等多种协议,适用于多种应用场景。


Nginx 作为 API 网关的配置与使用

安装 Nginx

如果你的系统尚未安装 Nginx,可以使用以下命令进行安装:

  • 在 Ubuntu 上安装:
代码语言:bash
复制
sudo apt update
sudo apt install nginx
  • 在 CentOS 上安装:
代码语言:bash
复制
sudo yum install nginx

启动 Nginx

安装完成后,可以使用以下命令启动 Nginx:

代码语言:bash
复制
sudo systemctl start nginx
sudo systemctl enable nginx

基本 API 网关配置

以下是一个简单的 API 网关配置,Nginx 根据请求的路径将请求路由到不同的后端服务。假设我们有两个微服务,一个处理用户管理(/user 路径),另一个处理订单管理(/order 路径)。

配置文件结构

修改 Nginx 配置文件 /etc/nginx/nginx.conf/etc/nginx/sites-available/default,内容如下:

代码语言:nginx
复制
http {
upstream user_service {
    server 127.0.0.1:8081;
    server 127.0.0.1:8082;
}

upstream order_service {
    server 127.0.0.1:8083;
    server 127.0.0.1:8084;
}

server {
    listen 80;
    server_name api.example.com;

    location /user/ {
        proxy_pass http://user_service;  # 请求转发到用户管理服务
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    location /order/ {
        proxy_pass http://order_service;  # 请求转发到订单管理服务
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
}

在上述配置中:

  • /user/ 路径的请求将被转发到 user_service,该服务由两台服务器(80818082)提供支持。
  • /order/ 路径的请求将被转发到 order_service,该服务由两台服务器(80838084)提供支持。
  • proxy_set_header 用于设置传递给后端服务器的请求头信息,包括原始请求的 IP 地址等。

重新加载 Nginx 配置

配置完成后,使用以下命令重新加载 Nginx 配置,使其生效:

代码语言:bash
复制
sudo systemctl reload nginx

高级配置:负载均衡与健康检查

配置负载均衡

在上面的配置中,我们使用了 Nginx 的 upstream 指令进行负载均衡。Nginx 默认采用轮询(Round Robin)方式分发请求,但也支持其他负载均衡算法:

  • 最少连接:将请求转发到连接数最少的服务器。
代码语言:nginx
复制
upstream backend {
    least_conn;
    server 192.168.1.1:80;
    server 192.168.1.2:80;
    server 192.168.1.3:80;
}
  • IP 哈希:根据客户端 IP 地址将请求固定分配给某台服务器。
代码语言:nginx
复制
upstream backend {
    ip_hash;
    server 192.168.1.1:80;
    server 192.168.1.2:80;
    server 192.168.1.3:80;
}

配置健康检查

健康检查是确保 API 网关稳定运行的关键。在 Nginx 中,虽然没有内置的健康检查功能,但我们可以借助 Nginx Plus 实现更高级的健康检查。如果使用开源版本,可以通过设置 max_failsfail_timeout 来实现基本的健康检查。

代码语言:nginx
复制
upstream backend {
    server 192.168.1.1:80 max_fails=3 fail_timeout=30s;
    server 192.168.1.2:80 max_fails=3 fail_timeout=30s;
    server 192.168.1.3:80 max_fails=3 fail_timeout=30s;
}

在这个配置中,max_fails 表示允许的最大失败次数,fail_timeout 表示在多长时间内认为请求失败。Nginx 会在服务器失败次数超过 max_fails 的情况下,将该服务器标记为不可用。

API 网关的其他功能

除了请求路由和负载均衡,Nginx 作为 API 网关还可以提供以下功能:

身份认证与授权

通过 auth_basic 配置,Nginx 可以对 API 请求进行基本的 HTTP 身份验证:

代码语言:nginx
复制
location /api/ {
    auth_basic "Restricted Access";
    auth_basic_user_file /etc/nginx/.htpasswd;
    proxy_pass http://backend;
}

在该配置中,所有访问 /api/ 路径的请求都需要提供有效的用户名和密码。用户名和密码存储在 .htpasswd 文件中。

速率限制

使用 limit_reqlimit_conn 模块,Nginx 可以限制请求的频率,从而防止滥用和 DDoS 攻击。

代码语言:nginx
复制
http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        location /api/ {
            limit_req zone=one burst=5;
            proxy_pass http://backend;
        }
    }
}

该配置将限制每个客户端每秒最多发起 1 个请求,且突发请求数量最多为 5 个。

请求日志与监控

Nginx 还可以记录请求日志,为监控和分析提供数据支持。可以使用以下配置记录 API 请求日志:

代码语言:nginx
复制
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
                  '$status $body_bytes_sent "$http_referer" '
                  '"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;

案例分析

在现代互联网应用中,尤其是在在线支付、电子商务等高并发场景下,微服务架构成为了构建可扩展、灵活且高效系统的首选。在线支付系统需要处理大量的请求,并确保每个请求都能高效且安全地被处理。在这种情况下,API 网关作为系统的入口点,承担着请求路由、负载均衡、安全控制等多项职责,是保证系统高可用性和稳定性的关键组件。

在我们的案例中,假设我们有一个在线支付系统,其中包括多个微服务模块:

序号

服务类型

功能描述

1

支付服务

处理支付请求,如支付方式选择、支付验证、支付成功/失败通知等。

2

用户服务

管理用户信息,如用户注册、登录、账户信息更新等。

3

订单服务

处理订单相关操作,如创建订单、查询订单状态、取消订单等。

为了保证系统的高可用性和高性能,我们选择使用 Nginx 作为 API 网关,来处理客户端发起的请求。Nginx 将负责以下功能:

  • 将请求路由到不同的后端服务。
  • 进行负载均衡,确保请求能够平衡地分发到多个后端服务。
  • 实现健康检查,避免请求被路由到故障的后端服务。
  • 支持身份认证与授权,保护 API 接口的安全。
  • 对请求进行速率限制,防止恶意流量或 DDoS 攻击。

配置效果对比

在优化前,我们的系统面临许多问题,例如:

  • 请求响应时间高:由于后端服务负载不均和没有有效的请求分发机制,导致响应时间较高,用户体验差。
  • 后端服务器负载不均:请求未能均衡地分发到后端服务,导致某些服务器过载而其他服务器空闲,影响了整体系统的处理能力。
  • 系统可用性差:如果某个后端服务宕机,API 网关可能会将请求路由到不可用的服务,导致系统不可用。
  • 扩展性差:没有有效的机制来根据流量需求自动扩展后端服务,导致系统无法灵活应对流量的变化。

在使用 Nginx 配置 API 网关后,我们解决了上述问题,实现了以下优化效果:

序号

优势描述

详细说明

1

请求响应时间显著降低

通过负载均衡和请求的高效路由,Nginx 能够将请求均匀分发到多个后端服务,避免了单一服务器的瓶颈,从而有效降低了响应时间。

2

后端服务器负载均匀分布

Nginx 的负载均衡策略(如轮询、最少连接、IP 哈希等)确保了请求能够在后端服务器之间均匀分配,避免了某些服务器负载过重,而其他服务器空闲的情况。

3

系统高可用性

通过配置健康检查,Nginx 能够实时监控后端服务的健康状态,并将请求从不可用的服务路由到健康的服务。这样,即使某些后端服务发生故障,整个系统也不会受影响,确保了高可用性。

4

灵活的扩展性

借助 Nginx 的负载均衡功能,系统能够根据流量的变化动态扩展后端服务。例如,当请求量增大时,可以增加更多的后端服务器,Nginx 会自动将流量分发到新的服务器上,从而提高系统的处理能力。

配置效果对比

配置项

优化前

优化后

请求响应时间

500ms

100ms

后端服务器负载

高负载,容易崩溃

负载均衡,负载均匀

系统可用性

容易出现单点故障

高可用,通过健康检查避免故障传播

扩展性

不支持灵活扩展

支持按需扩展,负载均衡高效

详细分析

  1. 请求响应时间的优化 优化前,系统由于请求路由不合理和后端服务负载不均,导致请求的响应时间较高。当某些后端服务负载较重时,响应时间可能高达 500ms。而优化后,通过 Nginx 配置的负载均衡策略(如轮询、最少连接等),请求能够被均匀地分发到各个后端服务,避免了某个服务过载的情况。经过优化后,响应时间被大幅降低,平均响应时间缩短至 100ms,显著提升了用户体验。
  2. 后端服务器负载的均衡 优化前,由于缺乏负载均衡机制,后端服务负载不均,某些服务器可能处于高负载状态,而其他服务器几乎处于空闲状态。Nginx 的负载均衡策略确保了每个后端服务器的负载能够保持在合理范围内,减少了由于单一服务器过载导致的性能瓶颈。通过合理的流量分发和动态调整,后端服务的负载得到了均衡,系统性能得到了有效提升。
  3. 系统可用性的提升 优化前,如果某个后端服务宕机,Nginx 并未及时检测到,导致请求仍然被路由到该不可用服务,造成请求失败。优化后,Nginx 配置了健康检查机制,能够实时监控后端服务的健康状态。当某个服务宕机时,Nginx 会自动将请求路由到健康的服务,避免了单点故障带来的影响。通过健康检查,系统的高可用性得到了保障。
  4. 系统扩展性的优化 优化前,由于没有自动扩展机制,后端服务无法根据流量需求灵活调整,导致系统无法有效应对突发流量。优化后,通过 Nginx 的负载均衡和灵活的后端服务扩展机制,系统能够根据流量的变化自动增加或减少后端服务的数量。当流量增大时,Nginx 会自动将请求路由到新增的服务器,确保系统能够高效处理大量请求。这种灵活的扩展能力使得系统能够应对不同规模的流量,保证了系统的稳定性和可扩展性。

Nginx 配置文件结构

Nginx 配置文件一般位于 /etc/nginx/nginx.conf/etc/nginx/sites-available/default,可以根据实际情况修改。以下配置可以分为几个主要部分:

  • 全局设置
  • http 块(负载均衡、健康检查、速率限制等)
  • server 块(API 网关配置)

全局设置

代码语言:nginx
复制
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

events {
    worker_connections 1024;
}

http {
    include       mime.types;
    default_type  application/octet-stream;

    # Gzip 配置,压缩响应数据
    gzip on;
    gzip_comp_level 5;
    gzip_types text/plain application/javascript application/x-javascript text/javascript application/json application/xml;
    gzip_min_length 1000;

    # 设置访问日志
    access_log /var/log/nginx/access.log;

    # 配置缓存
    proxy_cache_path /tmp/cache keys_zone=cache_zone:10m max_size=100m inactive=1h;

    # 配置请求限制
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;
}

负载均衡配置与健康检查

在 Nginx 中配置负载均衡,可以使用 upstream 来定义后端服务器集群,同时启用健康检查功能,确保请求不会被路由到故障的服务器。

代码语言:nginx
复制
# 定义后端服务器池,使用轮询负载均衡策略
upstream backend_servers {
    # 配置健康检查
    zone backend_servers 64k;
    server backend1.example.com max_fails=3 fail_timeout=30s;
    server backend2.example.com max_fails=3 fail_timeout=30s;
    server backend3.example.com max_fails=3 fail_timeout=30s;
}

# 备用方案:若使用 nginx_plus 可以启用更高级的健康检查功能
# upstream backend_servers {
#     zone backend_servers 64k;
#     server backend1.example.com;
#     server backend2.example.com;
#     server backend3.example.com;
#     health_check;
# }

API 网关的 Server 配置

server 配置块中,我们将 Nginx 设置为反向代理 API 网关,配置负载均衡、请求路由、速率限制等。

代码语言:nginx
复制
server {
    listen 80;
    server_name api.example.com;

    # 限制并发连接数和请求速率
    limit_conn conn_limit 10;
    limit_req zone=req_limit burst=20 nodelay;

    # 配置跨域资源共享(CORS)
    add_header Access-Control-Allow-Origin *;
    add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS';
    add_header Access-Control-Allow-Headers 'Content-Type, Authorization';

    # 配置请求日志
    access_log /var/log/nginx/api_access.log;

    # API 路由配置
    location /payment {
        proxy_pass http://backend_servers/payment;
        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;
    }

    location /user {
        proxy_pass http://backend_servers/user;
        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;
    }

    location /order {
        proxy_pass http://backend_servers/order;
        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;
    }

    # 默认代理到支付服务
    location / {
        proxy_pass http://backend_servers/payment;
    }

    # 配置错误页面
    error_page 404 /404.html;
    location = /404.html {
        root /usr/share/nginx/html;
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root /usr/share/nginx/html;
    }
}

健康检查与请求重试

Nginx 默认不会执行健康检查,因此你需要手动配置或使用 Nginx Plus 版本来启用自动健康检查。

健康检查(Nginx Plus 示例)

代码语言:nginx
复制
upstream backend_servers {
    zone backend_servers 64k;
    server backend1.example.com;
    server backend2.example.com;
    server backend3.example.com;

    health_check interval=5s fails=3 passes=2;
}

健康检查(Nginx Open Source 示例)

对于 Nginx Open Source 版本,健康检查可以通过定期的负载均衡来间接实现,或者使用第三方模块(如 nginx_upstream_check_module)。

速率限制与流量控制

在 Nginx 中,速率限制是通过 limit_reqlimit_conn 实现的。这些指令能够限制客户端的请求频率和并发连接数。

速率限制
代码语言:nginx
复制
# 限制每个客户端的请求速率,每秒最多 10 次请求
limit_req_zone $binary_remote_addr zone=req_limit:10m rate=10r/s;

server {
    listen 80;
    server_name api.example.com;

    location /payment {
        limit_req zone=req_limit burst=20 nodelay;  # 最大突发请求数为 20
        proxy_pass http://backend_servers/payment;
    }
}
并发连接数限制
代码语言:nginx
复制
# 限制每个客户端的并发连接数为 10
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    listen 80;
    server_name api.example.com;

    location /user {
        limit_conn conn_limit 10;  # 限制每个 IP 同时最大连接数为 10
        proxy_pass http://backend_servers/user;
    }
}

Nginx 配置重载与测试

完成配置后,使用以下命令测试 Nginx 配置是否正确,并重载配置。

代码语言:bash
复制
# 测试配置文件是否有语法错误
sudo nginx -t

# 重载 Nginx 配置
sudo systemctl reload nginx

通过将 Nginx 配置为 API 网关,在线支付系统在多个方面获得了显著优化。通过负载均衡、健康检查、速率限制等功能,Nginx 不仅提升了系统的性能,还增强了系统的可用性和可扩展性。优化后的系统在处理请求时,响应时间大大降低,负载均匀分配,且能灵活扩展,以应对流量波动。这使得在线支付系统能够在高并发和高负载的场景下稳定运行,提供更好的用户体验。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • API 网关概述
    • 什么是 API 网关?
      • Nginx 作为 API 网关的优势
      • Nginx 作为 API 网关的配置与使用
        • 基本 API 网关配置
          • 高级配置:负载均衡与健康检查
            • API 网关的其他功能
            • 案例分析
              • 配置效果对比
                • 详细分析
                  • Nginx 配置文件结构
                    • 全局设置
                      • 负载均衡配置与健康检查
                        • API 网关的 Server 配置
                          • 健康检查与请求重试
                            • 健康检查(Nginx Plus 示例)
                              • 健康检查(Nginx Open Source 示例)
                                • 速率限制与流量控制
                                  • 速率限制
                                  • 并发连接数限制
                                • Nginx 配置重载与测试
                                领券
                                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档