使用nginx作为websocket的proxy server

news/2024/7/7 12:17:22

blog.csdn.net/zhx6044/article/details/50278765

WebSocket

WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择。其为HTML5的一部分,WebSocket相较于原来开发这类app的方法来说,其能使开发更加地简单。大部分现在的浏览器都支持WebSocket,比如Firefox,IE,Chrome,Safari,Opera,并且越来越多的服务器框架现在也同样支持WebSocket。

在实际的生产环境中,要求多个WebSocket服务器必须具有高性能和高可用,那么WebSocket协议就需要一个负载均衡层,NGINX从1.3开始支持WebSocket,其可以作为一个反向代理和为WebSocket程序做负载均衡。

WebSocket协议不同于HTTP协议,但是WebSocket握手是通过HTTP来完成的,使用HTTP的Upgrade设施来升级连接从HTTP到WebSocket。这个允许WebSocket程序能够更简单地融入现有的基础设施。比如,WebSocket程序可以使用80和443标准的HTTP端口,从而允许使用存在的防火墙策略。

一个WebSocket程序持有一个长时间运行的在客户端和服务器端之间打开的连接,促进实时应用程序的开发(这个翻译有问题)。被用来升级连接从HTTP到WebSocket的HTTP Upgrade机制使用Upgrade和Connection头部来完成。在反向代理服务器支持WebSocket中,需要面临一些挑战。第一个是WebSocket是一个hop-by-hop协议,所以当代理服务器拦截来至于客服端的一个Upgrade请求时,代理服务器需要发送它自己的Upgrade请求给后端服务器,包括一些合适的头部。同样,因为WebSocket是长时间存活,相反的,HTTP连接是典型的短连接,反向代理服务器必须允许这些连接保持打开,而不是在它们看起来闲置时关闭它们。

nginx

NGINX通过允许一个在客户端和后端服务器之间建立的隧道来支持WebSocket。为了NGINX发送来至于客户端Upgrade请求到后端服务器,Upgrade和Connection头部必须被设置明确。

示例,这个例子在我前面文章中使用过–chatRobot。上次是客户端直接连的express程序,这里我们使用nginx来做代理。

 
 upstream wsbackend {
        server 127.0.0.1:3000;
    }

    server {
        listen       8090;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        # location / {
        #    root   html;
        #    index  index.html index.htm;
        # }

        location / {
            proxy_pass http://wsbackend;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    }

 

我们将qt程序中的链接改一下

 
const char* server_url = "ws://localhost:8090";

 

我们的chatRobot还是一样的可以运行。
这里写图片描述

其实这只是一个简单地接合nginx和nodejs的例子。
这里我总结了几点我们为什么把nginx放在前面的。

  • nodejs适合做为restful api接口和动态的页面生成,虽然也有静态资源托管模块,但是会大幅度影响nodejs的性能,但是nginx适合处理静态资源。所以让它们做自己擅长的事。
  • 安全,直接在外网暴露nodejs会有很大的风险。
  • 卸HTTPS,nginx与客户端连接加密,后端的nodejs和nginx处于内网环境下,可以不加密,这样省去了nodejs卸https的负载。
  • nginx作为反向代理和负载均衡,方便后台nodejs的横向扩展。

使用nginx是为了更好地使用nodejs来提供服务。


http://www.niftyadmin.cn/n/1999122.html

相关文章

命名管道例子

Server: // CNamedPipeClientView 消息处理程序voidCNamedPipeClientView::OnNamedpipeConnect(){ // TODO: Add your command handler code hereif (!WaitNamedPipe("//./pipe/mypipe", NMPWAIT_WAIT_FOREVER)) { MessageBox("there is no usable…

mysql 全文索引 使用_MySql全文索引

使用索引是数据库性能优化的必备技能之一。在MySQL数据库中,有四种索引:聚集索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FULLTEXT INDEX)。全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用「分词技术「等多…

php 数组排序 按照某字段

$arr[array(name>小坏龙,age>28),array(name>小坏龙2,age>14),array(name>小坏龙3,age>59),array(name>小坏龙4,age>23),array(name>小坏龙5,age>23),array(name>小坏龙6,age>21),];array_multisort(array_column($arr,age),SORT_DESC,$ar…

给同学的第一次工作的一封信

小伟、小杰、阿刚:你们好!看到你们对工作的热情真的好让我感动。这让我想到了去年和前年时暑假的我。满怀着激情和憧憬去找工作,去努力的发展自己,强大自己。这种感觉真好!开始工作是件很好的事情,是人生的…

mysql如何刷新内存_MySQL-脏页的刷新机制

MySQL内存结构-缓冲区MySQL的缓冲区中有数据页,索引页,插入缓冲等等,这个角度是从页的功能来分类的。本小节从另一个视角关注这些页,如果从 是否被修改过(和磁盘不一致) 这个角度来区分这些页,那么页可以被分为干净的页…

Android开发搭建环境所需要的各种包,不断更新中。。。

封装好的用于开发Android的ADT Bundle:32位版:adt-bundle-windows-x86-20140702.zip请添加链接描述(百度网盘) 64位版:adt-bundle-windows-x86_64-20140702.zip请添加链接描述(Google 地址) 提供了很多Android开发相关…

vc的dll基本用法

vc的dll基本用法 因为要用vc的dll,所以今天做了一些试验,还是有几点记录一下: 一.设置:1.预处理设置:如果有如下错误unexpected end of file while looking for precompiled header directive可以禁止预处理&#…

mysql 周处理_mysql按年度、季度、月度、周、日SQL统计查询mysql没有提供unix时间戳的专门处理函数【转】...

源地址:http://www.educity.cn/wenda/399779.htmlmysql 按年度、季度、月度、周、日SQL统计查询mysql没有提供unix时间戳的专门处理函数,所以,如果遇到时间分组,而你用的又是整型unix时间戳,则只有转化为mysql的其他日…