序言
一網友在群中問,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個交流群,我們一起學習探討。