可行,需启用stream模块并配置so_keepalive;示例配置含upstream定义、监听1522端口、权重与健康检查参数,客户端改连Nginx地址即可。

直接用 Nginx 对 Oracle 数据库做 TCP 层负载均衡是可行的,但必须启用 stream 模块,不能用默认的 HTTP 代理方式。Oracle 是基于 TCP 的长连接服务(端口 1521),Nginx 默认只处理 HTTP/HTTPS 流量,所以配置核心在于启用 stream 上下文、定义 upstream、监听端口并透传原始 TCP 流量。
确认并启用 Nginx stream 模块
Nginx 官方二进制包(如 Ubuntu apt 安装的)通常不带 stream 模块。需手动编译或使用支持该模块的发行版(如某些第三方 apt 源)。验证方法:
- 执行
nginx -V 2>&1 | grep -o with-stream,有输出说明已启用 - 若无输出,需重新编译:解压源码后运行
./configure --with-stream && make && sudo make install - Ubuntu 用户可尝试安装
nginx-full包(含 stream),命令:sudo apt install nginx-full
编写 stream 块配置(关键步骤)
编辑 /etc/nginx/nginx.conf,在 events 块之后、http 块之外添加 stream 配置段。示例:
stream {-
upstream oracle_rac { -
server 192.168.26.201:1521 weight=1 max_fails=2 fail_timeout=30s; -
server 192.168.26.203:1521 weight=2 max_fails=2 fail_timeout=30s; -
} -
server { -
listen 1522 so_keepalive=on; -
proxy_pass oracle_rac; -
proxy_timeout 30s; -
proxy_connect_timeout 5s; -
} }
说明:so_keepalive=on 必须开启,防止 Oracle 连接中途断连或“飘移”;weight 控制分发比例;max_fails/fail_timeout 启用自动健康检查。
客户端连接方式调整
应用或工具不再直连 Oracle VIP 或 RAC 节点,而是连接 Nginx 代理地址:
- JDBC URL 示例:
jdbc:oracle:thin:@192.168.24.101:1522/ORCL(其中192.168.24.101是 Nginx 服务器 IP) - SQL*Plus 连接:
sqlplus user/pass@192.168.24.101:1522/ORCL - tnsnames.ora 中可定义别名指向 Nginx 监听地址,而非真实数据库地址
注意:Oracle 客户端无需额外安装或修改驱动,仅变更连接字符串即可生效。
验证与排错要点
配置完成后重启并检查实际效果:
- 启动服务:
sudo systemctl restart nginx,确认无报错(sudo nginx -t先测试语法) - 用
ss -tlnp | grep :1522确认 Nginx 正在监听 1522 端口 - 从客户端发起连接,同时在两个 Oracle 实例上执行
SELECT inst_id, username, program FROM gv$session WHERE username IS NOT NULL;,观察会话是否分布在不同节点 - 模拟某节点宕机(如停库),观察新连接是否自动落到存活节点,且已有连接不受影响(因 TCP 会话保持)
常见问题:连接超时多因防火墙未放行 1522 端口;ORA-12547 多因未启用 so_keepalive 导致连接异常中断。


















