Всё оказалось довольно просто, хотя и не очевидно. Раз уж используем nginx, можно применить его магию, верно? Заодно не придется каждый раз отключать замедлитель для внешних ресурсов.
Фрагмент nginx.conf:
http {
server {
listen 8080;
limit_rate 1M;
}
}
stream {
server {
listen 80;
proxy_upload_rate 1M;
proxy_pass 127.0.0.1:8080;
}
}
Показаны только строки, имеющие отношение к заданному вопросу. Остальное настраивается как обычно.
Основной сервер унесен на порт 8080, и там происходит вся обработка запросов.
limit_rate 1M;
— это ограничение скорости отдачи ответа клиенту, и оно срабатывает в любом случае.
Подключаемся к разрабатываемому приложению через порт 80 (если вам нужно https, то 80 заменить на 443), то есть в браузере порт не указываем — для клиента всё выглядит в точности как обычно. А nginx отправляет запрос на порт 8080 с ограничением скорости
proxy_upload_rate 1M;
. Можно, разумеется, использовать и другой подходящий свободный порт.
Если надо ограничивать скорость только в особых случаях, а обычно удобнее иметь неограниченную скорость, можно слушать в блоке stream любой свободный порт, а в блоке http продублировать server с теми же параметрами, но без
limit_rate
и с «обычным» портом.
Всё работает вполне четко. Следует здесь только заметить, что скорость указывается в байтах в секунду, а не в битах в секунду, как мы привыкли применительно к толщине канала. Можно произвольно и независимо ограничивать скорость приема и отдачи, что может быть полезно для имитации асимметричных подключений.
Способ применим не только для MacOS, будет работать в любой системе, если вы используете nginx.