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代理
工作原理
- 配置:首先需要在Nginx的配置文件中设置TCP/UDP代理的相关参数,例如监听的端口、后端服务器的地址和端口等。
- 监听:Nginx根据配置文件中的设置,在指定端口上监听来自客户端的连接请求。
- 连接:当接收到客户端的连接请求后,Nginx会立即尝试与后端服务器建立连接。
- 数据转发:建立连接后,Nginx将客户端发送的数据转发给后端服务器,并将后端服务器的响应数据转发回客户端。
- 保持连接:Nginx支持长连接和短连接,根据实际需求保持或关闭与客户端及后端服务器的连接。
- 安全和优化: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;}
}
说明:
-
stream:这是一个上下文块,专门用于配置TCP和UDP的流量代理。与HTTP上下文不同,stream上下文处理的是原始的网络流量。
-
upstream udp_backend:定义一个名为
udp_backend
的上游服务器组,里面包含了后端UDP服务器的信息。在这个例子中,只有一个服务器。 -
server 192.168.31.51:514:指定上游服务器的IP地址和端口号。在这里,Nginx将把接收到的UDP数据包转发到192.168.31.51的514端口。
-
server:定义一个服务器块,用于处理UDP流量的监听和代理。
-
listen 1514 udp:Nginx将监听本地的1514端口,接收来自客户端的UDP数据包。
udp
关键字指示Nginx以UDP模式工作。 -
proxy_pass udp_backend:将接收到的UDP流量代理到之前定义的
udp_backend
上游服务器组。Nginx会将客户端发送到1514端口的UDP数据包转发到192.168.31.51的514端口。
通过这种配置,Nginx可以作为一个UDP代理服务器,将流量转发到指定的后端服务器,适用于需要UDP协议的应用场景,例如Syslog等。
总结
通过这些配置,Nginx可以作为一个强大的TCP/UDP代理服务器,适用于多种应用场景,如数据库、邮件服务器、游戏服务器等。
相关文章:
Nginx如何实现 TCP和UDP代理?
文章目录 前言 Nginx之TCP和UDP代理 工作原理示意图 配置文件和命令参数注释 基本命令 配置实例说明 TCP代理实例UDP代理实例 总结 前言 Nginx是一个高性能的HTTP和反向代理服务器,同时也支持TCP/UDP代理。在1.9.13版本后,Nginx已经支持端口转发&…...

蓝桥杯思维训练营(三)
文章目录 题目详解680.验证回文串 II30.魔塔游戏徒步旅行中的补给问题观光景点组合得分问题 题目详解 680.验证回文串 II 680.验证回文串 II 思路分析:这个题目的关键就是,按照正常来判断对应位置是否相等,如果不相等,那么就判…...

开箱即用的.NET MAUI组件库 V-Control 发布了!
之前写过挺多的MAUI Sample,其中有很多代码可以打包成组件,当组件完善到一定程度,我会把控件封装起来放到控件库中。 今天,在这个仓库建立一年零八个月后,我觉得可以考虑将其作为开源库发布。 有很多网友在观望.NET …...

动手学图神经网络(9):利用图神经网络进行节点分类 WeightsBiases
利用图神经网络进行节点分类Weights&Biases 引言 在本篇博客中,将深入探讨如何使用图神经网络(GNNs)来完成节点分类任务。以 Cora 数据集为例,该数据集是一个引用网络,节点代表文档,推断每个文档的类别。同时,使用 Weights & Biases(W&B)来跟踪实验过程和…...
【文件上传、秒传、分片上传、断点续传、重传】
文章目录 获取文件对象文件上传(秒传、分片上传、断点续传、重传)优化 获取文件对象 input标签的onchange方法接收到的参数就是用户上传的所有文件 <html lang"en"><head><title>文件上传</title><style>#inp…...

使用Pygame制作“打砖块”游戏
1. 前言 打砖块(Breakout / Arkanoid) 是一款经典街机游戏,玩家控制一个可左右移动的挡板,接住并反弹球,击碎屏幕上方的砖块。随着砖块被击碎,不仅能获得分数,还可以体验到不断加速或复杂的反弹…...

