UNIX Domain Sockets: что это и как использовать
UNIX Domain Sockets (UDS) — это механизм обмена данными между процессами внутри одной машины. В отличие от TCP/UDP сокетов, они не используют сетевой стек, что делает их быстрее и безопаснее.
Основные характеристики
- Работают только на локальном хосте.
- Используют файловую систему для адресации (например,
/var/run/docker.sock
). - Поддерживают как потоковый (аналог TCP), так и датаграммный (аналог UDP) режим.
- Обеспечивают более высокую производительность по сравнению с TCP на localhost.
Где применяются
- Docker и Podman: управление контейнерами через сокет
/var/run/docker.sock
. - PostgreSQL: локальное подключение через UDS быстрее, чем TCP
localhost:5432
. - Nginx/HAProxy: проксирование трафика через UDS вместо TCP.
- gRPC: поддержка UDS для сервисов в пределах одной ноды.
Пример: сервер и клиент на Python
Сервер
import socket
import os
SOCKET_FILE = "/tmp/uds_demo.sock"
if os.path.exists(SOCKET_FILE):
os.remove(SOCKET_FILE)
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
server.bind(SOCKET_FILE)
server.listen(1)
print("Сервер ждёт соединений...")
conn, _ = server.accept()
print("Клиент подключен")
while True:
data = conn.recv(1024)
if not data:
break
print("Получено:", data.decode())
conn.sendall(b"Echo: " + data)
conn.close()
Клиент
import socket
client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client.connect("/tmp/uds_example.sock")
client.sendall(b"Hello via UDS")
Практическое применение в DevOps
- Использовать UDS для сервисов, которые общаются только внутри сервера, чтобы снизить накладные расходы TCP.
- Повысить безопасность: доступ можно ограничить правами на файл-сокет.
- Упростить конфигурацию прокси (например, nginx -> app.sock).
Вывод
UNIX Domain Sockets — это быстрый и безопасный способ межпроцессного взаимодействия на одной машине. Для DevOps и разработчиков это отличный инструмент, если нужно оптимизировать локальные коммуникации сервисов.