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

Nginx如何实现 TCP和UDP代理?

文章目录
  • 前言
    • Nginx之TCP和UDP代理
      • 工作原理
      • 示意图
    • 配置文件和命令参数注释
      • 基本命令
    • 配置实例说明
      • TCP代理实例
      • UDP代理实例
  • 总结

前言

Nginx是一个高性能的HTTP和反向代理服务器,同时也支持TCP/UDP代理。在1.9.13版本后,Nginx已经支持端口转发,包括TCP和UDP协议。Nginx的TCP/UDP代理功能允许它作为一个中间人,接收来自客户端的TCP或UDP请求,并将这些请求转发到指定的后端服务器,然后将后端服务器的响应返回给客户端。

Nginx之TCP和UDP代理

工作原理
  1. 配置:首先需要在Nginx的配置文件中设置TCP/UDP代理的相关参数,例如监听的端口、后端服务器的地址和端口等。
  2. 监听:Nginx根据配置文件中的设置,在指定端口上监听来自客户端的连接请求。
  3. 连接:当接收到客户端的连接请求后,Nginx会立即尝试与后端服务器建立连接。
  4. 数据转发:建立连接后,Nginx将客户端发送的数据转发给后端服务器,并将后端服务器的响应数据转发回客户端。
  5. 保持连接:Nginx支持长连接和短连接,根据实际需求保持或关闭与客户端及后端服务器的连接。
  6. 安全和优化:Nginx还提供了SSL/TLS加密、负载均衡、故障转移等高级功能,以增强TCP/UDP代理服务的安全性和稳定性。
示意图
+--------+      +--------+      +--------+
|  Client | ---> |   Nginx  | ---> | Backend|
+--------+      +--------+      +--------+

配置文件和命令参数注释

Nginx的配置文件一般位于Nginx安装目录下的conf目录下,主要配置文件是nginx.conf。以下是一些基本的配置指令和它们的注释:

# 工作进程的数量
worker_processes  auto;# 错误日志文件的位置和日志级别
error_log /var/log/nginx/error.log info;# 事件模块配置
events {# 每个工作进程允许的最大连接数worker_connections  1024;
}# HTTP模块配置
http {# 包含MIME类型的配置文件include       mime.types;# 默认的MIME类型default_type  application/octet-stream;# 日志格式log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';# 访问日志的位置access_log  logs/access.log  main;# 开启高效传输文件的模式sendfile     on;# TCP_NODELAY选项设置tcp_nopush   on;# TCP_NODELAY选项设置tcp_nodelay  on;# 长连接超时时间keepalive_timeout  65;# 其他配置...
}# TCP/UDP 模块配置
stream {# TCP代理配置upstream backend {server 127.0.0.1:12345  max_fails=3 fail_timeout=30s;}server {listen 12345;proxy_connect_timeout 1s;proxy_timeout 3s;proxy_pass backend;}# UDP代理配置upstream udp_backend {server 192.168.31.51:514;}server {listen 1514 udp;proxy_pass udp_backend;}
}
基本命令
  • nginx -t:检查配置文件是否有语法错误。
  • nginx -s reload:热加载,重新加载配置文件。
  • nginx -s stop:快速关闭。
  • nginx -s quit:等待工作进程处理完成后关闭。

配置实例说明

TCP代理实例

以下是对Nginx TCP代理配置的详细注释:

# 定义一个名为 'stream' 的上下文,用于配置TCP/UDP代理
stream {# 定义一个上游服务器组 'backend',用于存放后端服务器的信息upstream backend {# 指定上游服务器组中的一个服务器,这里是本机的12345端口server 127.0.0.1:12345; # 设置最大失败尝试次数为3次max_fails=3; # 设置失败后超时时间为30秒fail_timeout=30s;}# 定义一个服务器块,用于监听和代理TCP流量server {# 监听本地的12345端口,用于接收客户端的TCP连接listen 12345;# 设置与后端服务器建立连接的超时时间为1秒proxy_connect_timeout 1s;# 设置与后端服务器通信的超时时间为3秒proxy_timeout 3s;# 将流量代理到定义的 'backend' 上游服务器组proxy_pass backend;}
}

