Nginx & DigiSparkz
Только что собрал небольшой обратный прокси на микроконтроллере — представь, подавать статические файлы с флэш-памяти в 4 мегабайта. Что бы ты поправил в конфиге nginx, чтобы памяти занимало меньше?
Nginx:
Слушай, первое – ставь `worker_processes 1` и держи `worker_connections` небольшим, ну, типа 1024 или меньше.
Отключи `sendfile` – этим малышкам контроллерам от него пользы нет.
Забудь про `sendfile` и `tcp_nopush` – это больше для быстрой отдачи файлов, чем для 4-мегабайтного хранилища.
Полностью убери лог доступа или пиши в ротирующийся файл, который быстро удаляет старые записи.
Используй `error_log /dev/null` или хотя бы `error_log warn`.
Поставь `client_body_buffer_size` и `proxy_buffer_size` в несколько килобайт, например, `client_body_buffer_size 16k` и `proxy_buffer_size 8k`.
Сделай `keepalive_timeout` коротким, секунд 5, чтобы сокеты быстро закрывались.
Выключи `open_file_cache` и `open_file_cache_valid`.
Если ты проксируешь на upstream, используй `proxy_request_buffering off`, чтобы запросы не скапливались.
И для статических ресурсов используй `alias` вместо `root`, чтобы избежать проверок на обход каталогов.
Короче говоря: делай конфигурацию лаконичной, пиши логи минимально и дай этой маленькой прошивке работать без накладных расходов полноценного веб-сервера.
Отличный обзор. Сейчас закину это в конфиг-файл на 2 килобайта, запущу, и посмотрю, как прошивка будет справляться с буферами в 16 килобайт. Если будет тормозить, добавлю сторожевой таймер в следующую сборку и, возможно, светодиод для индикации паники. Нужны какие-то изменения для части с обратным прокси?
Послушай, убедись, что upstream определен как `server 127.0.0.1:8080;`, и задай ему небольшие значения `max_fails` и `fail_timeout`, чтобы микроконтроллер не долбил битый сервер.
Если ты используешь HTTP/1.1 keepalives, то поставь `proxy_http_version 1.1;` и `proxy_set_header Connection close;` - это закроет сокет после каждого ответа, сэкономишь память.
Если бэкенд отправляет большие куски данных, включи `proxy_buffering off;`, чтобы прокси стримил напрямую и не выделял огромный буфер.
И выкинь строки с `add_header`, которые предназначены для браузеров; каждый заголовок занимает место. Будь лаконичным. Удачи с сторожевым таймером – небольшого дополнительного таймера не повредит.
Понял, подкручу upstream-блок, добавлю короткий timeout на сбой, уберу keepalive-заголовки и буду отправлять данные потоком. Если бэкенд начнёт слать чанки по мегабайту, просто пущу их в 8-килобайтную буферную зону микроконтроллера и буду надеяться на лучшее. Помогу с настройкой этого маленького сторожевого таймера?
Nginx:
По сути, сторожевой таймер – это генератор импульсов, который подаёт сигнал сброса, если перестаёт получать "пинки".
1. Поставь на пин сброса маленький резистор подтяжки, 1-2 кОма, и соедини его с пином сброса контроллера.
2. Подключи к GPIO, который твой прошивка периодически переключает, простой 8-битный сторожевой чип, типа 74HC123.
3. Установи предделитель сторожевого таймера, скажем, на 16 мс на цикл, и загрузи его на 500 мс; если пропустишь цикл – контроллер сбросится.
4. В прошивке просто пиши один байт на пин сторожевого таймера каждые 200 мс.
Всё – никаких дополнительных чипов, минимум проводки, и у тебя есть страховка для линии на 1 МБ.