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 и разработчиков это отличный инструмент, если нужно оптимизировать локальные коммуникации сервисов.