Apache 通过 mod_rewrite + 环境变量 + 条件代理实现 IP 哈希路由:提取客户端 IP,计算哈希(如取末段或 CRC32 取模),设环境变量,再用 ProxyPass env= 或 按值路由至对应后端。

Apache 本身在 mod_proxy_balancer 中不直接支持类似 Nginx 的 ip_hash 指令,但可通过 mod_rewrite + 环境变量 + 条件代理的方式,实现基于客户端 IP 哈希的固定路由分发。核心思路是:提取 IP、计算哈希(如取最后一位或 CRC32 后取模)、设置环境标记,再用 ProxyPass 的 env= 条件将请求显式路由到对应后端。
启用必要模块
确保以下模块已加载(通常在 httpd.conf 或 apache2.conf 中):
mod_proxymod_proxy_httpmod_proxy_balancermod_rewrite-
mod_slotmem_shm(必需,用于共享内存管理 balancer 状态) -
mod_lbmethod_byrequests或其他负载算法模块(即使不用默认轮询,也建议启用)
提取并哈希客户端 IP
使用 RewriteCond 和 RewriteRule 提取 IP 并生成稳定哈希值。推荐两种轻量方式:
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
-
取 IPv4 最后一段数字(简单、可读、适合小集群):
RewriteCond %{REMOTE_ADDR} ^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$RewriteRule ^ - [E=IP_SLOT:%4] -
用
expr计算 CRC32 哈希后取模(更均匀,推荐用于 3 台以上后端):RewriteCond %{REMOTE_ADDR} ^(.+)$RewriteRule ^ - "E=IP_HASH:%{expr:crc32('%1') % 3}"(假设 3 台后端,结果为 0/1/2)
按哈希值路由到不同后端
定义多个独立的 balancer:// 集群(或直接代理到单台地址),再用 <if></if> 或 env= 控制转发路径:
- 方式一:用
env=配合ProxyPass(简洁,兼容性好):ProxyPass / http://backend-a/ env=IP_SLOT=1ProxyPass / http://backend-b/ env=IP_SLOT=2ProxyPass / http://backend-c/ env=IP_SLOT=3 - 方式二:用
<if></if>块(Apache 2.4.13+,逻辑清晰):<if></if>ProxyPass / http://192.168.1.101:8080/<if></if>ProxyPass / http://192.168.1.102:8080/
注意事项与建议
该方案本质是“伪会话保持”,不依赖后端服务器状态,但需注意:
- IPv6 客户端需额外处理(
%{REMOTE_ADDR}返回格式不同),建议先做 IPv4/IPv6 分流或统一转为 IPv4 兼容格式 - 若后端节点增减,哈希映射会变化,导致部分用户路由漂移;如需强一致性,应改用一致性哈希(需自定义 Lua 或外部模块)
- 生产环境避免暴露
/balancer-manager,且建议关闭该功能以防未授权访问 - 配合
ProxyPassReverse确保响应头中Location、Set-Cookie等正确重写









