Nginx支持Socket转发过程详解

序言

一网友在群中问,nginx支持socket转发吗?

实话说,我没做过socket转发,但是我知道socket跟http一样都是通过tcp或者udp通信的,我猜测啦一下nginx应该支持吧,然后又在网上查啦一下,网上说支持,也有支持的相关官方文档,且有理有据,于是我秉承不瞎扯,知之为知之的科学态度,我只对网友回啦两个字:”可以”,就不过多扯,此时群中也有网友为他解答问题啦,我就继续干我的活啦,干活,干活,干活,干活,没有过多的关注这个问题,没有过多的关注这个问题。

一小时后,半天后,半个月后,一年后 ,十年后 …

此去经年,我又来到群中:哇靠,这货竟还在执着于同样的问题,不停的问:”怎么弄,怎么弄?” !! 感觉杨过的黯然销魂掌都练成啦,这个货为什么还没有半点进展。难道他在参悟天书5卷,准备修仙成佛!

于是我就对此问题产生啦极大的兴趣,开始搞。从搞到搞到结束不过30分钟,不过30分钟,搞定,搞定。下面的篇幅我会详解整个过程。

说此段子大家勿喷我,但是我只想对群中的此类网友说:

1、你们在问怎么做之前,官方文档有见到过吗,百度过相关文章吗?

2、百度文档后,有亲自操刀过吗?想游泳不下水行吗?

3、自己操刀过程中,一旦出错,你们有没有认真对待过错误信息?

4、在解锁一门招式的时候,有没有思考过类似的招式是怎么样的?或者你来设计这个招式会是什么样子的?思考?思考?关联?关联?

话有点过分,希望能引起你的关注,如果与你不对症,绕过即可,勿喷。

前10分钟,先写一个socket的服务端与客户端可以通信

实现服务端可以向客户端发送信息,客户端接受到信息后,显示出来。用c#控制台程序实现。

服务端监听本机ip与端口,服务端代码如下:

class Program
    {
        static Socket sck = null;
        static void Main(string[] args)
        {
            sck = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //监听本机ip
            IPAddress ip = IPAddress.Parse("172.18.8.196");
            IPEndPoint endPoint = new IPEndPoint(ip, int.Parse("11911"));
            sck.Bind(endPoint);
            sck.Listen(10);
            Console.WriteLine("开启监听!");
            Thread thread = new Thread(JtSocket);
            thread.IsBackground = true;
            thread.Start();
            while (true)
            {
                var msg = Console.ReadLine().Trim();
                if (msg != "")
                {
                    byte[] buffer = System.Text.Encoding.ASCII.GetBytes(msg); //将要发送的数据,生成字节数组。
                    accSck.Send(buffer);
                    Console.WriteLine("向客户端发送了:" + msg);
                }
            }
        }
        static Socket accSck = null;
        static void JtSocket()
        {
            while (true)
            {
                accSck = sck.Accept();
                Console.WriteLine("链接成功!");
            }
        }
    }

客户端连接ip为nginx代理服务器ip,客户端如下:

class Program
    {
        static Socket clientSocket = null;
        static Thread thread = null;
        static void Main(string[] args)
        {
            clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            //这里联通nginx代理服务器地址ip
            IPAddress ip = IPAddress.Parse("172.18.8.252");
            IPEndPoint endpoint = new IPEndPoint(ip, Convert.ToInt32("11911"));
            clientSocket.Connect(endpoint);
            thread = new Thread(ReceMsg);
            thread.IsBackground = true;
            thread.Start();
            Console.WriteLine("123");
            Console.ReadKey();
        }
        static void ReceMsg()
        {
            while (true)
            {
                byte[] buffer = new byte[1024 * 1024 * 2];
                clientSocket.Receive(buffer);
                string ReceiveMsg = System.Text.Encoding.UTF8.GetString(buffer).Substring(0,30);
                Console.WriteLine("接收到数据:" + ReceiveMsg);
            }
        }
    }

中间10分钟,搭建nginx服务器

准备一台linux服务器。nginx官网:http://nginx.org/ 。在网上搜到大致用的是 ngx_stream_core_module 这个模块,这里你也可以关注一下官方文档中的其他模块都是做什么的,那么这有相关的启用配置说明,与示例配置。

第一句便是:该 ngx_stream_core_module模块是自1.9.0版本。此模块不是默认构建的,应使用配置参数启用 --with-stream

那好吧,我们就安装nginx,搞这个的,安装应该都会吧。

[root@localhost /]# cd /usr/local/src
[root@localhost src]# wget http://nginx.org/download/nginx-1.11.10.tar.gz

然后解压,解压完,根据文档提示需要使用这个参数–with-stream 来启用功能。

[root@localhost src]# ./configure  --prefix=/usr/local/nginx --with-stream

然后,make,make install。

完成之后就是nginx配置配置文件啦,这个文档中有示例,可知与events模块平级,按照这做就好啦。

worker_processes  1;
#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;
#pid        logs/nginx.pid;
events {
    worker_connections  1024;
}
stream{
    upstream abc{
        server 172.18.8.196:11911;
    }
    server{
        listen 11911;
        proxy_pass abc;
    }
}

