nginx tcp代理数据库/缓存的核心是启用stream模块并配置顶层stream块:需确认nginx -v含with-stream,ubuntu用apt install nginx-mod-stream并load_module,centos用yum或--with-stream编译;stream块须与http同级,不可嵌套;mysql需proxy_responses 1和长超时,redis推荐单节点或轮询,配置后执行nginx -t校验并重载。

Nginx 配置 TCP 代理访问数据库或缓存服务,核心是启用 stream 模块并正确组织四层转发逻辑——它不解析协议内容,只做原始 TCP 数据包透传,因此适用于 MySQL、Redis、RabbitMQ 等非 HTTP 类服务。
确认 stream 模块已加载
Nginx 1.9+ 才支持该模块,且默认未必启用:
- 运行
nginx -V 2>&1 | grep with-stream,有输出表示已编译内置 - 若无输出,Ubuntu/Debian 执行
sudo apt install nginx-mod-stream,再在/etc/nginx/nginx.conf开头添加:load_module /usr/lib/nginx/modules/ngx_stream_module.so; - CentOS/RHEL 可用
yum install nginx-mod-stream或重新编译时加--with-stream
在顶层配置 stream 块
必须放在 http 块之外(即主配置文件最外层),不能嵌套:
- 在
events { ... }后、http { ... }前插入: stream {<br> log_format proxy '$remote_addr [$time_local] $protocol $status $bytes_sent $bytes_received $session_time "$upstream_addr"';<br> access_log /var/log/nginx/tcp-access.log proxy;<br> include /etc/nginx/stream-conf/*.conf;<br>}- 创建目录:
sudo mkdir -p /etc/nginx/stream-conf,便于按服务拆分管理
编写具体服务转发规则
以 MySQL 和 Redis 为例,规则写在 /etc/nginx/stream-conf/ 下独立文件中:
-
MySQL(监听 3307,转发至 192.168.10.5:3306):
upstream mysql_backend {<br> server 192.168.10.5:3306;<br>}server {<br> listen 3307;<br> proxy_pass mysql_backend;<br> proxy_timeout 3600;<br> proxy_responses 1;<br>} -
Redis(单节点监听 6379):
upstream redis_single {<br> server 192.168.10.6:6379;<br>}server {<br> listen 6379;<br> proxy_pass redis_single;<br> proxy_timeout 3;<br> proxy_buffer_size 4k;<br>}
验证与安全注意事项
配置不是写完就生效,需逐项检查:
- 语法校验:
sudo nginx -t,成功后再重载:sudo nginx -s reload - 防火墙放行代理端口(如
ufw allow from 10.0.2.0/24 to any port 3307),限制来源 IP - 后端数据库用户授权必须针对 Nginx 服务器 IP(而非客户端 IP),例如:
CREATE USER 'app'@'192.168.10.100' IDENTIFIED BY 'pwd'; - 连接测试:用客户端直连
nginx_ip:3307,观察是否能正常握手并执行 SQL











