유닉스 소켓을 통한 서비스 연동: 성능과 TCP 오버헤드 감소의 장점
소규모 서버에서 성능을 극대화하고 TCP 오버헤드를 줄이기 위한 방법 중 하나는 유닉스 소켓(Unix Socket)을 사용하는 것. 특히 같은 서버에서 돌아가는 PHP-FPM, Nginx, PostgreSQL, Redis 등의 서비스들이 있다면, 이들을 유닉스 소켓으로 연결하는 것이 상당한 이점이 있다.
유닉스 소켓이란?
유닉스 소켓은 로컬 프로세스 간 통신(IPC, Inter-Process Communication)을 위해 사용되는 방식으로, 같은 서버 내에서 네트워크 스택을 거치지 않고 통신할 수 있다. 반면, 일반적인 TCP 연결은 패킷을 생성하고 네트워크를 통해 데이터를 주고받기 때문에 더 많은 오버헤드가 발생한다.
유닉스 소켓의 장점
- 낮은 오버헤드: TCP 연결은 소켓을 열고, 데이터를 패킷화해 전송한 뒤 다시 패킷을 조립하는 과정을 거친다. 반면 유닉스 소켓은 이를 모두 생략하고 바로 데이터를 주고받기 때문에 빠르다.
- 보안: TCP는 네트워크를 통해 데이터가 전송되므로 방화벽이나 추가적인 보안 설정이 필요하지만, 유닉스 소켓은 로컬에서만 사용되므로 상대적으로 보안성이 높다.
- 간단한 설정: IP와 포트 번호 설정 없이 소켓 파일 경로만 지정하면 된다. 또한, 서버의 부하가 적어질수록 성능 차이가 더 두드러진다.
PHP-FPM과 Nginx 연결 예시
PHP-FPM과 Nginx는 기본적으로 TCP를 통해 통신할 수 있지만, 유닉스 소켓을 사용하면 더 효율적으로 연결할 수 있다.
1. PHP-FPM 설정
먼저 php-fpm.conf 또는 www.conf에서 유닉스 소켓을 설정할 수 있다.
[www]
listen = /var/run/php/php-fpm.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
이렇게 하면 PHP-FPM이 /var/run/php/php-fpm.sock라는 소켓 파일을 통해 Nginx와 통신하게 된다.
2. Nginx 설정
Nginx는 nginx.conf 또는 해당 가상 호스트 설정에서 다음과 같이 PHP-FPM과 유닉스 소켓으로 연결된다.
server {
listen 80;
server_name example.com;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
이렇게 설정하면 Nginx는 PHP 파일을 처리할 때 유닉스 소켓을 통해 PHP-FPM에 요청을 보낸다.
PostgreSQL과 유닉스 소켓
PostgreSQL도 유닉스 소켓을 통해 클라이언트와 연결할 수 있다. 기본적으로 PostgreSQL은 유닉스 소켓을 지원하며, 클라이언트가 로컬 서버에서 접근할 때 TCP 대신 소켓 파일을 사용하도록 설정할 수 있다.
1. PostgreSQL 설정
postgresql.conf 파일에서 소켓 파일의 위치를 지정할 수 있다.
unix_socket_directories = '/var/run/postgresql'
2. 클라이언트 연결 예시
PostgreSQL 클라이언트(예: psql)는 기본적으로 유닉스 소켓을 사용해 연결한다. 별도로 TCP 연결을 지정하지 않으면 소켓 파일을 통해 연결이 이루어진다.
psql -d mydb -h /var/run/postgresql
Redis와 유닉스 소켓
Redis 또한 유닉스 소켓을 지원하며, 소규모 환경에서 빠른 성능을 기대할 수 있다.
1. Redis 설정
redis.conf 파일에서 유닉스 소켓 경로를 지정할 수 있다.
unixsocket /var/run/redis/redis.sock
unixsocketperm 770
이렇게 설정하면 Redis 서버는 /var/run/redis/redis.sock 파일을 통해 통신을 받는다.
2. 클라이언트 연결
Redis CLI는 -s 옵션으로 소켓 파일을 지정해 연결할 수 있다.
redis-cli -s /var/run/redis/redis.sock
결론
유닉스 소켓은 같은 서버 내에서 돌아가는 서비스들 간의 통신을 더욱 효율적으로 만들어준다. PHP-FPM, Nginx, PostgreSQL, Redis 등의 서비스를 유닉스 소켓으로 연결하면 TCP 오버헤드를 줄이고, 보안성을 높이며, 성능을 향상시킬 수 있다. 소규모 서버에서 트래픽이나 부하가 크지 않다면, TCP 대신 유닉스 소켓을 적극적으로 활용해 최적화를 꾀하는 것이 좋다.