LINUX.ORG.RU

Тестовый вебсайт для воспроизведения проблем с curl-ом

 


0

1

Столкнулся с проблемой с curl-ом, написал багрепорт. Мне предложили попытаться воспроизвести баг с патченным curl-ом. Проблема в том, что для воспроизведения файл должен качаться, условно говоря, с минуту. Сайт, на котором я обнаружил проблему, за это время успел совсем сдохнуть. Большинство вебсайтов сейчас работают быстро и не любят, когда в них долбятся curl-ом и прочими самопальными качалками.

Вопрос: какой самый простой способ поднять локальный HTTP-сервер с урезанной до предела скоростью скачивания (GET) и поддержкой докачки? Например, умеет ли так идущий в комплекте с Python http.server? Или есть реальный сайт, который удовлетворяет этим требованиям?

P.S. Poorconn не поддерживает докачку.

★★★★★

Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от One

Nginx - limit_rate

Что для этого нужно? Просто поставить пакет Nginx и запустить его из командной строки с нужными параметрами? Gentoo.

P.S. И какая разница между ngnix и ngnix-unit?

question4 ★★★★★
() автор топика
Последнее исправление: question4 (всего исправлений: 1)
Ответ на: комментарий от question4

А Docker есть? Там легко можно будет накатить образ с nginx и что угодно ещё. И не надо это будет в систему тащить.

th3m3 ★★★★★
()
Ответ на: комментарий от One

Как nginx запускать без рута? Как задать лог, pid-файл и прочее?

$ nginx --error-log-path=./error_log --pid-path=./nginx.pid --lock-path=./nginx.lock
nginx: invalid option: "-"

Хотя

$ nginx -V
nginx version: nginx/1.26.3
built with OpenSSL 3.3.3 11 Feb 2025
TLS SNI support enabled
configure arguments: --prefix=/usr --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error_log --pid-path=/run/nginx/nginx.pid --lock-path=/run/lock/nginx.lock --with-cc-opt=-I/usr/include --with-ld-opt=-L/usr/lib64 --http-log-path=/var/log/nginx/access_log --http-client-body-temp-path=/var/lib/nginx/tmp/client --http-proxy-temp-path=/var/lib/nginx/tmp/proxy --http-fastcgi-temp-path=/var/lib/nginx/tmp/fastcgi --http-scgi-temp-path=/var/lib/nginx/tmp/scgi --http-uwsgi-temp-path=/var/lib/nginx/tmp/uwsgi --with-compat --with-http_v2_module --with-pcre --without-pcre2 --with-threads --with-http_realip_module --with-http_ssl_module --without-stream_access_module --without-stream_geo_module --without-stream_limit_conn_module --without-stream_map_module --without-stream_return_module --without-stream_split_clients_module --without-stream_upstream_hash_module --without-stream_upstream_least_conn_module --without-stream_upstream_zone_module --without-mail_imap_module --without-mail_pop3_module --without-mail_smtp_module --user=nginx --group=nginx

Или для этого надо бинарник пересобирать?

question4 ★★★★★
() автор топика

Подыми контейнер с nginx (docker, lxc) и прокинь туда конфиг файл с рейт лимитом как писали выше.

skyman ★★★★
()
Ответ на: комментарий от th3m3

Зато надо докер тащить уж лучше чистый nginx

anonymous
()
Ответ на: комментарий от question4

Не забанит, всем пофиг. Максимум отдаст 401/403 непосредственно самому curl, если не хватит какого-нибудь заголовка

KivApple ★★★★★
()

Кстати, скачай просто какой-нибудь дистрибутив Linux. Установочные ISO с полным окружением весят 3-4 ГБ. Чтобы оно скачалось за минуту нужен канал 500 МБит/сек и выше. А если хорошо поискать, можно и 7-8 ГБ ISO найти, а это уже гигабит. Но даже если у тебя гигабит, не каждый сервер отдаёт на такой скорости (тем более что популярные дистрибутивы качаешь не только ты в один и тот же момент времени). Плюс можно выбрать какое-нибудь зачуханное зеркало.

