Nginx循环负载平衡不符合预期

时间:2019-03-20 09:36:16

标签: nginx nginx-reverse-proxy nginx-config

我们正在连接到一个系统,其中有4个端口可以满足grpc请求。使用nginx作为负载均衡器,使用以下配置转发4个客户端grpc请求:

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

http {
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent"';

    map $http_upgrade $connection_upgrade {
        default upgrade;
        ''      close;
    }
    upstream backend{
        #least_conn;
        server localhost:9000 weight=1 max_conns=1;
        server localhost:9001 weight=1 max_conns=1;
        server localhost:9002 weight=1 max_conns=1;
        server localhost:9003 weight=1 max_conns=1;
        }

    server {
        listen 80 http2;

        access_log /tmp/access.log main;
        error_log /tmp/error.log error;

        proxy_buffering off;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Scheme $scheme;
        proxy_set_header Host $http_host;

        location / {
                #eepalive_timeout 0;
                grpc_pass grpc://backend;
                grpc_pass_header userid;
                grpc_pass_header transid;
        }
    }
}

观察到,几乎所有客户端4请求都访问所有4个端口,但是有时(例如30%)仅访问2个端口/ 3个端口。 NGINX似乎没有发生默认的轮询机制。我们尝试了所有可能性,例如max_conns,最少_conn,重量但没有运气。

好像我在以下链接中遇到了这个问题:

https://serverfault.com/questions/895116/nginx-round-robin-nor-exactly-round-robin
https://stackoverflow.com/questions/40859396/how-to-test-load-balancing-in-nginx

当我浏览Quora时,发现nginx中的“ fair”模块将解决此问题。

    "The Nginx fair proxy balancer enhances the standard round-robin load 
    balancer provided with Nginx so that it will track busy back end servers (e.g. Thin, Ebb, Mongrel) and balance the load to non-busy server processes. "

https://www.quora.com/What-is-the-best-way-to-get-Nginx-to-do-smart-load-balancing

我尝试从源代码中使用NGINX的“公平”模块,但是遇到了很多问题。我无法启动NGINX本身。谁能解决这个问题?

2 个答案:

答案 0 :(得分:0)

我们得到了答案!!!!刚刚更改为“ worker_processes自动;”到“ worker_processes 1;”现在,它工作正常。

所有请求均已正确负载均衡。在这里,我们觉得如果您使用的不是单个工作程序,则多个工作程序可能会将请求发送到同一端口。

答案 1 :(得分:0)

我不知道为什么会这样,但这可能与浏览器有关。 我在使用浏览器发送请求时遇到了同样的问题。当我使用curl从终端发送请求时,它运行正常。