设为首页 收藏本站
查看: 3335|回复: 0

[经验分享] Nginx支持Socket转发过程详解

[复制链接]

尚未签到

发表于 2018-11-10 09:50:32 | 显示全部楼层 |阅读模式
序言
  一网友在群中问,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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-633128-1-1.html 上篇帖子: nginx-1.14.0 使用 下篇帖子: docker安装nginx-IT菜鸟
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表