Nginx(三)支持Socket转发过程详解



看到眼前那束光了么? 再往前一步会看着更明亮

介绍

nginx支持socket转发吗?

实话说,我没做过socket转发,但是我知道socket跟http一样都是通过tcp或者udp通信的,我猜测啦一下nginx应该支持吧,然后又在网上查啦一下,网上说支持,也有支持的相关官方文档,且有理有据,于是我秉承不瞎扯,知之为知之的科学态度,我只对网友回啦两个字:“可以”.

前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。如下:

服务端:
在这里插入图片描述

客户端
在这里插入图片描述

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

发布了106 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_32060101/article/details/103578122