nginx的替代 openresty

nginx的替代 openresty

openresty天然支持lua脚本,可以对请求响应进行编程式扩展,非常灵活

下面是利用openresty实现基于路径的负载均衡的案例,思路是获取
请求路径,将路径哈希取模(服务数量),适合文件接口(文件的简单集群)。
也可以实现一致性哈希算法,使得服务易扩展。

  1. 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
  1. 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;
    }

}
  1. 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)
posted @ 2025-07-11 13:27  小小爬虫  阅读(31)  评论(0)    收藏  举报