使用nginx作为websocket的proxy server

使用nginx作为websocket的proxy server

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来提供服务。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/113647.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • modbus调试工具有哪些(野火多功能调试助手)

    一种成熟的MODBUS调试测试工具助手软件(MThings)免费中文现有MODBUS调测软件种类丰富,基本可以满足日常调测需求,但是面对用户群体对高效灵活友好的进一步需求都存在着差距。MThings是一款全新的标准化MODBUS调测工具,提供主从机一体化操作。全功能覆盖MODBUSPollSlave,功能全网最强。

    2022年4月15日
  • linux yum下载_虚拟机配置yum源

    linux yum下载_虚拟机配置yum源文章目录一.软件包管理1.RPM包管理2.源码包二.软件的安装工具1.YUM工具2.RPM工具一.软件包管理1.RPM包管理Red Hat Package Manager包的命名规则:软件名,版本号,发行版本,系统平台(32/64),后缀是.rpm**特点:**二进制包,无需编译,可以直接使用**缺点:**无法设定个人设置,开关功能2.源码包特点:需要经过gcc等编译环境编译才能运行,可以设定个人设置,开关功能缺点:配置复杂二.软件的安装工具1.YUM工具Yellow dog Upd

    2022年8月9日
  • 基本图形算法指南

    基本图形算法指南

    2022年1月5日
  • latex大括号错位显示_LaTeX表格

    latex大括号错位显示_LaTeX表格amsmath中\smash妙用样例-大括号错位显示。原始大括号显示\[\text{机器学习}\begin{cases}\text{~~监督学习~}{\begin{cases}\text{回归算法}\\\text{分类算法}{\begin{cases}\text{生成模型}\\\text{判别模型}\end{cases}}

    2022年10月11日
  • opencv实现视频里人数统计「建议收藏」

    opencv实现视频里人数统计「建议收藏」基于图像的人数统计属于模式识别问题,可应用于安防领域。传统的方法包括:1)视频捕获;2)目标提取(背景建模、前景分析)——常见方法有高斯背景建模、帧差法、三帧差法等;3)目标识别(模式识别、特征点分析),如人脸识别,头肩部识别等,OpenCV里可以使用Hear特征、级联分类器来进行特征检测;4)目标跟踪——基本方法有直方图特征匹配和运动目标连续性匹配,opencv里可以使用CamShift算法直接对

    2022年6月1日
  • 背包九讲—-整理+例题[通俗易懂]

    背包九讲—-整理+例题[通俗易懂]背包九讲类型汇总:1.01背包问题2.完全背包问题3.多重背包问题4.混合背包问题5.二维费用的背包问题6.分组背包问题7.背包问题求方案数8.求背包问题的方案9.有依赖的背包问题注:以下所有题目来源于ACwing题库,链接:https://www.acwing.com/problem/这里每个类型基本都是具体题目+自己的一些体会+代码,背包九讲的理论以及解析证明之类的…

    2022年4月19日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号