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(""));
sck.Bind(endPoint);
sck.Listen();
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(""));
clientSocket.Connect(endpoint);
thread = new Thread(ReceMsg);
thread.IsBackground = true;
thread.Start();
Console.WriteLine("");
Console.ReadKey();
}
static void ReceMsg()
{
while (true)
{
byte[] buffer = new byte[ * * ];
clientSocket.Receive(buffer);
string ReceiveMsg = System.Text.Encoding.UTF8.GetString(buffer).Substring(,);
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个交流群,我们一起学习探讨。
Nginx支持Socket转发过程详解的更多相关文章
- Nginx搭建反向代理服务器过程详解
一.反向代理:Web服务器的“经纪人” 1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从 ...
- Nginx 搭建反向代理服务器过程详解
1.1 反向代理初印象 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet ...
- 【转】Nginx搭建反向代理服务器过程详解
阅读目录 1.1 反向代理初印象 1.2 反向代理的作用 2.1 Nginx是神马? 2.2 Nginx的应用现状 2.3 Nginx的核心特点 3.1 准备一个ASP.NET网站部署到IIS服务器集 ...
- Nginx搭建反向代理服务器过程详解(转)
一.反向代理 我们都知道,80端口是web服务的默认端口,其他主机访问web服务器也是默认和80端口进行web交互,而一台服务器也只有一个80端口,这是约定俗成的标准. 我们来看下面两个场景: 1.服 ...
- PHP Socket 编程过程详解
使用代码 目的:开发一个客户端用于发送string消息到服务端,服务端将相同的信息反转后返回给客户端. PHP服务器 第1步:设置变量,如“主机”和“端口” $host = "127.0.0 ...
- Nginx服务器中配置非80端口的端口转发方法详解
这篇文章主要介绍了Nginx服务器中配置非80端口的端口转发方法详解,文中使用到了Nginx中的proxy_pass配置项,需要的朋友可以参考下 nginx可以很方便的配置成反向代理服务器: 1 2 ...
- Nginx核心配置文件常用参数详解
Nginx核心配置文件常用参数详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 关于Nginx权威文档的话童鞋们可以参考Nginx官方文档介绍:http://nginx.org/ ...
- Nginx的介绍和安装详解
[介绍+安装]Nginx的介绍和安装详解 == 介绍和安装 == Nginx是一个自由.开源.高性能及轻量级的HTTP服务器及反转代理服务器, 其性能与IMAP/POP3代理服务器相当.Nginx ...
- MySQL关闭过程详解和安全关闭MySQL的方法
MySQL关闭过程详解和安全关闭MySQL的方法 www.hongkevip.com 时间: -- : 阅读: 整理: 红客VIP 分享到: 红客VIP(http://www.hongkevip.co ...
随机推荐
- RACSingle 有效的两种方式
第一种当然是subscribeNext 另外还有一种就是作为Command的enablesingle也相当于被订阅了.
- 判断移动端设备: navigator.userAgent.toLowerCase()
判断你的浏览设备: navigator.userAgent.toLowerCase(); (返回当前用户所使用的是什么浏览器,将获得的信息变成小写) function browserRedirect( ...
- Mysql常用表管理语句
- origin从图中获得数据
有Origin的原图,即利用Origin的"copy page"功能直接拷贝到文字处理软件的数据图,对于这种图,双击用Origin打开后,双击要导出数据的权限,打开"pl ...
- 利用Navicat实现MySQL数据库结构对比和同步
在生产环境中,我们总会因为这样或那样的原因导致主从不同步,亦或者是测试环境要和生产环境进行同步,利用Navicat结构同步工具,不但能找出库结构差异,还可以针对create.modify.drop等进 ...
- Notification的功能与用法
Notification是显示在手机状态的通知——手机状态栏位于手机屏幕的最上方,那里一般显示了手机当前的网络状态.时间等.Notification所代表的是一种具有全局效果的通知,程序一般通过Not ...
- jQuery attr removeAttr 属性操作
jQuery attr removeAttr 属性操作 <%@ page language="java" import="java.util.*" pag ...
- 让EFCore更疯狂些的扩展类库(一):通过json文件配置sql语句
前言 EF通过linq和各种扩展方法,再加上实体模型,编写数据库的访问代码确实是优美.舒服,但是生成的sql不尽如意.性能低下,尤其是复杂些的逻辑关系,最终大家还是会回归自然,选择能够友好执行sql语 ...
- WinForm 更换主窗体的例子
做一个登录窗口,登录成功时关闭form1,展示from2界面 1.主界面Login namespace WindowsFormsApplication1 { public partial class ...
- Express与NodeJs创建服务器的两种方法
NodeJs创建Web服务器 var http = require('http'); var server = http.createServer(function(req, res) { res.w ...