首页 > 其他分享 >openresty通过lua实现ip地址hash

openresty通过lua实现ip地址hash

时间:2024-08-16 17:38:23浏览次数:11  
标签:hash .. nginx -- ip module lua add upstream

实验环境:

root@paas-test-ubuntu:/opt/openresty# bin/openresty -V
nginx version: openresty/1.25.3.2
built by gcc 11.4.0 (Ubuntu 11.4.0-1ubuntu1~22.04) 
built with OpenSSL 3.0.2 15 Mar 2022
TLS SNI support enabled
configure arguments: --prefix=/opt/openresty/nginx --with-cc-opt=-O2 --add-module=../ngx_devel_kit-0.3.3 --add-module=../echo-nginx-module-0.63 --add-module=../xss-nginx-module-0.06 --add-module=../ngx_coolkit-0.2 --add-module=../set-misc-nginx-module-0.33 --add-module=../form-input-nginx-module-0.12 --add-module=../encrypted-session-nginx-module-0.09 --add-module=../srcache-nginx-module-0.33 --add-module=../ngx_lua-0.10.26 --add-module=../ngx_lua_upstream-0.07 --add-module=../headers-more-nginx-module-0.37 --add-module=../array-var-nginx-module-0.06 --add-module=../memc-nginx-module-0.20 --add-module=../redis2-nginx-module-0.15 --add-module=../redis-nginx-module-0.3.9 --add-module=../rds-json-nginx-module-0.16 --add-module=../rds-csv-nginx-module-0.09 --add-module=../ngx_stream_lua-0.0.14 --with-ld-opt=-Wl,-rpath,/opt/openresty/luajit/lib --with-stream --without-pcre2 --with-stream_ssl_module --with-stream_ssl_preread_module --with-http_ssl_module

