memcached: соединение отклоняется с других машин
В дистрибутивных сборках memcached слушает только петлевой интерфейс — и это правильно по умолчанию: у него нет аутентификации. Доступ с других машин требует осознанной настройки и защиты.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служба слушает только петлевой интерфейс
Параметр привязки задан в файле настроек. Со стороны других машин соединение отклоняется сразу.
-
Порт закрыт брандмауэром
Служба слушает нужный адрес, но правила не пропускают соединения.
-
Служба не запущена или упала
Отказ соединения означает и это тоже. Проверять состояние стоит первым делом.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
На каком адресе слушает служба.
sudo ss -tlnp | grep 11211Действующие ключи запуска.
grep -vE "^#|^$" /etc/memcached.confОтвечает ли служба локально.
echo stats | timeout 3 nc 127.0.0.1 11211 | head -5Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Параметр привязки задан в файле настроек. Со стороны других машин соединение отклоняется сразу.
- Как проверить
-
Посмотрите адрес прослушивания.
sudo ss -tlnp | grep 11211 grep -E "^-l|^-p" /etc/memcached.conf
- Как исправить
- Если доступ по сети действительно нужен, привяжите службу к внутреннему адресу и закройте порт снаружи брандмауэром. Открывать кеш в интернет нельзя: он без аутентификации.
- Почему происходит
- Служба слушает нужный адрес, но правила не пропускают соединения.
- Как проверить
-
Проверьте доступность порта с клиента.
timeout 3 bash -c "</dev/tcp/сервер/11211" && echo открыт || echo закрыт
- Как исправить
- Разрешите порт только для адресов серверов приложений, а не для всех.
- Почему происходит
- Отказ соединения означает и это тоже. Проверять состояние стоит первым делом.
- Как проверить
-
Посмотрите состояние службы.
systemctl status memcached --no-pager | head -6
- Как исправить
- Запустите службу и разберитесь с причиной остановки по её журналу.
Пример вывода
Кеш слушает только петлевой интерфейс. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ sudo ss -tlnp | grep 11211
LISTEN 0 1024 127.0.0.1:11211 0.0.0.0:* users:(("memcached",pid=1200,fd=26))
app@web2[4100]: error: dial tcp <адрес>:11211: connect: connection refused
Связанные ошибки
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Cannot assign requested address при привязке Ошибка 99 при привязке: адрес не принадлежит машине или ещё не поднят. Разбор с network-online.target и ip_nonlocal_bind.
- Address already in use при запуске службы Порт или адрес уже занят: bind() failed (98: Address already in use). Как найти владельца порта и что делать с остатками прежнего процесса.
- Automount: каталог монтируется не вовремя или отваливается Автомонтирование через .automount: как работает TimeoutIdleSec, почему ресурс отваливается и когда лучше обычный .mount.
- Broken pipe в журнале службы Запись в закрытый канал или соединение: клиент отключился, обработчик завершился, конвейер разорван.
- Connection reset by peer в журнале службы Соединение сброшено другой стороной: обрыв клиента, перезапуск сервера, промежуточное устройство.
- Connection timed out в журнале службы Соединение не устанавливается по таймауту: пакеты отбрасываются, узел недоступен, перегружен сервер на другой стороне.
- Docker: имена не разрешаются внутри контейнера Контейнеры не разрешают имена: конфликт с локальным разрешателем, неверные серверы в daemon.json, отключённый проброс.
Где встречается чаще всего
Источники
- Документация memcached: настройка сети
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на memcached из пакетов Ubuntu: по умолчанию слушает только петлевой интерфейс.