유닉스 도메인 소켓(Unix Domain Socket) 이란?

Unix domain socket(이하 UDS) IPC socket (inter-process communication socket) 이라고도 하며 TCP의 소켓과 동일한 API 로 데이타를 주고 받을 수 있는 local file 기반의 소켓입니다.

TCP socket 과 차이점은 local host 의 process 간의 통신이므로 속도가 매우 빠르고 메모리 소모가 적다는 장점이 있습니다.


UDS 를 사용할때 또 하나의 장점은 socket 을 생성할 때 sockaddr_un 이라는 구조체를 사용하는것 외에는 일반적인 소켓을 다루는 것과 동일하므로 UDS 로 구성해 놓은 후에 성능이나 보안상의 문제로 서버를 클라이언트와 분리하기가 매우 용이하다는 점입니다.


UDS 의 대표적인 사용 예로는 MySQL DBMS 의 socket 입니다.

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock


또 PHP의 WAS 인 PHP-FPM 도 UDS 를 지원하므로 다음과 같이 listen 구문에서 UDS 를 사용할지 TCP 소켓을 사용할지 설정할수 있습니다.

## Unix Domain socket 사용
listen = /var/opt/remi/php80/run/php-fpm/www.sock
## TCP socket 사용
# listen = 9000


UDS 확인

ls -l 옵션으로 UDS 를 지정하면 맨 앞에 s 가 붙는 것을 확인할 수 있습니다.

$ ls -l /var/lib/mysql/mysql.sock

srwxrwxrwx. 1 mysql mysql 0 Jul 19 10:20 /var/lib/mysql/mysql.sock

여기서 s 는 socket 을 의미하며 file type 을 알려주는 file 명령어를 사용해도 socket 타입으로 표시합니다.

$ file /var/lib/mysql/mysql.sock 
                       
/var/lib/mysql/mysql.sock: socket


lsof 명령어를 -U 옵션을 주고 실행하면 시스템의 전체 유닉스 도메인 소켓 목록을 확인할 수 있습니다.

$  lsof -U 

COMMAND      PID           USER   FD   TYPE             DEVICE SIZE/OFF    NODE NAME
systemd        1           root   15u  unix 0xffff9b9f575fbf00      0t0     164 /run/systemd/private type=STREAM
systemd        1           root   17u  unix 0xffff9b9fb1acf980      0t0 1573299 /run/systemd/journal/stdout type=STREAM
systemd        1           root   46u  unix 0xffff9b9f58366780      0t0   20542 type=DGRAM
systemd        1           root   63u  unix 0xffff9ba0e8266300      0t0   33828 type=STREAM
systemd        1           root   83u  unix 0xffff9b9f56470900      0t0   16877 /run/systemd/notify type=DGRAM
systemd        1           root   84u  unix 0xffff9b9f56476780      0t0   16879 /run/systemd/cgroups-agent type=DGRAM
systemd        1           root   85u  unix 0xffff9b9f56473a80      0t0   16881 type=DGRAM
systemd        1           root   86u  unix 0xffff9b9f56473f00      0t0   16882 type=DGRAM
systemd        1           root   91u  unix 0xffff9b9f565a6300      0t0   24191 /run/libvirt/libvirt-admin-sock type=STREAM




같이 보기


Ref