Nginx如何实现 TCP和UDP代理?

news2025/2/7 17:10:57
文章目录
  • 前言
    • 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.coloradmin.cn/o/2294389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尝试在Excel里调用硅基流动上的免费大语言模型

我个人觉得通过api而不是直接浏览器客户端聊天调用大语言模型是使用人工智能大模型的一个相对进阶的阶段。 于是就尝试了一下。我用的是老师木 袁进辉博士新创的硅基流动云上的免费的大模型。——虽然自己获赠了不少免费token,但测试阶段用不上。 具体步骤如下&am…

SqlSugar简单使用之Nuget包封装-Easy.SqlSugar.Core

SqlSugar官方文档 Nuget包开源地址 Nuget包是为了简化SqlSugar的使用步骤,增加一些基础的使用封装 引入分为两个版本,一个Ioc模式,另一个是注入模式,如果不想影响原本的仓储代码推荐使用Ioc模式,两者区别不到,方法通…

Linux网络 | 理解NATPT, 数据链路层Done

前言:本节内容结束数据链路层, 本节的重要内容有两个:一个是见一个综合性面试题,另一个就是NAT技术NATPT。 那么废话不多说, 开始我们的学习吧!!! ps:最好先看一下上一篇…

微信小程序~django Petting pets(爱抚宠物)小程序

博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

UE (标识符, meta=())笔记

视频连接: [UFSH2024]UE5(标识符, meta(详解, 史上最全)) | 大钊 Epic Games 虚幻社区经理 参考文档: UE5标识符详解 | 史上最全 UnrealSpecifiers | UE5标识符详解 GitHub 老外整理的标识符文档 标识符 CPP_Default_ParamName(18:22&a…

并发编程 引用类型 原子类 Stamped和Markable atomicMarkableReference表单Ref和标记Markable 面试题

目录 Stamped 和 Markable 的区别 示例代码 所以这个东西是一次性的 从来没听说过 从来没见过 Stamped 和 Markable 的区别 标记号 boolean 一次性的 版本号 整型数 不建议用 Markable 解决 ABA 问题 AtomicMarkableReference 是一个位于 java.util.concurrent.atomic 包中…

绿联NAS安装cpolar内网穿透工具实现无公网IP远程访问教程

文章目录 前言1. 开启ssh服务2. ssh连接3. 安装cpolar内网穿透4. 配置绿联NAS公网地址 前言 本文主要介绍如何在绿联NAS中使用ssh远程连接后,使用一行代码快速安装cpolar内网穿透工具,轻松实现随时随地远程访问本地内网中的绿联NAS,无需公网…

【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题

【Ubuntu】ARM交叉编译开发环境解决“没有那个文件或目录”问题 零、起因 最近在使用Ubuntu虚拟机编译ARM程序,解压ARM的GCC后想要启动,报“没有那个文件或目录”,但是文件确实存在,环境配置也检查过了没问题,本文记…

微信小程序~电器维修系统小程序

博主介绍:✌程序猿徐师兄、8年大厂程序员经历。全网粉丝15w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

android 适配 api 35(android 15) 遇到的问题

首先升级 targetSdkVersion 和 compileSdkVersion 到 35,升级后发生的报错 一、 解决方案: 升级 gradle 和 gradle 插件版本 com.android.tools.build:gradle -> 8.3.0-alpha02 gradle-wrapper.properties : distributionUrl -> gradle-8.6-bin.zip htt…

Python Pandas(3):DataFrame

1 介绍 DataFrame 是 Pandas 中的另一个核心数据结构,类似于一个二维的表格或数据库中的数据表。它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由…

Mac电脑上好用的压缩软件

在Mac电脑上,有许多优秀的压缩软件可供选择,这些软件不仅支持多种压缩格式,还提供了便捷的操作体验和强大的功能。以下是几款被广泛推荐的压缩软件: BetterZip 功能特点:BetterZip 是一款功能强大的压缩和解压缩工具&a…

BUUCTF_XSS-Lab

xss XSS(Cross - Site Scripting)即跨站脚本攻击,是一种常见的 Web 安全漏洞。攻击者通过在目标网站注入恶意脚本(通常是 JavaScript),当其他用户访问该网站时,这些恶意脚本会在用户的浏览器中执…

新能源算力战争:为什么AI大模型需要绿色数据中心?

新能源算力战争:为什么AI大模型需要绿色数据中心? 近年来,人工智能(AI)大模型的爆发式增长正在重塑全球科技产业的格局。以GPT-4、Gemini、Llama等为代表的千亿参数级模型,不仅需要海量数据训练,更依赖庞大的算力支撑。然而,这种算力的背后隐藏着一个日益严峻的挑战——…

go gin配置air

一、依赖下载 安装最新,且在你工作区下进行安装,我的是D:/GO是我的工作区,所有项目都在目录下的src, go install github.com/air-verse/airlatest 如果出现类似报错: 将图中第三行 github.com/air-verse/air 替换最…

【C语言系列】深入理解指针(5)

深入理解指针(5) 一、sizeof和strlen的对比1.1sizeof1.2strlen1.3sizeof和strlen的对比 二、数组和指针笔试题解析2.1 一维数组2.2 字符数组2.2.1代码1:2.2.2代码2:2.2.3代码3:2.2.4代码4:2.2.5代码5&#…

JVM图文入门

往期推荐 【已解决】redisCache注解失效,没写cacheConfig_com.howbuy.cachemanagement.client.redisclient#incr-CSDN博客 【已解决】OSS配置问题_keyuewenhua.oss-cn-beijing.aliyuncs-CSDN博客 【排坑】云服务器docker部署前后端分离项目域名解析OSS-CSDN博客 微服…

使用 Ollama 在腾讯云服务器环境部署 DeepSeek 大模型实战指南

文章目录 前言Ollama核心特性 实战步骤安装 Ollama验证安装结果部署 DeepSeek 模型拉取模型启动模型 交互体验命令行对话调用 REST API 总结个人简介 前言 近年来,大语言模型(LLM)的应用逐渐成为技术热点,而 DeepSeek 作为国产开…

C++ 学习:深入理解 Linux 系统中的冯诺依曼架构

一、引言 冯诺依曼架构是现代计算机系统的基础,它的提出为计算机的发展奠定了理论基础。在学习 C 和 Linux 系统时,理解冯诺依曼架构有助于我们更好地理解程序是如何在计算机中运行的,包括程序的存储、执行和资源管理。这对于编写高效、可靠…

网络安全 | 零信任架构:重构安全防线的未来趋势

网络安全 | 零信任架构:重构安全防线的未来趋势 一、前言二、零信任架构的核心概念与原理2.1 核心概念2.2 原理 三、零信任架构的关键技术组件3.1 身份管理与认证系统3.2 授权与访问控制系统3.3 网络与安全监测系统3.4 加密与数据保护技术 四、零信任架构与传统安全…