【完整版】DeepSeek-R1大模型学习笔记(架构、训练、Infra)
文章目录 0 DeepSeek系列总览1 模型架构设计基本参数专家混合模型(MoE)[DeepSeek-V2提出, DeepSeek-V3改良]多头潜在注意力(MLA)[DeepSeek-V2提出]多token预测(MTP)[DeepSeek-V3提出] 2 DeepSeek-R1-Zero及…...
深入解析:如何利用 Python 爬虫获取商品 SKU 详细信息
在电商领域,SKU(Stock Keeping Unit,库存单位)详细信息是电商运营的核心数据之一。它不仅包含了商品的规格、价格、库存等关键信息,还直接影响到库存管理、价格策略和市场分析等多个方面。本文将详细介绍如何利用 Pyth…...
【3】高并发导出场景下,服务器性能瓶颈优化方案-文件压缩
使用EasyExcel导出并压缩文件是一种高效且常见的解决方案,尤其适用于需要处理大量数据的场景。 1. 导出多个Excel文件并压缩成ZIP文件的基本流程 (1)数据准备:从数据库或其他数据源获取需要导出的数据,并将其存储在Ja…...

FPGA|生成jic文件固化程序到flash
1、单击file-》convert programming files 2、flie type中选中jic文件,configuration decive里根据自己的硬件选择,单击flash loader选择右边的add device选项 3、选择自己的硬件,单击ok 4、选中sof选项,单机右侧的add file 5、选…...

【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据
说明: 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy(好几年前的文章),从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy,需要注意不同版本对应的arcpy函数是存在差异的 数据准备:准备一…...

用Python获取股票数据并实现未来收盘价的预测
获取数据 先用下面这段代码获取上证指数的历史数据,得到的csv文件数据,为后面训练模型用的 import akshare as ak import pandas as pd# 获取上证指数历史数据 df ak.stock_zh_index_daily(symbol"sh000001")# 将数据保存到本地CSV文件 df.…...

Rust 所有权特性详解
Rust 所有权特性详解 Rust 的所有权系统是其内存安全的核心机制之一。通过所有权规则,Rust 在编译时避免了常见的内存错误(如空指针、数据竞争等)。本文将从堆内存与栈内存、所有权规则、变量作用域、String 类型、内存分配、所有权移动、Cl…...
Gateway路由匹配规则详解
在微服务架构中,Gateway作为请求的入口,扮演着至关重要的角色。它不仅负责路由转发,还具备安全、监控、限流等多种功能。其中,路由匹配规则是Gateway的核心功能之一,它决定了请求如何被正确地转发到目标服务。本文将详…...
项目实操:windows批处理拉取git库和处理目录、文件
初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 源码指引:github源…...
前端开发知识梳理 - HTMLCSS
1. 盒模型 由内容区(content)、内边距(padding)、边框(border)和外边距(margin)组成。 (1)标准盒模型(box-sizing默认值, content-boxÿ…...
nginx中的proxy_set_header参数详解
在使用 Nginx 作为反向代理服务器时,proxy_set_header 指令扮演着至关重要的角色。它允许我们自定义请求头信息,将客户端请求传递给上游服务器时,添加或修改特定的信息,从而实现更灵活的代理功能。本文将深入探讨 proxy_set_heade…...
MapReduce是什么?
MapReduce 是一种编程模型,最初由 Google 提出,旨在处理大规模数据集。它是分布式计算的一个重要概念,通常用于处理海量数据并进行并行计算。MapReduce的基本思想是将计算任务分解为两个阶段:Map 阶段和 Reduce 阶段。 Map 阶段&a…...

Text2Sql:开启自然语言与数据库交互新时代(3030)
一、Text2Sql 简介 在当今数字化时代,数据处理和分析的需求日益增长。对于众多非技术专业人员而言,数据库操作的复杂性常常成为他们获取所需信息的障碍。而 Text2Sql 技术的出现,为这一问题提供了有效的解决方案。 Text2Sql,即文…...

《图解设计模式》笔记(五)一致性
十一、Composite模式:容器与内容的一致性 像文件夹与文件一样,文件夹中可以放子文件夹与文件,再比如容器中可以放更小的容器和具体内容。 Composite模式:使容器与内容具有一致性,创造出递归结构。 Composite&#x…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...

Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

链式法则中 复合函数的推导路径 多变量“信息传递路径”
非常好,我们将之前关于偏导数链式法则中不能“约掉”偏导符号的问题,统一使用 二重复合函数: z f ( u ( x , y ) , v ( x , y ) ) \boxed{z f(u(x,y),\ v(x,y))} zf(u(x,y), v(x,y)) 来全面说明。我们会展示其全微分形式(偏导…...