这段配置的主要作用是让Nginx监听本地的12345端口,并将所有接收到的TCP连接转发到本地的另一个服务上,该服务运行在12345端口上。同时,配置中还包含了对后端服务的健康检查和故障转移机制,如果后端服务连续3次无法连接,则认为该服务失败,并在30秒超时后尝试重新连接。这样可以提高代理服务的可用性和稳定性。

UDP代理实例

以下是对Nginx UDP代理配置的详细注释:

# 定义一个名为 'stream' 的上下文,用于配置TCP/UDP代理
stream {# 定义一个上游服务器组 'udp_backend',用于存放后端UDP服务器的信息upstream udp_backend {# 指定上游服务器组中的一个服务器,这里是192.168.31.51的514端口server 192.168.31.51:514;}# 定义一个服务器块,用于监听和代理UDP流量server {# 监听本地的1514端口,接收来自客户端的UDP数据包listen 1514 udp;# 将接收到的UDP流量代理到定义的 'udp_backend' 上游服务器组proxy_pass udp_backend;}
}

说明:

  1. stream:这是一个上下文块,专门用于配置TCP和UDP的流量代理。与HTTP上下文不同,stream上下文处理的是原始的网络流量。

  2. upstream udp_backend:定义一个名为udp_backend的上游服务器组,里面包含了后端UDP服务器的信息。在这个例子中,只有一个服务器。

  3. server 192.168.31.51:514:指定上游服务器的IP地址和端口号。在这里,Nginx将把接收到的UDP数据包转发到192.168.31.51的514端口。

  4. server:定义一个服务器块,用于处理UDP流量的监听和代理。

  5. listen 1514 udp:Nginx将监听本地的1514端口,接收来自客户端的UDP数据包。udp关键字指示Nginx以UDP模式工作。

  6. proxy_pass udp_backend:将接收到的UDP流量代理到之前定义的udp_backend上游服务器组。Nginx会将客户端发送到1514端口的UDP数据包转发到192.168.31.51的514端口。

通过这种配置,Nginx可以作为一个UDP代理服务器,将流量转发到指定的后端服务器,适用于需要UDP协议的应用场景,例如Syslog等。

总结

通过这些配置,Nginx可以作为一个强大的TCP/UDP代理服务器,适用于多种应用场景,如数据库、邮件服务器、游戏服务器等。

http://www.lryc.cn/news/532680.html

相关文章:

  • 蓝桥杯思维训练营(三)
  • 开箱即用的.NET MAUI组件库 V-Control 发布了!
  • 动手学图神经网络(9):利用图神经网络进行节点分类 WeightsBiases
  • 【文件上传、秒传、分片上传、断点续传、重传】
  • 使用Pygame制作“打砖块”游戏
  • 【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra)
  • 深入解析:如何利用 Python 爬虫获取商品 SKU 详细信息
  • 【3】高并发导出场景下,服务器性能瓶颈优化方案-文件压缩
  • FPGA|生成jic文件固化程序到flash
  • 【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据
  • 用Python获取股票数据并实现未来收盘价的预测
  • Rust 所有权特性详解
  • Gateway路由匹配规则详解
  • 项目实操:windows批处理拉取git库和处理目录、文件
  • 前端开发知识梳理 - HTMLCSS
  • nginx中的proxy_set_header参数详解
  • MapReduce是什么?
  • Text2Sql:开启自然语言与数据库交互新时代(3030)
  • 《图解设计模式》笔记(五)一致性
  • 华为支付-免密支付接入免密代扣说明
  • React组件中的列表渲染与分隔符处理技巧
  • 【Pytorch和Keras】使用transformer库进行图像分类
  • 快速了解 c++ 异常处理 基础知识
  • deepseek API 调用-python
  • 玩转Gin框架:Golang使用Gin完成登录流程
  • Linux学习笔记16---高精度延时实验
  • vue2:如何动态控制el-form-item之间的行间距
  • deepseek从网络拓扑图生成说明文字实例
  • 两种文件类型(pdf/图片)打印A4半张纸方法
  • HTB:UnderPass[WriteUP]