Ещё можно занизить свою скорость связи подключившись к wifi 2.4ггц вместо 5, раздав мобильный интернет на комп, войдя под VPN и т д.

При этом ссылки на скачку дистрибутивов как правило curl-friendly, потому что их часто качают скриптами. Ну и как они тебя забанят, там даже учеток нет.

KivApple ★★★★★
()
Последнее исправление: KivApple (всего исправлений: 1)
Ответ на: комментарий от question4

Как nginx запускать без рута?

Так же как и с рутом - запуском его бинарника.

Как задать лог, pid-файл и прочее?

Обычно в комплекте с установленным nginx-ом есть дефолтный конфиг для примера - исправь в нём что нужно. Ну и, поскольку у тебя сложности в «не рутом», на всякий случай уточню: чтобы редактировать конфиг от нерута, его надо сначала скопировать из /etc себе в $HOME, а потом nginx-у указать в командной строке новый путь к нему. А вообще https://nginx.org/ru/docs/

firkax ★★★★★
()
Последнее исправление: firkax (всего исправлений: 1)

для воспроизведения файл должен качаться, условно говоря, с минуту
с урезанной до предела скоростью скачивания

Ну нагенери себе dd файл любого размера и качай хоть сутки

slowpony ★★★★★
()
Последнее исправление: slowpony (всего исправлений: 1)
Ответ на: комментарий от KivApple

Не забанит, всем пофиг. Максимум отдаст 401/403 непосредственно самому curl, если не хватит какого-нибудь заголовка

Или 403 для всех запросов из подсети на несколько часов/дней/недель.

question4 ★★★★★
() автор топика

thttpd поддерживает http range, м.б. он подойдет?

anonymous
()

можно замедлить сеть через модуль netem (CONFIG_NET_SCH_NETEM).
Но если нужно только HTTP, то я бы настроил ограничения через Squid proxy.

MirandaUser2
()

я делал медленный интернет для определенных пользователей с помощью squid и настройкой delay pools.

jura12 ★★
()

Итог: nginx позволяет задавать среднюю скорость до 1 байта в секунду, но файлы отдаёт порциями по 4096 байт, и первый кусок отдаёт мгновенно. (Заголовки по запросу HEAD отдаёт по 2 строки, выждав положенное время.) В моём случае этого было достаточно.

Чтобы запускать nginx под непривилегированным пользователем, надо было в конфиге (не уверен, что всё перечисленное необходимо):

  1. Закомментировать user nginx nginx;
  2. Добавить pid /home/tkzv/curl-test/pid;
  3. Сменить порт дефолтного сервера: listen 127.0.0.1:8000;
  4. Сменить пути ко всем логам и временным файлам:
error_log /home/tkzv/curl-test/error_log info;
...
http {
...
        server {
...
               access_log /home/tkzv/curl-test/localhost.access_log main;
               error_log /home/tkzv/curl-test/localhost.error_log info;
               root /home/tkzv/curl-test;
...
  1. Добавить в http { } пути, которых нет в дефолтном конфиге:
client_body_temp_path /home/tkzv/curl-test;
fastcgi_temp_path /home/tkzv/curl-test;
proxy_temp_path /home/tkzv/curl-test;
scgi_temp_path /home/tkzv/curl-test;
userid_path /home/tkzv/curl-test;
uwsgi_temp_path /home/tkzv/curl-test;
  1. Ограничить скорость в http { }: limit_rate 20;

Запускать командой: nginx -c /home/tkzv/curl-test/nginx.conf -e /home/tkzv/curl-test/error_log
Обновить конфиг: nginx -c /home/tkzv/curl-test/nginx.conf -e /home/tkzv/curl-test/error_log -s reload
Остановить: nginx -c /home/tkzv/curl-test/nginx.conf -e /home/tkzv/curl-test/error_log -s stop

question4 ★★★★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.