Linux/Ubuntu

Nginx를 이용한 RTMP HLS 스트리밍

Charlie_moon 2025. 8. 16. 13:56

 

 

 

 

실시간 스트리밍에 대해 공부를 하던중 Nginx의 RTMP 모듈을 이용하면 쉽게 구현이 가능하다는 사실을 알게 되어 구현내용을 정리 해보고자 합니다.

 

 

 

주의

Nginx 1.9.11 이상 버전을 사용하셔야합니다. 

 

목차

  1. Nginx 설치하기
  2. Nginx RTMP 모듈 설치하기
  3. Nginx Vod 모듈 설치하기 (선택사항)
  4. FFmpeg 설치하기 (선택사항)
  5. 녹화를 위한 폴더 생성 (선택사항)
  6. Nginx 설정파일 수정하기
  7. OBS를 이용하여 스트리밍하기
  8. 스트리밍 영상 플레이어로 확인하기

 

진행 환경

Ubuntu 24.04.1 LTS

 

 

Nginx설치하기

설치 커맨드

sudo apt install nginx

 

설치가 완료되었다면 버전을 확인해봅시다.

 

버전확인 커맨드

nginx -version

 

버전 정보가 출력이 된다면 잘 설치 하신겁니다.

 

 

Nginx RTMP 모듈 설치하기

RTMP 모듈을 설치하려고 합니다. Package Manager Tool에 따라서 모듈의 이름이 다를 수 있으니 찾아보고 설치하시길 바랍니다.

 

설치 커맨드

sudo apt install libnginx-mod-rtmp

 

 

Nginx Vod 모듈 설치하기 (선택사항)

저는 다시보기를 지원하기 위해서 vod 모듈을 추가하도록 하겠습니다. vod 모듈은 기존에 가지고 있던 미디어소스(MP4 등)을 HLS가 가능하도록 하는 모듈입니다. HLS 외 여러 기능을 지원하니 찾아보시면 좋을 것 같습니다.

 

vod 모듈은 apt에 기본적으로 등록되어 있지 않기 때문에 추가적인 과정을 거쳐 설치를 진행하겠습니다.

 

도구 설치 커맨드

sudo apt install -y build-essential libpcre3-dev libssl-dev zlib1g-dev libavformat-dev libavcodec-dev libavutil-dev libswscale-dev git

 

 

모듈 생성 코드

# nginx 소스 다운로드 (현재 설치된 버전과 동일하게)
NGINX_VERSION=$(nginx -v 2>&1 | grep -o '[0-9.]*')
cd /tmp
wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz
tar -xzf nginx-${NGINX_VERSION}.tar.gz
cd nginx-${NGINX_VERSION}

# kaltura nginx-vod-module 다운로드
git clone https://github.com/kaltura/nginx-vod-module.git

# 동적 모듈로만 컴파일
./configure \
    --with-compat \
    --add-dynamic-module=./nginx-vod-module

# 모듈만 컴파일
make modules

# 생성된 동적 모듈 복사
sudo cp objs/ngx_http_vod_module.so /usr/lib/nginx/modules/

 

 

FFmpeg 설치하기 (선택사항)

RTMP 모듈로 녹화된 영상소스를 mp4로 변환하기 위해서 필요한 라이브러리입니다.

 

설치 커맨드

sudo apt install ffmpeg

 

정보확인 커맨드 

ffmpeg -version

 

 

녹화를 위한 폴더 생성

폴더 생성 커맨드

mkdir -p /var/videos/recordings
mkdir -p /var/videos/vod

 

Nginx 설정 파일 수정하기

설정 파일 열기 커맨드

vi /etc/nginx/nginx.conf

 

설정 파일 내용

#vod 모듈을 설치한 경우만
#vod 모듈 불러오기
load_module modules/ngx_http_vod_module.so;



#유저 설정
user root;
worker_processes auto;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;

events {
	worker_connections 768;
	# multi_accept on;
}

