当前位置: 首页 > news >正文

Nginx四层代理实战:从数据库到游戏服务的全能端口转发

1. 为什么需要Nginx四层代理?

你可能已经习惯了用Nginx做HTTP反向代理,比如把用户请求转发到后端的Web服务器。但当我第一次尝试用Nginx代理MySQL数据库连接时,发现常规的HTTP代理配置根本不奏效——因为数据库通信根本不走HTTP协议!这就是四层代理的用武之地。

四层代理工作在传输层(TCP/UDP),不关心应用层协议。这意味着它能代理任意基于端口通信的服务:MySQL、Redis、游戏服务器、视频流媒体...只要是有端口在工作的服务,它都能搞定。我去年就帮一个手游工作室用这个方案,把全球玩家的TCP连接智能路由到最近的游戏服务器集群,延迟直接降低了40%。

2. 环境准备与模块编译

2.1 编译带stream模块的Nginx

官方从1.9.0版本开始支持stream模块,但默认不开启。最近给客户部署时发现,如果用apt-get直接安装的Nginx大概率不带这个模块。最稳的方式还是手动编译:

# 安装依赖(CentOS示例) yum install -y gcc pcre-devel zlib-devel openssl-devel # 下载源码包 wget http://nginx.org/download/nginx-1.25.3.tar.gz tar zxvf nginx-1.25.3.tar.gz cd nginx-1.25.3 # 关键配置项 ./configure \ --prefix=/usr/local/nginx \ --with-stream \ --with-stream_ssl_module \ # 如果需要SSL加密传输 --with-threads # 提升多核利用率 make && make install

踩坑提醒:有次在阿里云ECS上编译时报错,原来是默认gcc版本太老。用gcc -v检查版本,低于4.8的建议先升级编译器。

2.2 验证模块加载

安装完成后别急着配置,先确认stream模块是否真的生效:

/usr/local/nginx/sbin/nginx -V 2>&1 | grep stream

看到--with-stream输出才算大功告成。曾经有同事在这步翻车,排查半天才发现是编译环境变量污染导致配置没生效。

3. 基础配置实战

3.1 MySQL代理配置示例

假设我们要把本地的3307端口代理到远程MySQL服务器(192.168.1.100:3306),nginx.conf里这样写:

