nginx可以nginx 代理长连接socket长连接么

Nginx作为一个WebSocket反向代理 - 简书
Nginx作为一个WebSocket反向代理
Nginx从Nginx1.3开始就能作为一个反向代理服务器为WebSocket应用做负载均衡了。
WebSocket协议和HTTP协议不同,但是WebSocket协议的握手是兼容于HTTP的,使用HTTP的Upgrade设施可以将连接从HTTP升级到WebSocket。
将HTTP连接升级到WebSocket连接使用到了Upgrade和ConnectionHTTP报头。
Nginx配置Upgrade和Connection报头
location /wsapp/ {
proxy_pass http://
proxy_http_version 1.1;
proxy_set_header Upgrade $http_
proxy_set_header Connection "upgrade";
反向代理服务器在支持WebSocket时面临的挑战
WebSocket是端对端的,所以当一个代理服务器从客户端拦截一个Upgrade请求,它需要去发送它自己的Upgrade请求到后端服务器,也包括合适的头。
因为WebSocket是一个长连接,不像HTTP那样是典型的短连接,所以反向代理服务器需要允许连接保持着打开,而不是在它们看起来空闲时就将它们关闭。
C/C++,Liunx,Vim,Python,Web前后端都爱折腾一点,啥也折腾不好!
金庸,古龙,温瑞安,初级武侠迷!
经常看豆瓣上的电影,看完基本不写影评!nginx支持TCP代理有什么作用
你好,想跟你请教个问题:nginx支持TCP代理有什么作用
可以通过这个模块,代理后端其它协议应用,如mysql, nosql之类的
比如你用Node.JS写了一些TCP服务,那么Nginx就可以给这些Node.JS做TCP代理,比如开启多个Node.JS监听不同的端口,经过实现负载均衡,Nginx比Haproxy的优势还在于Nginx能够提供HTTP/HTTPS服务,可以处理静态资源,或者把一些其他请求交给其他语言来处理,比如可以把一些输出HTML页面的请求fastcgi_pass给PHP-FPM处理,总而言之,Nginx更像是在做一个可扩展的Web开发系统.另外,Nginx已经支持,而移动浏览器对HTTP上的全双工通信WebSocket的支持还是不错的,只是还没有足够成熟.
比如你做一个QQ服务器、游戏服务器。
HTTP是短连接,有了这个TCP代理后,NGINX就可以保持长连接,可以做一些实时性的需求,比如推送、在线聊天?
感觉好激动。话说,nginx现在都支持什么协议的反向代理?http,https,POP3,SMTP,现在新加了TCP?还有别的吗?另外,我想问一下,能否只转发https而不再当前nginx上做校验(不指定证书,只是向上转发https全部报文)?Nginx1.1.4+ 对后端机器的长连接特性 - 老张的自言自语 - ITeye博客
博客分类:
nginx upstream keepalive connections
开始,实现了对后端机器的长连接支持,这是一个激动人心的改进,这意味着
与后端机器的通信效率更高,后端机器的负担更低。
例如,对一个没有长连接支持的后端机器,会出现大量TIME_WAIT
状态的连接,使用以下命令验证之:
netstat -n | grep TIME_WAIT
经过查阅官方文档,其目前已经实现了http, fastcgi, memcache
协议的长连接支持。而之前的版本中仅支持
服务器的长连接
在upstream
配置段中增加
keepalive N
指令即可:
upstream memcached_backend {
server 127.0.0.1:11211;
server 10.0.0.2:11211;
keepalive 32;
location /memcached/ {
set $memcached_key $
memcached_pass memcached_
启用fastcgi
长连接支持
除了需要在upstream
keepalive N
外,还需要在
fastcgi_keep_
upstream fastcgi_backend {
server 127.0.0.1:9000;
keepalive 8;
location /fastcgi/ {
fastcgi_pass fastcgi_
fastcgi_keep_
启用对后端机器HTTP
长连接支持
upstream http_backend {
server 127.0.0.1:8080;
keepalive 16;
location /http/ {
proxy_pass http://http_
proxy_http_version 1.1;
proxy_set_header Connection "";
注意:需要设置nginx
代理请求的
协议版本号为
以及清除掉
Connection
官方文档描述:
For HTTP, the proxy_http_version directive should be set to “
Connection
header field should be cleared
The connections parameter should be set low enough to allow upstream servers to process additional new incoming connections as well.
即是说:keepalive N
的值应该尽可能设置小一些,以便后端机器可以同时接受新的连接。
在我负责的生产环境中,前端是nginx,
静态文件缓存使用
使用长连接之后,
机器的连接数从
多,负载值也有明显降低。
但是针对fastcgi,
即后端机器是
服务时,在
日志中出现以下错误:
upstream sent unsupported FastCGI protocol version: 0 while reading upstream
广泛搜集,目前还未解决之。如果您遇到同样的问题并解决之,请一定联系笔者信箱,
甚是感谢。
浏览 15322
qingxianyan 写道对于redis是不是还不支持长连接呢?这个目前还未知,我也没有经过测试。需要测试验证试过没效果 所以还想向你请教确认下
对于redis是不是还不支持长连接呢?这个目前还未知,我也没有经过测试。需要测试验证
浏览: 654728 次
来自: 北京
除了 libmysql 和 mysqlnd, 在 linux
很不错的!力荐!
楼主,你好,我配置了一个负载均衡集群两台服务器,都可以启动ke ...
完全不经过脑子考虑
我直接把你的那个check_service.sh脚本放 ...17931人阅读
Node.JS(41)
Web开发(119)
Nginx担当WebSockets代理英文原文:作者:chszs,转载需注明。博客主页:WebSocket 协议提供了一种创建支持客户端和服务端实时双向通信Web应用程序的方法。作为HTML5规范的一部分,WebSockets简化了开发Web实时通信程序的难度。目前主流的浏览器都支持WebSockets,包括火狐、IE、Chrome、Safari以及Opera等,而且,越来越多的服务器应用框架也开始支持WebSockets。要在企业产品中使用WebSockets,为满足高性能和高可用性,需要多个WebSocket服务器。负载均衡层需要支持WebSocket协议。Nginx从1.3版起就开始支持WebSocket协议,而且可以担当WebSocket应用程序的反向代理以及实现负载均衡。WebSocket协议和HTTP协议不同,但是WebSocket协议的握手和HTTP是兼容的,它使用HTTP的Upgrade协议头将连接从HTTP连接升级到WebSocket连接。这个特性使得WebSocket应用程序可以很容易地应用到现有的基础设施。例如,WebSocket应用可以使用标准的80和443 HTTP端口,因此可以通过现有的防火墙设施。WebSockets应用程序会在客户端和服务器之间建立一个长连接,使得开发实时应用很容易。HTTP的Upgrade协议头机制用于将连接从HTTP连接升级到WebSocket连接,Upgrade机制使用了Upgrade协议头和Connection协议头。反向代理服务器在支持WebSocket协议方面面临着一些挑战。挑战之一是WebSocket是一个逐段转发(hop-by-hop)协议,因此当代理服务器拦截到来自客户端的Upgrade请求时,代理服务器需要将自己的Upgrade请求发送给后端服务器,包括适合的请求头。而且,由于WebSocket连接是长连接,与传统的HTTP端连接截然不同,故反向代理服务器还需要允许这些连接处于打开(Open)状态,而不能因为其空闲就关闭了连接。Nginx通过在客户端和后端服务器之间建立隧道来支持WebSockets通信。为了让Nginx可以将来自客户端的Upgrade请求发送到后端服务器,Upgrade和Connection的头信息必须被显式的设置。如下所示:location /wsapp/ {
proxy_pass http://
proxy_http_version 1.1;
proxy_set_header Upgrade $http_
proxy_set_header Connection &upgrade&;
}一旦我们完成以上设置,Nginx就可以处理WebSocket连接了。Nginx WebSockets 实例下面的例子讲述了Nginx是如何为WebSocket做代理的。此例将使用ws模块,它是基于node.js构建的WebSocket实现。Nginx将担当反向代理服务器,后端服务器是一个使用了ws和Node.js的简单WebSockets应用。例子使用的命令在Ubuntu 13.10和CentOS 6.5上测试通过,但对于其他操作系统或许需要稍作修改。就这个例子来说,WebSocket服务器的IP地址是192.168.100.10,Nginx服务器的IP地址是192.168.100.20。如果你还没有安装node.js和npm,你可以通过以下命令安装:对 Debian/Ubuntu 来说:sudo apt-get install nodejs npm对 RHEL/CentOS 来说:sudo yum install nodejs npm在Ubuntu上,node.js会被安装为&nodejs&,但在CentOS中被会安装为&node&。我们在例子中统一使用&node&,所以,我们会在Ubuntu上创建一个符号连接来允许我们使用“node”:ln -s /usr/bin/nodejs /usr/local/bin/node然后安装 ws:sudo npm install ws注意:如果你得到了一个错误:“Error: failed to fetch from registry: ws” ,那么运行下面的命令应该能解决这个问题:sudo npm config set registry http://registry.npmjs.org/接下来,你可以再次运行 sudo npm install wsws模块来自/root/node_modules/ws/bin/wscat,我们会为客户端使用它,但是我们需要创建一个程序来作为我们的服务器。将下面的代码保存到一个server.js文件中:console.log(&Server started&);
var Msg = '';
var WebSocketServer = require('ws').Server
, wss = new WebSocketServer({port: 8010});
wss.on('connection', function(ws) {
ws.on('message', function(message) {
console.log('Received from client: %s', message);
ws.send('Server received from client: ' + message);
});这个程序可以通过下面的命令执行:node server.js该程序会输出一条初始化消息“Server started”,之后监听8010端口,等待客户端的连接。它会处理收到的所有请求,并且将接收到的消息输出在控制台,之后向客户端返回一条包含该消息的消息。我们希望Nginx去代理客户端的请求,可以通过下面的配置实现:map $http_upgrade $connection_upgrade {
upstream websocket {
server 192.168.100.10:8010;
listen 8020;
location / {
proxy_pass http://
proxy_http_version 1.1;
proxy_set_header Upgrade $http_
proxy_set_header Connection &Upgrade&;
}上面的配置会使Nginx监听8020端口,并把任何接收到的请求转发给后端的WebSocket服务器,让后端服务器更好地处理WebSocket协议。我们可以使用wscat作为客户端来测试一下:/root/node_modules/ws/bin/wscat –connect ws://192.168.100.20:8020上面的命令会通过Nginx反向代理服务器和后端WebSocket服务器建立连接,你可以向服务器发送任意消息,然后服务器会返回一条消息。每当你在客户端发送一条消息,在后端服务器上能看到该消息的输出,之后在客户端会显示一条来自服务端的消息。这是一个交互示例:
$ node server.js
Server started
wscat –connect
ws://192.168.100.20:8020
Connected (press CTRL+C to quit)
Received from client: Hello
& Server received from client: Hello 由此我们可以看到客户端与服务器能通过Nginx反向代理建立WebSockets通信,而且消息可以持续地进行双向传输,直至客户端或服务器断开连接。为了让Nginx能正确处理WebSocket连接,只需正确地设置消息头来处理从HTTP连接升级到WebSocket连接的Upgrade请求。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:5243127次
积分:48526
积分:48526
排名:第66名
原创:778篇
转载:23篇
译文:24篇
评论:1124条
大家好,我是黑客,专门盗账号的。现在这个人的帐号被我盗了,但看这个人平时的博客空间,一直过着艰苦努力、持之以恒的技术研究生活,勤奋刻苦,积极分享,无私奉献,我被深深的感动了,这是一个纯粹的人,人品这样的高尚,希望大家看到我这条消息后,可以私聊他,多鼓励他,不缺钱的就多给他一些经济上的资助,让他再接再厉!就这样吧,我下线了,眼框湿湿的难受。
(1)(1)(5)(4)(2)(3)(10)(2)(7)(6)(5)(11)(11)(11)(11)(10)(10)(10)(10)(4)(10)(10)(1)(1)(5)(10)(3)(11)(5)(5)(5)(6)(3)(6)(7)(9)(5)(5)(5)(9)(6)(2)(6)(8)(5)(15)(9)(13)(5)(6)(11)(15)(23)(16)(10)(1)(3)(1)(3)(1)(1)(1)(3)(11)(4)(1)(1)(1)(3)(2)(1)(3)(2)(2)(1)(2)(3)(4)(4)(4)(1)(2)(5)(11)(20)(18)(13)(19)(20)(15)(10)(2)(4)(7)(4)(1)(4)(5)(4)(5)(12)(3)(12)(13)(10)(21)(29)(14)(11)(26)(8)(16)(9)(3)nginx是否适用于游戏服务器(用websocket做长连接)? - 知乎8被浏览1401分享邀请回答0添加评论分享收藏感谢收起0添加评论分享收藏感谢收起

我要回帖

更多关于 nginx 反向代理长连接 的文章

 

随机推荐