使用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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 跟我一起复制一款基于ESP-Drone无人机控制板[通俗易懂]

    跟我一起复制一款基于ESP-Drone无人机控制板[通俗易懂]1、ESP-Drone无人机项目简介ESP无人机是基于ESPRESIFESP32/ESP32-S2Wi-Fi芯片的开源解决方案,可通过Wi-Fi连接到手机应用程序或游戏控制台。ESP无人机具有简单的硬件、清晰和可扩展的代码体系结构,因此该项目可用作为STEAM(科学、技术、工程、数学)的教育平台或其它的控制领域。它的主要代码从CrazyFle开源项目移植而来,采用了GPL3.0协议。关于ESP-Drone更多的信息,请访问:https://hub.fastgit.org/espressi

    2022年8月15日
    2
  • docker常用命令详解_linux入门基础

    docker常用命令详解_linux入门基础Docker 基础命令

    2022年4月22日
    47
  • .apk反编译_apk反编译教程

    .apk反编译_apk反编译教程原文作者:[color=blue][b]lpohvbe[/b][/color]原文地址:[url]http://blog.csdn.net/lpohvbe/article/details/7981386[/url]本人接触不久,有错误望请各位神牛不吝赐教,仅仅希望把自己这段时间研究的东西分享一下,如果可以帮助到有需要的童鞋万感荣幸。欢迎评论转载,但请加上转载来源谢谢!请尊重开发者劳动成果!…

    2022年9月15日
    0
  • Linux下FTP的安装和登陆

    Linux下FTP的安装和登陆

    2021年10月19日
    34
  • 零拷贝详解_深拷贝和浅拷贝如何实现

    零拷贝详解_深拷贝和浅拷贝如何实现一、概念1、用户态与内核态⽤户态和内核态是操作系统的两种运⾏状态。(1)内核态:处于内核态的CPU可以访问任意的数据,包括外围设备,⽐如⽹卡、硬盘等,处于内核态的CPU可以从⼀个程序切换到另外⼀个程序,并且占⽤CPU不会发⽣抢占情况,⼀般处于特权级0的状态我们称之为内核态。(2)⽤户态:处于⽤户态的CPU只能受限的访问内存,并且不允许访问外围设备,⽤户态下的CPU不允许独占,也就是说CPU能够被其他程序获取。注意:1)为什么要有⽤户态和内核态呢?  这个主要是访问能⼒的限制

    2022年9月13日
    0
  • GoLand 2021.7.20 激活码【永久激活】

    (GoLand 2021.7.20 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月20日
    71

发表回复

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

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