stream { upstream mysql_backend { server 192.168.1.100:3306 weight=5; server 192.168.1.101:3306 backup; # 备用服务器 } server { listen 3307; proxy_pass mysql_backend; proxy_connect_timeout 3s; proxy_timeout 1h; # 长连接保持时间 # TCP健康检查(需要Nginx 1.11.7+) proxy_socket_keepalive on; } }

实测技巧:游戏服务器这类需要长连接的场景,建议把proxy_timeout设大些。有次线上事故就是因为默认超时10分钟,导致玩家突然掉线。

3.2 多协议混合代理

更酷的是可以同时代理多种服务。这是我给某跨境电商做的配置,同时处理Redis、MySQL和自定义TCP服务:

stream { # Redis集群 upstream redis_nodes { hash $remote_addr consistent; server 10.0.1.10:6379; server 10.0.1.11:6379; } # 财务数据库 upstream finance_db { server db.finance.internal:3306; } # 订单处理服务 upstream order_service { server 172.16.0.100:8080; server 172.16.0.101:8080; } server { listen 6379; proxy_pass redis_nodes; } server { listen 3306; proxy_pass finance_db; } server { listen 8080; proxy_pass order_service; } }

4. 高级功能调优

4.1 负载均衡策略

四层代理支持多种负载算法,根据业务特点选择:

  • 轮询(默认):适用于无状态服务
  • 一致性哈希:会话保持必备,配置hash $remote_addr consistent
  • 最少连接least_conn,适合处理时间差异大的服务
  • 随机random two,大规模集群时效果更好

游戏服务器项目中我们用一致性哈希+权重配置,玩家每次都能连到同一台物理服务器,完美解决跨服战斗数据同步问题。

4.2 流量控制与限速

防止某个服务耗尽所有带宽:

server { listen 27017; proxy_pass mongodb_cluster; # 每秒传输速率限制(单位:字节) proxy_upload_rate 100k; proxy_download_rate 500k; # 连接数限制 max_connections 500; }

血泪教训:有次DDoS攻击打到游戏服务器,幸亏提前配置了max_connections,否则后端服务早就崩溃了。

5. 安全加固方案

5.1 IP白名单控制

server { listen 5432; allow 192.168.1.0/24; allow 10.0.0.1; deny all; proxy_pass postgres_backend; }

5.2 SSL/TLS加密传输

数据库流量裸奔太危险,上加密:

stream { upstream encrypted_mysql { server 192.168.1.100:3306; } server { listen 3306 ssl; proxy_pass encrypted_mysql; ssl_certificate /path/to/server.crt; ssl_certificate_key /path/to/server.key; ssl_protocols TLSv1.2 TLSv1.3; # 双向认证(可选) ssl_client_certificate /path/to/ca.crt; ssl_verify_client on; } }

最近帮金融客户部署时,他们要求用国密算法,只需把ssl_ciphers改成SM4-GCM-SM3就行。

6. 监控与排错

6.1 状态监控配置

在http区块添加(注意:和stream区块同级):

http { server { listen 8081; location /stream_status { stream_status; } } }

访问http://服务器IP:8081/stream_status就能看到实时连接数、流量等数据。上周刚用这个功能发现某台Redis节点异常,及时切换避免了雪崩。

6.2 日志分析技巧

建议给stream单独配置日志格式:

stream { log_format tcp_proxy '$remote_addr [$time_local] ' '$protocol $status $bytes_sent $bytes_received ' '$session_time "$upstream_addr"'; server { listen 3306; access_log /var/log/nginx/mysql_proxy.log tcp_proxy; proxy_pass mysql_backend; } }

通过$bytes_received/$bytes_sent能清晰看出哪些查询最耗流量。有次发现某个客户端疯狂拉数据,一查果然是SQL没加limit。

http://www.jsqmd.com/news/564606/

相关文章:

  • 避坑指南:在K210上跑人脸68关键点,这些细节让你的疲劳检测更准
  • Qt6 安卓环境配置
  • Web3D开发入门:5大引擎(Direct3D、OpenGL、UE、Unity、Three.js)选型指南
  • 算法基础篇(13)单调栈
  • ManySpeech 语音处理套件:跨平台 C# 语音解决方案
  • 新手福音:基于快马平台轻松入门openclaw命令实战
  • 如何轻松获取B站4K大会员视频?这个开源工具让你一键搞定
  • Windows右键菜单重构指南:从混乱到高效的ContextMenuManager实战
  • PCIe接口卡设计原理图:124-基于XC7Z015的PCIe低速扩展底板
  • 上海航思昳商务咨询有限公司,上海全品类落户服务商,深耕上海 - 十大品牌榜
  • 3步实现GitHub全界面中文化:高效本地化工具提升开发效率指南
  • Llama-3.2V-11B-cot部署教程:双卡4090显存碎片化问题自动规避
  • 炉石传说脚本终极配置教程:3步实现高效自动化游戏体验
  • BLE项目实战:从GATT属性设计到低功耗优化,打造长续航物联网设备
  • 2026年丛林穿越项目如何选择?A公司与B公司及优乐福的性价比与服务深度对比 - 速递信息
  • 工业视觉检测避坑指南:CogBlobTool阈值设置5大常见错误及解决方案
  • CLAP在虚拟现实中的应用:3D音效分类系统
  • 2026最新上海落户推荐!创业/留学生/居转户/人才引进权威榜单发布 - 十大品牌榜
  • 怎样避免网站因 SEO 优化而被搜索引擎惩罚
  • 文脉定序系统Node.js环境配置与API调用入门
  • AI产品的五个护城河
  • 2026最新上海居转户落户推荐!权威榜单发布,助力人才扎根上海 - 十大品牌榜
  • Zotero Duplicates Merger:智能文献去重的技术突破与实践指南
  • 盒马鲜生卡回收指南:如何高效选择回收方式? - 团团收购物卡回收
  • Scarab:重构空洞骑士模组管理体验的技术实践
  • 深入解析cn.hutool.http.HttpException: Connection reset的根源与实战修复
  • COMSOL LFP磷酸铁锂电池一维P2D模型下的0.5C、1C、1.5C倍率充放电测试及阻抗输出
  • 2026最新上海创业落户/居转户/人才引进推荐!权威榜单发布 - 十大品牌榜
  • 基于SpringBoot的CLAP音频分类服务开发实战
  • 如何打破微信单设备限制:WeChatPad终极指南