如何使 NGINX 负载平衡服务器不代理请求?

如何使 NGINX 负载平衡服务器不代理请求?

我找不到该问题的解决方案,所以这是我的问题。

假设我有 3 台服务器,其中 2 台是上游服务器,1 台是负载均衡器。

这是我的基本配置

上游服务器

user www-data;
worker_processes auto;
pid /run/nginx.pid;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
    ssl_prefer_server_ciphers on;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    gzip on;
    gzip_disable "msie6";

    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;
}

负载均衡器

worker_processes  auto;

worker_rlimit_nofile 100000;

error_log off;

events {
    worker_connections  5000;
    multi_accept on;
    use epoll;
}


http {
    upstream myapp1 {
        server 138.197.122.195;
        server 138.197.122.293;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
            proxy_set_header X-Real-IP  $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_set_header Host $host;
        }
    }
}

我想要实现的是使用 nginx 的循环负载平衡功能将用户的请求发送/重定向到上游服务器。然后上游将直接向用户提供内容。

负载均衡器在这里的作用不是通过代理减少上游的负载,而是平等地向它们分配请求。但是,使用这些配置,所有请求和响应都将通过负载均衡器,消耗其带宽。还有其他方法可以使用 NGINX 轮询重定向请求吗?请帮忙。

我之所以要这样做,是因为对于一个像样的负载均衡器来说,带宽有限(成本高),因此无法有效扩展。例如,假设 3 台服务器每台有 100mbps 的带宽,如果一个用户消耗 1mbps,那么如果有 101 个用户,负载均衡器就会成为瓶颈。如果我可以将流量平均分配给两个上游,那么理论上系统最多可以为 200 个用户提供服务。

在大多数类似主题中,我发现人们使用循环 DNS 方法。我测试了它,但它并不可靠,因为 DNS 层次结构本身中有记录缓存,以及客户端地址缓存和重用。

答案1

你有点搞错了。轮询是一种负载平衡方法。你希望实现的是所谓的DNS 循环

但即使在这里,您可以在链接上看到,您的流量也会通过负载均衡器,因为这就是重点。您可以尝试不使用负载均衡器,只安装两台服务器,但您必须为它们的两个 IP 地址设置完全相同的域名。虽然这可以实现您想要的效果,但对您没有任何好处,因为它有可能在访问过程中丢失用户会话并由另一台服务器拾取。到目前为止,我们还没有讨论数据库复制,这也是本例中的一个问题。

我的建议是多投资一点负载均衡器服务器带宽,这样你就不会遇到任何问题。甚至,我会使用,这样Session persistence你的用户就会一直停留在他们加入的服务器上。

Nginx 作为负载均衡器

相关内容