
Насколько я понимаю, при отключенной буферизации прокси-сервера 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
Если я инициирую медленные соединения от клиента к серверу 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
Мои вопросы:
- Почему на моем сервере приложений не так много открытых соединений после того, как Nginx выполняет обратное проксирование?
- Если мои настройки неверны, можете ли вы предоставить явный пример кода и конфигурации для настройки соответствующей среды, чтобы продемонстрировать разницу в производительности или пропускной способности между включенной и отключенной удаленной буферизацией?
решение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.
Пропускная способность быстрых клиентов при наличии прокси-буферизации