Nginx】面试官问我Nginx能不能装备WebSocket?我给他现场演示了一番!!

写在前面

当今互联网领域,不管是APP仍是H5,不管是微信端仍是小程序,只要是一款x ? ~ Y C R像样点的产品,为了增加用户的交互感和用户粘度,多多少少都会涉及到谈天功用。而关于Web端与H5来说,完成谈天最简略的便是使用WebSocket了。而在完成WebSocket谈天的过程中,后台也往往会部署多个WebSocket服务,多个WebSocket服务之间,能够经过Nginx进行负载均衡。今日,咱们就来一同说说Nginx是怎么装备WebSocket的。

Ngi. ) b ~ n |nx装备[ * ` / , Y u 2WebSocket

Nginx装备WebSx d l gocket也比较简略,只需要在nginx.conf文件中进行相应的装备。这种方式很简略,可是很有效,能够# f z v横向扩展WebSocket服务端的服务才能。

先直接展现装备文件,如下所示(使用的话直接仿制,然后改改ipE n R w 3 w T和port即可)

map $http_upgrade $connection_upgradc t & + K s - * 5e {
default upgrade;
'' close;
}
upstrea V Q y 3 b b - Hm wsbackend{
server ip1:port1;
server ip2:poC p 5 v f b P - {rt2;
keepalive 1000;
}
server {
listen 2a j  v ] ^ % - K0038i | 1  ;
location /{
proxy_http_version 1.1;
proxy_pass http://wsbackend;
proxy_redirect off;
proxy_set_header HosC p = ( i dt $host;
proxy_set_hQ P G n b b s $ feader X-Real-IP $remote_addr;
pr8 ^ { Koxy_read_timeout 3600s;
proP v j o qxy_set_header X-Forwarded-For $proxy_add_xt R L _ ` p_forwarded_for;
proxy_set_header Up[ / C f F , B _grade $http_upgrade;
proxy_set_header Connectioj Z , 8n $connection_upgrade;
}
}

接下来,咱们就分别剖析上述装备的具体含义。

首要:

map $http_upgrade $connection_upgrade {
defaui V (  T f H O Elt upgrade;
'' close;
}

表明的是:

  • 假如G ^ e $http_upgrade 不为 2 8 U Z'' (空),则 $connection_upg6 k c j m P = s brade 为 upgrade 。
  • 假如 $p C xhttp_upgrade 为 V j , a { S X R r'[ G u' (空),则 $connection_upgrade 为 close。

其次:

upstream wsbackend{
server ip1:po7  s p ? p Prt1;W B v Y
server ip2:port2;
kee z a / ^ ) T &palive 1000;
}

表明的是 nginx负载均衡:

  • 两台服务器 (ip1:G I , & pport1)和(ip2:port2) 。
  • keepalive 1000 表明的是每个nginx进程中上游服务器坚持的闲暇衔接,当闲暇衔接过多时,会关闭最少使用的闲暇v F ) k v [衔接.当然,这不是限制衔接总数的,能够幻想成闲暇衔接池的大小,设置的值应该是上游服务器能够接受的。

最后:

server {
listen 20038;
location /{
proxy_http_version 1.1;
p] j U 0 R | ` o )roxy_pass httpp p I Q://wsbackend;
proxy_redire` * H T 6 Vct off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_read_timeout 3600s;
proxy_set_he= u T & @ader X-Forwarded-For $prox} A M T ! * z 9 +y_add_x_forwarded_for;
proxy_set_header Upgrade $http_upE k e @grade;
proxy_set_hear : 6 ] W fder Connection $connection_upgrade;
}
}

表明的是监听的服务器的装备

  • listen 20038 表S q _明 nginx 监听的端口
  • locations / 表明监听的途径(/表明一切途径,通用匹配,相当于defaul4 - a 8 [ Ut)
  • proxt_http_version 1.1 表明反向代理发送的3 + E i Z Y 0 1HTTP协议的版本是1.1,HTTP1.1支持长衔接
  • proxy_pass httpF ) e o $ } 5://wsbackend; 表明反向代理的uri,这儿能够使用负载均衡变量
  • proxy_redirect off; 表明不要替换途径,其实这儿假如是/则有没有都没关系,因为default也是将途径替换到proxy_pass的后边
  • Host $host; 表明传递时恳求头不变, $host是nginx内置变量,表明的是当p ; L Q } a * C时的恳求头,proxy_set_header表明设置恳求头
  • proxY p |y_set_header X-Real-IP $O v Xremote_addr; 表明传递时来源的ip仍是现在的客户端的ip
  • proxy_read_timeout 3600s; 表的两次恳求之间的间隔超过 3600s 后才关闭这个衔接,默认的60s,自动关闭的首恶
  • proxy_set_header X-i N O . o # i 0 :Forwarded-For $proxy_add% k J A S { |_x_forwarded_for; 表明X-Forwarded-For头不发生改变
  • proxy_set_header Upgrade $http_upgrade; 表明设置I R % C p - &Upgrade不变
  • proxy_set_header Connection $connection_upgrade; 表明假如 $http_upgrade为upgrade,则恳求为upgrade(websocket),假如不是J I , S I,就关闭衔接

好了,今日就聊到这儿吧!别忘了点个赞,给个在看和转发,让更多的人看到,一同学习,一同进步!!

写在最后

假如你觉得冰河写的还不错,请微信Q 3 H 3 ] W ^搜索并关注「 冰河技能 」微信大众号,跟冰河学习高并发、分布式、微服务、大数据、互联网和云原生技能,「 冰河技能 」微信大众号更新了很多技能K 3 ( { ) o专题,每一篇技能文章干货满满!不少读者现已经过阅览「 冰河技能 」微信? X # o V 1 B K 1大众号文章,成功? + 0 w = j跳槽到大厂;也有不少读者完成了技能上的腾跃,成为公司的技I C a J u x h 1能骨干!假如你也想像他们相同提高自己的才能,完成技能才能的腾跃,进大厂,升职加薪,那就关注「 冰河技能 」微信大众号吧,每天更新超硬核技能干货,让r c r ] P你对怎么提高技能才能不再苍茫v V ` ; ] ;

【Nginx】面试官问我Nginx能不能配置WebSocket?我给他现场演示了一番!!