问题描述:
最近公司需要使用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反向代理。