禁用 Nginx 的代理缓冲不会同步响应

禁用 Nginx 的代理缓冲不会同步响应

我对禁用 Nginx 的代理缓冲的理解是,应用服务器将等待客户端响应而不是 Nginx,所以我应该看到许多打开的连接,但在我的测试中并非如此。

设置:

client (10.2.0.7) <===> Nginx (10.2.0.5) <===> PythonApp (10.2.0.4, port 8000)

500 个客户端发起的慢速连接 slowhttptest -c 500 -H -g -o my_header_stats -i 10 -r 50 -t GET -u http://pythonapp.com -x 24 -p 3

Nginx 配置:

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

events
{
    worker_connections 768;
    # multi_accept on;
}

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 TLSv1.3; # 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;
    upstream pythonapp
    {
        server 10.2.0.4:8000;
    }

    proxy_buffering off;
    server
    {
        listen 80;
        proxy_buffering off;
        server_name pythonapp.com;

        location /
        {
            proxy_buffering off;
            proxy_pass http://pythonapp;
        }
    }

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

只能看到 1 个来自 Nginx 的打开连接 仅 1 个打开的连接

如果我直接启动从客户端到 PythonApp 服务器的慢速连接,我可以看到许多打开的连接设置:

client (10.2.0.7) <===> PythonApp (10.2.0.4, port 8000)

500 个客户端发起的慢速连接 slowhttptest -c 500 -H -g -o my_header_stats -i 10 -r 50 -t GET -u http://10.2.0.4:8000 -x 24 -p 3 在此处输入图片描述

我的问题是

  1. 为什么我的应用服务器在 Nginx 反向代理后没有很多打开的连接?
  2. 如果我的设置不正确,您能否提供明确的代码和配置示例来设置相应的环境,以显示启用远程缓冲和禁用远程缓冲之间的性能或吞吐量差异?

答案1

最后,我终于搞清楚了如何测试启用/禁用代理缓冲的吞吐量差异。我认为slowtest这不是一个好的测试工具。我使用了工作量

我的新设置:

Slow client (10.2.0.7) \
                        \
                        Nginx (10.2.0.5) <===> PythonApp (10.2.0.4, port 8000)
                       /
                      /
Fast client (10.2.0.6)

你可以参考这个数字海洋指南设置 Flask 应用 Python App:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "<h1 style='color:blue'>Hello There!</h1>"

@app.route("/big-file")
def big_file():
    return "<h1 style='color:blue'>" + "Hello There!"*1000000 + "</h1>"

if __name__ == "__main__":
    app.run(host='0.0.0.0')

客户端速度慢:

# modprobe ifb
# ip link set dev ifb0 up
# tc qdisc add dev eth0 ingress
# tc filter add dev eth0 parent ffff: \
protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ifb0
# tc qdisc add dev ifb0 root netem delay 750ms

在快速和慢速客户端上运行 wrk 测试:

客户端速度慢:

# wrk -t4 -c10 -d30  http://pythonapp.com/big-file

快速客户端:

# wrk -t2 -c100 -d10 http://pythonapp.com

对于慢速客户端来说,访问 /big-file 路径是必然的,这将返回相当大的响应。如果响应小于代理缓冲区大小,Nginx 和代理服务器之间的连接将很快关闭,并且您无法模拟阻塞。

Nginx 中无 proxy_buffering 时慢客户端占用的连接数 & 快客户端的吞吐量: 慢速客户端占用的连接

无代理缓冲时的快速客户端的吞吐量 无代理缓冲的快速客户端测试结果

如果有proxy_buffering,则不会看到慢客户端占用的连接数,可以先运行慢客户端的命令下载慢响应,然后再检查Nginx中的连接数。 没有被慢速客户端占用的连接

存在代理缓冲时快速客户端的吞吐量 在此处输入图片描述

相关内容