Nginx鉴权、限流问题

 更新时间:2024年06月19日 10:49:48   作者:yancqitcode  
这篇文章主要介绍了Nginx鉴权、限流问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、Nginx鉴权

1. 依赖模块 依赖模块

  • 依赖模块
http_auth_request_module
  • 验证是否安装
nginx -V 2>&1 | grep -- 'http_auth_request_module'

2. Nginx配置

server
{
	listen 80;

	location = /checkToken {
		internal;
		proxy_pass_request_body off;
		proxy_set_header Content-Length "";
		proxy_set_header via $request_uri;
		proxy_pass $auth_request_url;
	}

	location = /auth401 {
		add_header Cache-Control "no-store, no-cache, must-revalidate, proxy-revalidate";
		if ( $arg_via = "001" ) {
			return 401 "{\"msg\":\"登录凭证为空\",\"opCode\":\"001\",\"operateSuccess\":false}";
        }
		if ( $arg_via = "002" ) {
			return 401 "{\"msg\":\"登录凭证失效\",\"opCode\":\"002\",\"operateSuccess\":false}";
        }
        if ( $arg_via = "003" ) {
			return 401 "{\"msg\":\"账户无权限\",\"opCode\":\"003\",\"operateSuccess\":false}";
        }
	}

	location /test/api/ {
		set $auth_request_url "http://127.0.0.1:8080/test/api/token/check?token=$arg_token";
		auth_request /checkToken;
		auth_request_set $auth_via $upstream_http_via;
		error_page 401 = /auth401?via=$auth_via;
		
		proxy_pass http://127.0.0.1:8080/test/api/;
	}

}

3. Rest接口

  • 验证的Redis账户权限内容
  • TokenRest.java
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Map;
import java.util.Set;

@RestController
@RequestMapping("/api/token")
public class TokenRest {

	@Resource
	private RedisTemplate redisTemplate;

	@GetMapping(value="check")
	public void checkRest(HttpServletRequest request, HttpServletResponse response) {
		response.setStatus(401);
		try {
			String url = request.getHeader("via");
			if (StringUtils.isNotEmpty(url) && url.contains("?")) {
				url = url.substring(0, url.indexOf("?"));
			}
			// 白名单跳过验证
			String flag = (String) redisTemplate.opsForHash().get("whiteCache", url);
			if (StringUtils.isNotEmpty(flag)) {
				response.setStatus(200);
				return;
			}
			// 从Head或url中获取token
			String token = request.getParameter("token");
			if (StringUtils.isEmpty(token) || "null".equals(token)) {
				token = request.getHeader("Authorization");
				if (token!=null && token.startsWith("Bearer ")) {
					token = token.substring(7);
				}
			}
			if (StringUtils.isEmpty(token) || "null".equals(token)) {
				response.setHeader("via", "001");
				return;
			}
			// 从Redis中获取账户信息
			String accountId = (String) redisTemplate.opsForValue().get(token);
			if (accountId == null) {
				response.setHeader("via", "002");
				return;
			}
			Map<String, String> info = (Map<String, String>) redisTemplate.opsForValue().get(accountId);
			if (info == null) {
				response.setHeader("via", "003");
				return;
			}
			String[] roleIds = info.get("roles").split(",");
			for (String roleId : roleIds) {
				Set<String> securityUrls = (Set<String>) redisTemplate.opsForHash().get("funcCache",roleId);
				if (securityUrls.contains(url)) {
					flag = "1";
					break;
				}
			}
			if ("1".equals(flag)) {
				response.setStatus(200);
			} else {
				response.setHeader("via", "003");
			}
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
	}
}
  • 验证的Redis账户权限内容

在这里插入图片描述

二、Nginx限流

1. 简介

Nginx限流是一种用于保护系统资源、防止恶意攻击和控制流量的技术。

  • 控制速率:使用 ngx_http_limit_req_module 模块,可以限制每个IP地址单位时间内的请求数。
  • 控制连接数:使用 ngx_http_limit_conn_module 模块,可以限制每个IP地址同时保持的连接数。

2. 控制速率

