实验环境:
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; } } }