http {

	##
	# Basic Settings
	##

	sendfile on;
	tcp_nopush on;
	types_hash_max_size 2048;
	# server_tokens off;

	# server_names_hash_bucket_size 64;
	# server_name_in_redirect off;

	include /etc/nginx/mime.types;
	default_type application/octet-stream;

	##
	# SSL Settings
	##

	ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
	ssl_prefer_server_ciphers on;

	##
	# Logging Settings
	##

	access_log /var/log/nginx/access.log;

	##
	# Gzip Settings
	##

	gzip on;

	# gzip_vary on;
	# gzip_proxied any;
	# gzip_comp_level 6;
	# gzip_buffers 16 8k;
	# gzip_http_version 1.1;
	# gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;

	##
	# Virtual Host Configs
	##

	include /etc/nginx/conf.d/*.conf;
	#주석처리
    #include /etc/nginx/sites-enabled/*;
	
	server {
		#HTTP 기본 포트 
		listen 80;
		server_name _;
		location /hls {
			root /tmp;
			types {
				application/vnd.apple.mpegurl m3u8;
				video/mp2t ts;
			}

			add_header 'Access-Control-Allow-Origin' '*' always;
			add_header 'Access-control-Expose-Headers' 'Content-Length';
			add_header 'Cache-Control' 'no-cache';

			if ($request_method = 'OPTIONS') {
				add_header 'Access-Control-Allow-Origin' '*';
   				add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS';
   				add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
				add_header 'Content-Length' 0;
				return 204;
			}
		}
		#vod 모듈이 있는 경우만 
		location /vod {
			vod hls;
			vod_mode local;
			alias /var/videos/vod/;
			add_header 'Access-Control-Allow-Origin' '*';
		}
	}
}

rtmp {
	server {
		#RTMP 기본 포트
		listen 1935;
		#청크 단위 설정
		chunk_size 4096;

		application live {
			#라이브 스트리밍 기능 ON 설정
			live on;
			#녹화 활성화 ('off','all','meta','keyframe') 등 옵션이 있음
            #녹화를 하지 않겠다면 'off'로 설정하면 된다.
			record all;
			#녹화될 파일 저장 위치 설정
			record_path /var/videos/recording;
			#녹화 파일명에 타임스탬프를 붙여 유니크하게 파일명을 만들어주는 설정
			record_unique on;
			#녹화 파일 확장자 이름 설정
			record_suffix .flv;
			#녹화가 끝났을 때 ffmpeg를 이용하여 동영상 파일 변환 지정된 경로에 저장 작업
			exec_record_done ffmpeg -i $path -c:v copy -c:a copy /var/videos/vod/$basename.mp4;

			
			#hls 기능 ON
			hls on;
			#세그먼트 파일 및 재생목록 생성될 위치 설정
			hls_path /tmp/hls;
			#세그먼트 파일 길이 설정
			hls_fragment 3s;
			#플레이리스트 길이 설정
			hls_playlist_length 15s;
			#스트리밍 되지 않는 세그먼트 파일 삭제 설정 
			hls_cleanup on;
		}
	}

}

#mail {
#	# See sample authentication script at:
#	# http://wiki.nginx.org/ImapAuthenticateWithApachePhpScript
#
#	# auth_http localhost/auth.php;
#	# pop3_capabilities "TOP" "USER";
#	# imap_capabilities "IMAP4rev1" "UIDPLUS";
#
#	server {
#		listen     localhost:110;
#		protocol   pop3;
#		proxy      on;
#	}
#
#	server {
#		listen     localhost:143;
#		protocol   imap;
#		proxy      on;
#	}
#}

 

Nginx 설정파일 검사 커맨드

sudo nginx -t

 

설정파일 검사 커맨드를 입력했을때 

nginx: configuration file /etc/nginx/nginx.conf test is successful

 

라고 나온다면 문제가 없는 겁니다. 이제 Nginx를 재시작 해봅시다.

 

Nginx 재시작 커맨드

sudo systemctl restart nginx

 

 

OBS를 이용하여 스트리밍하기

 

OBS 설정을 열어 방송탭으로 이동해줍니다.

상단에 서비스를 사용자지정으로 변경하고 서버 주소를 입력해 줍니다.

스트림키는 본인이 알아볼 수 있는 아무입력값을 기입해줍니다.

 

주소형식

#'live'는 아까 Nginx설정 파일에서 rtmp - application 이름을 따라갑니다.
rtmp://<서버주소>/live

 

 

 

영상 소스를 하나 만들고 방송시작 버튼을 눌러 스트리밍을 시작해봅시다. 

루트계정으로 접근해서 세그먼트 파일을 확인해 봅시다.

 

커맨드

#root 계정 접속
sudo su

#폴더 이동
cd /tmp/hls

 

파일 목록을 보니 세그먼트 파일들이 잘 생성되고 있습니다.

m3u8 재생목록 파일도 보이는군요.

 

 

 

스트리밍 영상 플레이어로 확인하기

플레이어에서 스트리밍 영상을 보도록 하겠습니다.

저는 Windows 환경에 VLC Player를 사용했습니다. HLS를 지원하는 플레이어를 다운받으셔서 테스트 해보면 좋을것 같습니다.

네트워크 주소에 형식에 맞게 입력을 해줍니다.

 

VLC 플레이어 HLS 영상 재생

 

스트리밍이 아주 잘되고 있습니다.

조금의 지연이이 있지만 이정도면 봐줄만 하네요 물론 네트워크 환경에 따라 지연시간은 다르겠지만...ㅎㅎ

방송을 종료 하도록 하겠습니다.

 

 

저는 옵션으로 녹화까지 진행하여서 파일이 잘 만들어 졌네요.

 

요청을 보내보도록하겠습니다.

 

요청형식

#http://<주소>/<로케이션>/<생성된파일이름>.mp4/index.m3u8
http://<주소>/vod/charlie-12341393.mp4/index.m3u8

 

nginx에서 설정한 vod location으로 요청을 전송했습니다.

 

녹화된 영상 HLS로 영상 보기

 

녹화된 영상이 잘 나오고 있습니다.

 

여기까지 Nginx, Nginx-RTMP모듈을 이용하여 라이브 스트리밍하는 방법에 대해 글을 작성해 보았습니다.

긴을 읽어주셔서 감사합니다.