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限流是一種用于保護系統(tǒng)資源、防止惡意攻擊和控制流量的技術。
- 控制速率:使用
ngx_http_limit_req_module
模塊,可以限制每個IP地址單位時間內的請求數(shù)。 - 控制連接數(shù):使用
ngx_http_limit_conn_module
模塊,可以限制每個IP地址同時保持的連接數(shù)。
2. 控制速率
- nginx.conf
http { limit_req_zone $binary_remote_addr zone=limit_req:10m rate=2r/s; }
項 | 說明 |
---|---|
binary_remote_addr | 表示通過客戶端IP來限制 |
zone | 共享內存區(qū)存儲訪問信息 |
limit_req:10m | 名字為limit_req的內存區(qū)域,存儲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 | 突發(fā)請求不超過10個 |
nodelay | 不延遲處理超過限制的請求 |
3. 控制連接數(shù)
- nginx.conf
http { limit_conn_zone $binary_remote_addr zone=limit_conn:10m; }
項 | 說明 |
---|---|
binary_remote_addr | 表示通過客戶端IP來限制 |
zone | 共享內存區(qū)存儲訪問信息 |
limit_conn:10m | 名字為limit_conn的內存區(qū)域,存儲16萬IP地址 |
server { location = /test.htm { limit_conn limit_conn 2; alias C:/nginx/html/test.htm; } }
項 | 說明 |
---|---|
limit_conn 2 | 同一個IP地址只允許保持2個連接 |
總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
nginx中proxy_set_header參數(shù)的實現(xiàn)
本文詳細介紹了Nginx中proxy_set_header指令的用法,通過設置不同的請求頭信息,可以實現(xiàn)更靈活的反向代理功能,具有一定的參考價值,感興趣的可以了解一下2024-12-12nginx配置域名訪問時域名后出現(xiàn)兩個斜杠//的解決方法
最近這兩天重新寫了一下我的個人網(wǎng)站,在阿里云新買了一臺服務器,配置好以后出現(xiàn)了一個問題,就是輸入域名后域名地址會自動在后面追加兩個斜桿,需要的朋友可以參考下2020-07-07