禁用 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 應用程式:

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中的連線。 沒有慢速客戶端佔用的連接

有代理緩衝時快速客戶端的吞吐量 在此輸入影像描述

相關內容