  • nginx.conf
http
{
	limit_req_zone $binary_remote_addr zone=limit_req:10m rate=2r/s;
}
说明
binary_remote_addr表示通过客户端IP来限制
zone共享内存区存储访问信息
limit_req:10m名字为limit_req的内存区域,存储16万IP地址
rate=2r/s表示每秒最多处理2个请求
server
{
	location = /test.htm {
		limit_req zone=limit_req burst=10 nodelay;
		alias C:/nginx/html/test.htm;
	}
}
说明
burst=10突发请求不超过10个
nodelay不延迟处理超过限制的请求

3. 控制连接数

  • nginx.conf
http
{
	limit_conn_zone $binary_remote_addr zone=limit_conn:10m;
}
说明
binary_remote_addr表示通过客户端IP来限制
zone共享内存区存储访问信息
limit_conn:10m名字为limit_conn的内存区域,存储16万IP地址
server
{
	location = /test.htm {
		limit_conn limit_conn 2;
		alias C:/nginx/html/test.htm;
	}
}
说明
limit_conn 2同一个IP地址只允许保持2个连接

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 如何本地安装nginx及部署项目

    如何本地安装nginx及部署项目

    这篇文章主要介绍了如何本地安装nginx及部署项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 一文详解Nginx日志的查找与分析技巧

    一文详解Nginx日志的查找与分析技巧

    在维护 Web 服务器时,Nginx 就像一位沉默的守门人,它通常运行得非常稳定,但一旦出现 502 Bad Gateway 或页面加载缓慢时,很多新手面对黑底白字的终端会感到迷茫,本文将带你快速掌握 Nginx 日志的查找与分析技巧,助你从容应对服务器故障,需要的朋友可以参考下
    2025-12-12
  • Nginx 多站点配置实例详解

    Nginx 多站点配置实例详解

    这篇文章主要介绍了Nginx 多站点配置实例详解的相关资料,需要的朋友可以参考下
    2017-03-03
  • Nginx HTTP 配置指令的实现示例

    Nginx HTTP 配置指令的实现示例

    本文主要介绍了Nginx的配置文件结构和HTTP配置指令,涵盖了从请求处理到安全、日志、负载均衡、缓存等各个方面,具有一定的参考价值,感兴趣的可以了解一下
    2024-12-12
  • Nginx搭建rtmp直播服务器实现代码

    Nginx搭建rtmp直播服务器实现代码

    这篇文章主要介绍了Nginx搭建rtmp直播服务器实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • nginx 自定义 404、50x 错误页面的实现

    nginx 自定义 404、50x 错误页面的实现

    本文主要介绍了nginx 自定义 404、50x 错误页面的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-12-12
  • Nginx之rewrite实现URL重写方式

    Nginx之rewrite实现URL重写方式

    文章介绍了Nginx的rewrite模块,包括其重要性、相关指令(如set、if、break、return、rewrite)的使用方法和作用域,并举例说明了这些指令的实际应用场景,如域名重定向和防盗链处理
    2025-03-03
  • 设置Nginx允许上传文件的大小的代码详解

    设置Nginx允许上传文件的大小的代码详解

    这篇文章主要给大家介绍了关于设置Nginx允许上传文件的大小的方法,文中通过示例代码介绍的非常详细,对大家学习Nginx有一定的参考学习价值,需要的朋友们下面来一起学习吧
    2024-01-01
  • 详解Nginx如何处理WebSocket连接

    详解Nginx如何处理WebSocket连接

    在当今互联网的世界中,实时通信变得越来越重要,WebSocket 作为一种实现实时双向通信的技术,正被广泛应用于各种场景,而 Nginx 作为一款高性能的 Web 服务器和反向代理服务器,在处理 WebSocket 连接方面也有着出色的表现,本文介绍了Nginx如何处理WebSocket连接
    2024-07-07
  • 在Nginx中实现URL重写与重定向

    在Nginx中实现URL重写与重定向

    Nginx 的 **URL 重写(Rewrite)**功能允许你根据请求的 URL 动态地修改请求路径或进行重定向,本文将详细介绍如何在 Nginx 中实现 URL 重写,并给出一些常见的实际场景,需要的朋友可以参考下
    2025-01-01

最新评论