Nginx支持Socket轉發過程詳解


最近老大讓我想辦法讓一個取號平台服務器在宕機時切換到備用服務器,自然想到了用nginx,當然nginx主要是支持http請求的,我們平台是用socket的,但nginx也是支持socket,轉載以下文章。

轉自:https://www.cnblogs.com/knowledgesea/p/6497783.html

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

服務端:客戶端:

至此所有的都已整個過程都已結束,功能實現。

我這里只是想拋磚引玉,勿噴!!

總結

接下來是大家最喜歡的總結內容啦,內容有二,如下:

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

2、博客里面有沒有很清楚的說明白,或者你有更好的方式,那么歡迎加入左上方的2個交流群,我們一起學習探討。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM