Ubuntu에서 WebRTC 서버 세팅하기

Seung Hyeon ·2025년 12월 27일

HOW TO

목록 보기
9/13
post-thumbnail

기존에 운영하던 RTC 서버가 노후화되면서 검사 도중 서버가 다운되는 현상이 잦아졌다. 따라서 새로운 서버 2대를 임대했는데, RTC 서버를 직접 세팅하게 되어서 해당 과정을 기록용으로 남기고자 한다.


※ sudo 권한으로 실행해야한다.

sudo su -



0️⃣ 시스템 설치

최신 패키지로 업데이트

sudo apt update && sudo apt upgrade -y
sudo apt install -y build-essential git curl wget vim

limits.conf 파일 업데이트 (서버의 각 유저들이 열 수 있는 최대 파일 개수를 업데이트한다)
/etc/security/limits.conf 파일의 맨 아래에 다음과 같은 내용을 추가한다.

* soft nofile 1048576
* hard nofile 1048576
  • "서버의 각 유저들이 열 수 있는 파일 개수를 1024개에서 1048576개로 늘린다."
  • 저장 후 ulimit -a 으로 확인

만약 초기 설정값인 1024를 그대로 사용하면, 동시 접속자가 많아질 경우 "too many open files" 에러가 발생할 수 있다.
그렇다고 max값(1048576)으로 무조건 크게 늘리는 것도 좋은 선택은 아니다.

프로세스가 백그라운드로 실행될 때, 시작 단계에서 열려 있을 수 있는 파일들을 정리하는 작업을 수행한다.
이때 nofile 값만큼 반복하면서 close()를 호출하는데, 값이 1000만이라면 프로세스가 시작될 때마다 close()를 1000만번 호출하게 된다

close(3)
close(4)
close(5)
...
close(10000000)  // nofile이 천만이면 여기까지

실제로 열린 파일은 몇 개 되지 않지만, "혹시 몰라서" 1000만번을 전부 확인하는 셈이다. 따라서 프로세스 시작이 1~2초 느려질 수 있다

참고: https://lunatine.net/2014/05/28/limits-conf-nofile-big-value-effect/


sysctl.conf 파일 업데이트 (시스템의 전체적인 설정 값을 넣어주는 작업이다)
/etc/sysctl.conf 파일에 다음과 같은 내용을 추가한다.

fs.file-max                = 2097152
net.core.somaxconn         = 65535
net.core.netdev_max_backlog= 8192
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.rmem_max          = 8388608
net.core.wmem_max          = 8388608
net.core.optmem_max        = 262144
net.ipv4.tcp_max_syn_backlog = 65535
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_tw_reuse        = 1
net.ipv4.tcp_fin_timeout     = 15
net.ipv4.tcp_keepalive_time  = 60
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes= 5
net.netfilter.nf_conntrack_max = 1048576
net.nf_conntrack_max = 1048576

저장 후, reboot 진행

sudo sysctl -p or sudo reboot
  • 보통 5분 정도 걸린다.



1️⃣ Certbot 설치

sudo apt install -y certbot python3-certbot-nginx



2️⃣ 도메인 세팅

<유료 도메인>
가비아에서 도메인 추가
혹은
후이즈에서 도메인 추가

<무료 도메인>
내도메인.한국에서 도메인 추가



3️⃣ Nginx 설치

sudo apt install nginx

인바인드 보안규칙 설정


default 파일 업데이트
/etc/nginx/sites-available/default 파일에 아래 내용을 넣는다.

server {
        listen 80 default_server;  
        listen [::]:80 default_server;
        root /var/www/html;
        index index.html index.htm index.nginx-debian.html;
        server_name _;
        location / {
                try_files $uri $uri/ =404;
        }
}

server {
    server_name 도메인명; 
    client_max_body_size 500M;

    location / {
        proxy_pass http://localhost:포트번호;
        proxy_set_header    X-Real-IP           $remote_addr;
        proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto   $scheme;
        proxy_set_header    Host                $host;
        proxy_set_header    Upgrade             $http_upgrade;
        proxy_set_header    Connection          "upgrade";
        proxy_set_header    X-Forwarded-Host    $host;
        proxy_set_header    X-Forwarded-Port    $server_port;
        proxy_set_header    X-NginX-Proxy       true;
        proxy_pass_header   Set-Cookie;
        proxy_http_version  1.1;
        proxy_cache_bypass  $http_upgrade;
        proxy_connect_timeout 300;
        proxy_send_timeout 300;
        proxy_read_timeout 300;
        send_timeout 60;
        keepalive_timeout 75;
    }
}

(참고)

🔽 새로 등록한 도메인에 대해 Https 및 포트 연동 하기 (Certbot 실행하기)

Certbot으로 HTTPS설정하기


만약 certbot 인증서를 발급할 때 에러가 발생한다면, 80(443) 포트에 대한 방화벽을 허용해야한다. (인바운드 규칙을 설정했어도, 서버 방화벽이 80번 포트를 막고 있을 수 있다)

sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT

(+) iptables -L : 리눅스 시스템의 방화벽 규칙을 조회해서 내부 포트가 잘 열려있는지 확인해주기


Nginx 자동 시작 설정

# Nginx 서비스 상태 확인
sudo systemctl status nginx

# 자동 시작 설정 여부 확인
sudo systemctl is-enabled nginx
# enabled: 자동 시작 O
# disabled: 자동 시작 X

# Nginx를 부팅 시 자동으로 시작하도록 설정
sudo systemctl enable nginx



4️⃣ coturn 설치

sudo apt install coturn

→ coturn을 설치하면 TURN 서버 (턴서버)를 운영할 수 있다.


※ TURN 서버란?
WebRTC는 P2P(개인-개인) 통신을 기본으로 하기 때문에 클라이언트끼리 직접 연결해서 영상/음성을 주고받는다.
문제는 대부분의 사용자가 공유기(NAT) 뒤에 있어 서로의 주소(IP)를 알 수 없어 직접 연결이 불가능하다는 점이다.

이 경우 각 단말기는 공인 IP를 가진 서버를 경유해서 통신해야 한다.
TURN 서버는 이러한 상황에서 중계 서버 역할을 해주고 coturn은 TURN 서버를 구현한 오픈소스 프로그램이다.

WebRTC가 연결을 시도하는 방법에는 STUN과 TURN이 있다.

  • STUN: 공인 IP를 알아내서 직접 연결을 시도한다.
    A ──→ STUN 서버: "내 공인 IP가 뭐야?"
    A ←── STUN 서버: "너 203.0.xxx.x이야"
    A ──→ B에게 직접 연결 시도
  • TURN: 중계 서버를 경유한다.
    A ──→ TURN 서버 ──→ B
    A ←── TURN 서버 ←── B

모든 트래픽이 서버를 경유하기 때문에 NAT/방화벽 뒤에서도 100% 연결이 가능하다.
모든 환경에서 안정적인 연결을 보장하려면 TURN 서버가 필요하고, 이를 위해 coturn을 설치하여 사용한다.


/etc/turnserver.conf 파일 업데이트

  • 턴 서버용 도메인 주소 업데이트 (턴 서버용 도메인 주소도 하나 만들어야함)

turnserver 세팅

https://velog.io/@tmd0110/TURN-%EC%84%9C%EB%B2%84-%EA%B5%AC%EC%B6%95%ED%95%98%EA%B8%B0


/etc/default/coturn 파일 업데이트

  • conturn 서버 사용 여부를 관리하는 파일
  • 아래 문장 삽입
    TURNSERVER_ENABLED=1

conturn 실행

sudo systemctl enable coturn

sudo systemctl start coturn

service coturn stats # 실행 확인



5️⃣ Redis 설치

sudo apt install redis-server

sudo systemctl enable redis-server

sudo systemctl start redis-server

service redis-server status # 설치 확인

※ redis.conf 세팅도 필수!



6️⃣ Pm2 설치

npm install pm2@5.1.0 -g



7️⃣ Node.js 설치 및 소스코드 업로드 및 실행

Node.js 14버전 설치

curl -fsSL https://deb.nodesource.com/setup_14.x | sudo -E bash -

sudo apt-get install -y nodejs

소스코드 업로드

  • /main/WEBRTC_2022 업로드 후, 폴더 권한 설정

    chown -R root:root WEBRTC_2022
  • 스레드 수 40으로 설정

    • nano ecosystem.config.js 파일에서 instances: 40으로 설정

소스코드 실행

npm install

npm start

# pm2 list  → 스레드 수 40개 확인
profile
대기업 채용 인적성 검사 시스템을 개발하고 있습니다.

0개의 댓글