nginx.conf配置:

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {  

    log_format  main  '"远程地址:" $remote_addr - "访问地址:" "$upstream_addr" - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "真实地址"  "$http_x_forwarded_for"';
    access_log  logs/access.log  main;

    # 定义一个用于存储IP地址与上游服务器映射的共享内存区域  
    lua_shared_dict iphash_map 10m;  
    upstream backend1 {  
        server 192.168.2.130:9000;  
    }  

    upstream backend2 {  
        server 192.168.2.130:60;
    }  
    server {  
        listen 80;  
        server_name loclhost;  
          # 定义上游服务器组  

        location / {  
       #此处必须设置个默认值, 不然会报错没有此变量 set $upstream_id "http://192.168.2.300"; # 使用access_by_lua_block执行Lua脚本 access_by_lua_block { local ip = ngx.var.remote_addr -- 获取客户端的IP地址 local iphash_map = ngx.shared.iphash_map -- 获取共享内存区域 -- 计算IP地址的哈希值,并使用这个哈希值作为键来检索上游服务器的标识 local hash_key = ngx.md5(ip) local upstream_id = iphash_map:get(hash_key) -- 如果共享内存中没有这个IP地址的哈希值,就为其分配一个上游服务器,并存储到共享内存中 if upstream_id == nil then upstream_id = math.random(1, 2) -- 假设我们有2个上游服务器 iphash_map:set(hash_key, upstream_id, 3600) -- 设置过期时间为3600秒 end -- 设置变量,以便在后续的请求处理中使用这个上游服务器的标识 ngx.var.upstream_id = upstream_id } # 根据之前设置的变量选择上游服务器 proxy_pass http://backend$upstream_id; } } }

 

包地址:OpenResty - OpenResty 1.25.3.2 Released

标签:hash,..,nginx,--,ip,module,lua,add,upstream
From: https://www.cnblogs.com/aroin/p/18363351

相关文章

  • 别再被坑了! JavaScript类型检测的最佳实践
    别再被坑了!JavaScript类型检测的最佳实践在JavaScript中,我们经常需要判断一个变量的类型。这个需求在编程中非常常见,因为不同类型的数据会影响到我们的代码逻辑。JavaScript提供了几种方法来检测数据类型,每种方法都有自己的优缺点。Object.prototype.toString.call()......
  • QuickTime Player 在 Mac / iPad / iPhone 上无法播放 .mp4 视频 bug All In One
    QuickTimePlayer在Mac/iPad/iPhone上无法播放.mp4视频bugAllInOneerrors❌从网上下载的.m3u8(有多个.ts格式的视频片段组合成的)MP4视频,使用Mac/iPad/iPhone自带的QuickTimePlayer都无法正常播放视频bug!要么是没有图像,只有声音;要么是只走进度......
  • 添加SCAN IP
    在OracleRAC环境中,添加SCANIP(SingleClientAccessName)是一种提高连接灵活性和负载均衡的方法。以下是添加SCANIP的步骤:查看现有的SCANIP配置情况:使用srvctlconfigscan命令来查看当前的SCAN配置,包括已有的SCANIP地址。修改所有节点的/etc/hosts:在所有RAC节点......
  • JavaScript判断系统和浏览器
    在做项目的时候,Web端需要适配移动端,且部分参数需要判断对应系统或浏览器。在IOS中,因为高版本的系统Safari浏览器采用了Mac的内核,所以导致普通的判断无法识别到对应系统。(userAgent.match(/(Macintosh)/)&&navigator.maxTouchPoints>=1)能有效识别是apple端,且是触屏的,通过......
  • ECMAScript性能调优艺术:深度挖掘与实战避坑
    ECMAScript性能调优艺术:深度挖掘与实战避坑在Web开发的广阔天地中,ECMAScript(即JavaScript的标准化版本)的性能调优不仅是技术层面的挑战,更是艺术层面的追求。本文旨在深入探讨ECMAScript性能优化的各种技巧,并揭示隐藏在日常编码中的性能陷阱,帮助开发者在追求高性能的道路上......
  • SOMEIP_ETS_042: echoUTF16DYNAMIC_length_too_short_for_String
    测试目的:验证设备(DUT)能否正确拒绝一个长度小于实际字符串长度的echoUTF16DYNAMIC字符串。描述本测试用例旨在检查当发送的SOME/IP消息中的echoUTF16DYNAMIC字符串长度小于实际字符串长度时,DUT是否能够返回格式错误(MALFORMED_MESSAGE)的错误消息。测试拓扑:具体步骤:TEST......
  • macOS和 Window10 命令行禁用/启用IPv6本地网络
    macOS禁用/启用IPv6本地网络禁用IPv6本地网络#验证是否可以访问IPv6网络$curl6.ipw.cn2408:824c:200::2b8b:336f:cc9c#找到网络设备的名字,这里用的是Wi-Fi(因为macbook用的是无线网络访问,即Wi-Fi)$networksetup-listallnetworkservicesAnasterisk(......
  • iPad作为扩展屏的最简单方式*
    iPad作为扩展屏的最简单方式在当今的数字化时代,多屏协作已经成为提高工作效率和优化用户体验的重要手段。对于许多用户而言,iPad作为一款轻便、功能强大的移动设备,不仅可以作为独立的计算工具,还可以作为其他设备的扩展屏幕,从而极大地增加工作区域和灵活性。本文将详细介绍iP......
  • Python - SOLID Principles
    •Singleresponsibilityprinciple(SRP)•Open-closedprinciple(OCP)Itemphasizesthatsoftwareentities, suchasclassesandmodules,shouldbeopenforextensionbutclosedformodification.Whatdoes thatmean?Itmeansthatonceasoftwareentityis......
  • 【IPMI】BMC
    1、典型功能1.1系统接口系统接口就是提供给基于IPMI的平台管理子系统(类似于网管系统,BMC的上层系统)使用的接口。1.2消息处理器为不同接口(包括系统接口,IPMB,serial/modem,LAN等)之间提供消息路由的功能。MessageHandler也可以被认为是用于配置通道特征和用户特权的共享消息传递......