Nginx1.1.4+ 对后端机器的长连接特性

来源:互联网 发布:实战nginx 取代 编辑:程序博客网 时间:2024/05/21 19:25

转自:http://zhangxugg-163-com.iteye.com/blog/1551269

nginx upstream keepalive connections

 

Nginx从1.1.4开始,实现了对后端机器的长连接支持,这是一个激动人心的改进,这意味着Nginx与后端机器的通信效率更高,后端机器的负担更低。

 

例如,对一个没有长连接支持的后端机器,会出现大量TIME_WAIT状态的连接,使用以下命令验证之:

netstat -n | grep TIME_WAIT

 

经过查阅官方文档,其目前已经实现了http, fastcgi, memcache协议的长连接支持。而之前的版本中仅支持memcache协议。

 

1. 启用到memcache服务器的长连接
在upstream配置段中增加keepalive N指令即可:
upstream memcached_backend {

    server 127.0.0.1:11211;

    server 10.0.0.2:11211;

    keepalive 32;

}

 

server {

    ...

    location /memcached/ {

        set $memcached_key $uri;

        memcached_pass memcached_backend;

    }

}

 

 

2. 启用fastcgi长连接支持
除了需要在upstream中配置keepalive N外,还需要在location中增加fastcgi_keep_conn on;

upstream fastcgi_backend {

    server 127.0.0.1:9000;

    keepalive 8;

}

 

server {

    ...

    location /fastcgi/ {

        fastcgi_pass fastcgi_backend;

        fastcgi_keep_conn on;

        ...

    }

}

 

3. 启用对后端机器HTTP长连接支持

upstream http_backend {

    server 127.0.0.1:8080;

    keepalive 16;

}

 

server {

    ...

    location /http/ {

        proxy_pass http://http_backend;

        proxy_http_version 1.1;

        proxy_set_header Connection "";

        ...

    }

}

 

注意:需要设置nginx代理请求的http协议版本号为1.1, 以及清除掉Connection请求header, 官方文档描述:

For HTTP, the proxy_http_version directive should be set to “1.1” and the 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指令中, N的值应该尽可能设置小一些,以便后端机器可以同时接受新的连接。

 

在我负责的生产环境中,前端是nginx, 静态文件缓存使用varnish, 使用长连接之后,varnish机器的连接数从8000多下降至200多,负载值也有明显降低。

 

但是针对fastcgi, 即后端机器是php-fpm服务时,在nginx日志中出现以下错误:

 upstream sent unsupported FastCGI protocol version: 0 while reading upstream

 

广泛搜集,目前还未解决之。如果您遇到同样的问题并解决之,请一定联系笔者信箱zhangxugg@163.com, 甚是感谢。


0 0
原创粉丝点击