Отключение буферизации прокси-сервера 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 и проксированным сервером будет закрыто очень быстро, и вы не сможете имитировать блокировку.

Подключения, занятые медленными клиентами при отсутствии proxy_buffering в Nginx, и пропускная способность быстрых клиентов: Соединения заняты медленными клиентами

Пропускная способность быстрых клиентов при отсутствии прокси-буферизации Результат теста быстрого клиента без буферизации прокси

Если есть proxy_buffering, вы не увидите соединений, занятых медленными клиентами. Вы можете запустить команды для медленных клиентов, чтобы сначала загрузить медленный ответ, а затем проверить соединения в Nginx. Никаких занятых соединений медленными клиентами

Пропускная способность быстрых клиентов при наличии прокси-буферизации введите описание изображения здесь

Связанный контент