ok,保存退出,重启nginx使配置生效即可。到这里所有的操作就都完成啦,让我们拭目以待,看下结果吧。

最后10分钟,测试nginx转发socket结果

启动服务端—>显示:开启监听—>启动客户端—-> 客户端显示:连接成功—->服务端输入:abc—–>服务端:点击回车—->客户端显示:abc。如下

Nginx支持Socket转发过程详解

至此所有的都已整个过程都已结束,功能实现。

我这里只是想抛砖引玉,勿喷!!

总结

接下来是大家最喜欢的总结内容啦,内容有二,如下:

1、希望能关注我其他的文章。

2、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,我们一起学习探讨。

Original: https://www.cnblogs.com/knowledgesea/p/6497783.html
Author: 张龙豪
Title: Nginx支持Socket转发过程详解

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/543777/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Java如何对一个对象进行深拷贝?

    深拷贝实现代码:https://github.com/wudashan/java-deep-copy 深拷贝实现代码:https://github.com/wudashan/jav…

    Java 2023年5月29日
    087
  • Spring Cloud Alibaba & Spring Cloud & Spring Boot 版本依赖关系

    https://blog.csdn.net/donglinjob/article/details/107984844 以后我们的项目选择的版本为: Spring Boot 2.2….

    Java 2023年5月30日
    079
  • [转]Nginx主动式后端服务器健康检查配置

    环境: SpringCloud微服务(eureka注册中心);nginx作为负载均衡; 场景: Nginx -> A服务当流量高峰期时,kill A服务A服务还没有挂掉,但是…

    Java 2023年5月30日
    062
  • Java压缩音频视频工具类

    /** * TODO * * @author Administrator * @version 1.0 * @date 2021/11/5 16:55 */ public clas…

    Java 2023年6月15日
    080
  • 一个基于SpringBoot + IView 的单体架构管理系统

    前言 项目基于Springboot + IView 技术构建 ,在超级工具箱的基础上做了减法,去除了一些附加影响启动的模块,变成了一个相当纯洁的后台管理系统,仅仅依赖 Redis …

    Java 2023年5月30日
    098
  • 基于hashset对中文词快速查询

    下载附件”百度分词词库”, 里面大约有10w个词, 使用C语言或者Java实现单词快速查找功能(不借助第三方类库工具或者数据库), 将单词载入内存中, 建立…

    Java 2023年6月13日
    092
  • 多线程简介

    多线程简介 程序本身是指定和数据的有序集合,其本身没有任何运行的含义,是一个静态的概念。 而 进程则是执行程序中的一次执行过程,是一个动态的概念。是系统能够资源分配的单位。 通常在…

    Java 2023年6月9日
    099
  • 背景图拉伸,填充,不平铺

    background-image: url(‘~@/static/downbg-big.png’);background-repeat: no-repeat…

    Java 2023年5月29日
    070
  • 力扣刷题之路—–链表问题

    public ListNode mergeKLists(ListNode[] lists) { if(lists.length==0) return null; ListNode …

    Java 2023年6月5日
    0149
  • java 删除字符串首尾指定字符

    package com.sankuai.dolphin.common.util; public class StringTrimUtils { /** * 删&#x9…

    Java 2023年5月29日
    0106
  • 从华为离职了

    遗憾的是,我转正后看到了大家的能力和努力,也意识到在预期的时间内难以达到我想要的高度,最终经过各方面的考虑,决定放弃这个职位,重新回到外企找回适合我的节奏。 依依不舍的离职后,回想…

    Java 2023年6月15日
    055
  • Spring MVC之@RequestParam @RequestBody @RequestHeader 等详解

    (转自:http://blog.csdn.net/walkerjong/article/details/7946109#) 引言: 接上一篇文章,对@RequestMapping进…

    Java 2023年5月30日
    068
  • Aop踩坑!记一次模板类调用注入属性为空的问题

    问题起因 在做一个需求的时候,发现原来的代码逻辑都是基于模板+泛型的设计模式,模板用于规整逻辑处理流程,泛型用来转换参数和选取实现类。听上去是不是很nice! 但是在方法调用的时候…

    Java 2023年6月5日
    093
  • / 和%的区别

    / : 就是数学中的除号,如果是小数,会取整数部分 %: 当左边的数字小于右边时,取模是左边的数字 相同是0 当左边的数字大于右边时,取的是余数 posted @2022-05-1…

    Java 2023年6月6日
    0146
  • Spring(十六):声明式事务管理

    一、什么是事务 事务就是一系列的业务逻辑的操作,必须要全部执行成功,否则每个操作所执行的内容都要撤销。 二、事务的四大特性 1.原子性(atomicity):事务虽然有一系列的操作…

    Java 2023年6月15日
    092
  • 导入导出笔记-二探EasyExcel(多sheet导出)

    前言 多sheet导出也是我们日常工作经常会碰到的一个需求场景,它既可以是复杂内容的sheet排列展示,也可以是几个小部分的内容并列展示。细心的朋友似乎已经通过上一篇博文发现了Ea…

    Java 2023年6月5日
    084
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球