유닉스 도메인 소켓(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