问题描述:
最近公司需要使用nginx做nodejs的反向代理,upstream 大致配置如下:
upstream nodejs { ip_hash; server 192.168.12.10:1088; server 192.168.12.11:1088; }
最近监控发现nginx+nodejs做的webservice接口有些失败率,查看nginx错误日志发现了问题,有大量的no live upstreams while connecting to upstream的错误。
个人理解,这个错误应该是upstream里的2台node都连不上。
后来经过查阅网上相关文档发现:
是因为nodejs的http server不支持url中有空格的(未编码),这种请求进来,对于nginx来说,就是后端的node不可用,
而上面的upstream没有配max_fails,一次就被标记为失败了,这个时候后面跟着的同一nginx进程上的请求就会no live upstreams,
从错误日志也可以看出,每次no live upstreams while connecting to upstream错误都是紧跟在2条upstream prematurely closed connection while reading response header from upstream错误后的,
而后者这个错误都是由于url里有未编码的空格引起的。
解决办法:
1.调大max_fails,调低fail_timeout,不过这个方法不彻底也不会推荐哦!
2.最好是别用http建server,用tcp反向代理或者websocket,虽然这个问题是因为url不规范,但是没法限制用户要这么传,而且即使不规范也不能造成问题。
下面将简单介绍一下websocket反向代理的配置
http{#Add to nginx.conf http section map $http_upgrade $connection_upgrade { default upgrade; '' close; }upstream nodejs { ip_hash; server 192.168.12.10:1088; server 192.168.12.11:1088; }server { listen 8888; server_name www.icesr.com; index index.html index.htm index.jsp index.php; location / { proxy_pass http://nodejs; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_redirect off; #proxy_buffers 8 32k; #proxy_buffer_size 64k; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; proxy_set_header X-NginX-Proxy true; } }}
以上配置即可实现nginx websocket反向代理。