SebWeo.com
У нашій подорожі світом сокетів ми почали з “верхнього поверху” — WebSocket у браузері, потім спустилися до фундаменту інтернету — TCP/IP сокетів. Але є ще один, особливий вид сокетів, який живе глибоко в надрах вашого сервера і про який часто забувають.
Ви, напевно, бачили у конфігах Nginx або MySQL дивні шляхи, що закінчуються на .sock, наприклад, /var/run/php/php8.2-fpm.sock. Це не картинка, не текстовий файл і не папка. Це — Unix Domain Socket (UDS). У цій статті я розповім, чому ці “файли” є секретною зброєю для прискорення локальної комунікації.
Щоб зрозуміти різницю між TCP-сокетом і Unix-сокетом, уявімо офіс.
Unix-сокет — це стандартний механізм міжпроцесної взаємодії (IPC) в POSIX-сумісних системах (Linux, macOS). На відміну від мережевих сокетів, які використовують IP-адреси та порти, Unix-сокети використовують файлову систему як адресний простір.
Ось чому вони швидші:
Це одна з головних переваг. Оскільки Unix-сокет відображається як файл у файловій системі, до нього застосовуються стандартні права доступу Linux (chmod, chown).
Наприклад, якщо у вас є файл сокета бази даних /tmp/mysql.sock, ви можете налаштувати права так, що тільки користувач www-data (ваш веб-сервер) зможе в нього писати. Будь-який інший користувач на сервері навіть не зможе спробувати підключитися до бази. З TCP-портом (наприклад, 3306) це зробити складніше — він відкритий для всіх на localhost.
Це класика. У моїй статті про FastCGI ми налаштовували зв’язок між веб-сервером і PHP. Ви можете зробити це двома способами:
| Метод | Конфігурація Nginx | Коли використовувати |
|---|---|---|
| TCP Сокет | fastcgi_pass 127.0.0.1:9000; | Якщо Nginx і PHP-FPM на різних серверах (розподілена архітектура). |
| Unix Сокет | fastcgi_pass unix:/var/run/php/php-fpm.sock; | Якщо вони на одному сервері. Дає приріст продуктивності. |
Ви коли-небудь замислювалися, як Docker CLI спілкується з самим Docker двигуном? За замовчуванням це відбувається через Unix-сокет /var/run/docker.sock. Саме тому, щоб запустити Docker без sudo, вам потрібно додати користувача в групу, яка має права на цей файл-сокет.
Якщо ваш сайт підключається до бази даних на тому ж сервері (“localhost“), використання сокета (localhost:/tmp/mysql.sock) буде швидшим, ніж підключення через TCP (127.0.0.1:3306).
Давайте створимо сервер, який слухає не порт, а файл. Зверніть увагу на використання socket.AF_UNIX замість AF_INET.
import socket
import os
socket_path = "/tmp/demo_socket.sock"
# Переконаємося, що файл сокета не існує
if os.path.exists(socket_path):
os.remove(socket_path)
# Створюємо Unix-сокет (AF_UNIX)
server = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
# Прив'язуємо до файлу
server.bind(socket_path)
# Слухаємо
server.listen(1)
print(f"Слухаю на {socket_path}")
while True:
connection, client_address = server.accept()
try:
print("З'єднання встановлено!")
data = connection.recv(1024)
print(f"Отримано: {data.decode()}")
connection.sendall(b"Hello from Unix Socket!")
finally:
connection.close()
Клієнт для такого сервера виглядає майже так само, тільки замість IP та порту він підключається до шляху файлу:
client = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
client.connect("/tmp/demo_socket.sock")
client.sendall(b"Hello Server!")
Unix Domain Sockets — це незамінний інструмент для оптимізації високопродуктивних систем. Вони прибирають зайвих посередників у спілкуванні програм на одному комп’ютері.
Якщо ваші сервіси (веб-сервер, база даних, кеш) живуть на одній машині, завжди надавайте перевагу Unix-сокетам перед TCP. Це безкоштовний і простий спосіб знизити затримки (latency) та навантаження на процесор.
У попередній статті ми говорили про WebSockets — технологію, що дозволяє створювати інтерактивні чати в…
Шкіра немовляти – тонка та ніжна. Ще не справляється із захистом організму від зовнішніх факторів.…
Уявіть собі телефонну розмову. Ви дзвоните другу, він піднімає слухавку, і ви можете говорити одночасно,…
Довгий час планшети сприймалися виключно як пристрої для споживання контенту: подивитися YouTube, погортати стрічку новин…
Ви внесли правки в CSS, виправили критичний баг у JavaScript, завантажили файли на сервер і…
Уявіть, що ви щоранку приходите в одну й ту ж кав'ярню і питаєте баристу: "Які…