nginx的替代 openresty
nginx的替代 openresty
openresty天然支持lua脚本,可以对请求响应进行编程式扩展,非常灵活
下面是利用openresty实现基于路径的负载均衡的案例,思路是获取
请求路径,将路径哈希取模(服务数量),适合文件接口(文件的简单集群)。
也可以实现一致性哈希算法,使得服务易扩展。
- docker-compose 安装 openresty
version: '3'
services:
openresty:
network_mode: host
image: openresty/openresty:alpine
container_name: openresty
volumes:
- ./nginx/logs:/usr/local/openresty/nginx/logs
- ./nginx/lua:/etc/nginx/lua
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf
restart: unless-stopped
- default.conf 配置
upstream backend_pool {
server 192.168.1.1:8080;
server 192.168.1.2:8080;
server 192.168.1.3:8080;
}
lua_package_path "/etc/nginx/lua/?.lua;;";
server {
listen 80;
location /api1/ {
set $target_backend "";
access_by_lua_file /etc/nginx/lua/dynamic_router.lua;
proxy_pass http://$target_backend;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
location /api2/ {
proxy_pass http://backend_pool;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
- lua 脚本
-- 定义可用后端服务器列表
local servers = {
"192.168.1.1:8080",
"192.168.1.2:8080",
"192.168.1.3:8080"
}
-- 获取请求路径
local path = ngx.var.uri
-- 哈希算法计算目标索引
local hash = ngx.crc32_long(path)
local idx = (hash % #servers) + 1
-- 设置代理目标
ngx.var.target_backend = servers[idx]
-- 可选:记录路由决策
ngx.log(ngx.INFO, "Routing [", path, "] to backend: ", ngx.var.target_backend)
不积跬步无以至千里

浙公网安备 33010602011771号