nginx๋ฅผ HLS๋ก ๊ฐ๋จํ ์คํธ๋ฆฌ๋ฐ์ ํ ์ ์๋ ์๋ฒ๋ก ๊ตฌ์ถํ๋๋ฒ์ ๋ํด ์ ๋ฆฌํ๋ คํฉ๋๋ค.
nginx๋ฅผ ์ปดํ์ผํ๋ ๋ฐฉ์์ผ๋ก ์งํํ์๊ณ ์ ๊ฐ ์งํํ ์คํ์ ์๋์ฒ๋ผ ๊ตฌ์ฑ๋์ด์์ต๋๋ค.
OS : Ubuntu 22.04
Nginx : 1.20.2
๐์ค์น
์ค์น๊ฒฝ๋ก๋ ๊ณ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์ nginx-source ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์์ ์์ ํ๋๊ฑธ ์ถ์ฒํฉ๋๋ค.
- nginx
wget <http://nginx.org/download/nginx-1.12.0.tar.gz>
- nginx-vod-module
git clone <https://github.com/kaltura/nginx-vod-module.git>
๐configure ์ธํ
์์ถ์ ํ๊ณ nginx ๋๋ ํ ๋ฆฌ๋ก ๋ค์ด๊ฐ์ configure๋ฅผ ์ธํ ํด์ค์ผํฉ๋๋ค.
./configure --add-module=../nginx-vod-module --with-file-aio --with-threads --with-cc-opt="-O3"
- with-file-aio ๋ asynchronous I/O ๋ฅผ ์ง์ํ๊ฒ ํด์ค๋ค
- with-threads ๋ thread pool ์ ์ด์ฉํด์ asynchronous ํ๊ฒ ํ์ผ์ open ํ๋๋ก ํด์ค๋ค.
- with-cc-opt="-O3" ๋ compiler Optimization ์ ์ํ ์ต์ ์ด๋ค.
๐Nginx ์ปดํ์ผ
configure๋ฅผ ๋ชจ๋ ์ถ๊ฐํ๋ค๋ฉด nginx์ปดํ์ผ์ ์งํํด์ผํฉ๋๋ค.
make && make install
make๋ฅผ ์ฌ์ฉํ์๋ ํน์ ํจํค์ง๊ฐ ์์ด์ ์งํ๋ชปํ๋ค๊ณ ๋ฌธ๊ตฌ๊ฐ ๋ง์ด ๋์ฌ ์ ์์ต๋๋ค.
์น์ ํ๊ฒ ์ด๋ค ๋ถ๋ถ์ด ์๋์ง ๋ค ์๋ ค์ฃผ๋ ํ๋ํ๋์ฉ ๋ค ์ค์นํด์ค๋๋ค.
๐Nginx config ์ธํ
์ปดํ์ผ์ด ์ ์์ ์ผ๋ก ์งํ๋์๋ค๋ฉด nginx๋ /usr/local/nginx ์ด์ชฝ์ ์ค์น๋์์๊ฒ๋๋ค.
nginx๋ฅผ ์คํํ๊ธฐ์ ์ /usr/local/nginx/conf/nginx.conf ํ์ผ์ ์์ ํฉ๋๋ค.
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
vod_mode local;
vod_metadata_cache metadata_cache 16m;
vod_response_cache response_cache 512m;
vod_last_modified_types *;
vod_segment_duration 9000; #๋์์์ 9์ด ๋จ์๋ก ๋๋ ์ ์ ์ก
vod_align_segments_to_key_frames on;
vod_dash_fragment_file_name_prefix "segment";
vod_hls_segment_file_name_prefix "segment";
vod_manifest_segment_durations_mode accurate;
open_file_cache max=1000 inactive=5m;
open_file_cache_valid 2m;
open_file_cache_min_uses 1;
open_file_cache_errors on;
aio on;
server {
listen 80;
server_name localhost;
location ~ ^/videos/.+$ {
autoindex on;
}
location /hls/ {
vod hls;
root /{์คํธ๋ฆฌ๋ฐํด์ผํ ๋์์ ๊ฒฝ๋ก};
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Methods 'GET, HEAD, OPTIONS';
}
}
}
์ด๋ ๊ฒ ์ธํ ์ ํด์ฃผ๋ฉด ๋๋ค.
๐Nginx ๋ช ๋ น์ด
์๋น์ค ์์ : /usr/local/sbin/nginx
์๋น์ค ์ ์ง : /usr/local/sbin/nginx -s stop
์๋น์ค ์ฌ์์ : /usr/local/sbin/nginx -s reload
์ค์ ํ์ผ syntax ํ
์คํธ : /usr/local/sbin/nginx -t
์๋น์ค ๋์ ํ์ธ : netstat -ntlp | grep :80
๋ก๊ทธํ์ผ๊ฒฝ๋ก : /usr/local/nginx/logs
๐HLS ์คํธ๋ฆฌ๋ฐ ํ์ธ
์๋ฌด๊ฒ๋ ์๋ ๋ธ๋ผ์ฐ์ ์์ ๋ฐ๋ก HLS ์คํธ๋ฆฌ๋ฐ์ ํ์ธ์ด ์๋ ๊ฒ๋๋ค.
ํ์ฅํ๋ก๊ทธ๋จ์ด ์ค์น๋์์ผ๋ฉด url์ ๋ ฅํ๋๊ฒ์ผ๋ก ๋ฐ๋ก ์์ ํ์ธ์ด ๊ฐ๋ฅํด์ง๋๋ค.
ํฌ๋กฌ์ผ๊ฒฝ์ฐ ํ์ฅํ๋ก๊ทธ๋จ ๊ฒ์ํด์ HLS Player์ค์นํ๋ฉด ๋ฐ๋ก ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
http://{์๋ฒIP}/hls(nginx.conf์์ location์ผ๋ก ์ก์๋ )/{์์๋ช }.mp4/master.m3u8
๐์ฐธ๊ณ ๋ด์ฉ
ํน์ ์์์ด ์๋์จ๋ค๋ฉด ์์์ด ์ ์ฅ๋ ๊ฒฝ๋ก์ ๊ถํ์ด ์ถฉ๋ถํ์ง ํ์ธํด๋ณผ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฒฝ๋ก์ ๊ถํ๋ฌธ์ ์ ํจ๊ป ์์์ ๊ถํ๋ฌธ์ ๋์.(์์ ๊ถํ๋๋ฌธ์ ๋ค๋ฅธ ๋ฌธ์ ์ธ์ค์๊ณ ํ์ฐธ ์ฝ์งํ๋ค๊ฐ error log๋ณด๊ณ ํ์ธํด์ ์ฒ๋ฆฌํ์๋ค์๐ฅ)
์ ๊ฐ์ ๊ฒฝ์ฐ๋ ๋ค๋ฅธ ํ๋ก์ ํธ์์ ์์ ์ ๋ก๋ ํ๊ณ ๋๋ฉด ์ธ์ฝ๋ฉ๊น์ง ์งํํ๊ณ ์ธ์ฝ๋ฉ๋ ์์์ ์คํธ๋ฆฌ๋ฐํ์ด์ผํด์ ์์ ์ ๋ก๋ ๋๋ ํ ๋ฆฌ, ์ธ์ฝ๋ฉ ํ ์ ์ฅ ๋๋ ํ ๋ฆฌ ๋ชจ๋ ๊ฐ์๊ณณ์์ ๊ฒฝ๋ก๋ง ๋ฐ๊ฟ์ ์ฌ์ฉํ๊ณ ๊ถํ์ 777๋ก ์ธํ ํ๊ณ ์ฌ์ฉํ์ต๋๋ค.
๐๊ถ๊ธํ์
์ปดํ์ผํ nginx๋ง ๊ทธ๋ฐ์ง๋ ๋ชจ๋ฅด๊ฒ ๋๋ฐ nginx๋ ์ปดํ์ผ๋ ์ํ์์๋ ๋ชจ๋์ถ๊ฐ๊ฐ ์๋๋๊ฑธ๋ก ๋ณด์์ต๋๋ค. ๋ฌด์กฐ๊ฑด ์ปดํ์ผ์ ์ configure์ ์ด๋ค ๋ชจ๋์ ์ถ๊ฐํ ๊ฑด์ง ๋ฏธ๋ฆฌ ์ถ๊ฐ๋ฅผํ๊ณ ์ปดํ์ผํด์ผ์ง๋ง ๋ชจ๋์ ์ถ๊ฐํ ์ ์๋ ๊ฑธ๊น์? apache์ฒ๋ผ ์ ํด์ง ๊ณต๊ฐ์ ๋ชจ๋์ ๋ฐฐ์น๋ง ํ๋ฉด ์คํํ๋๊ฒ ๋น์ฐํ๊ณ ์ข์๊ฑฐ๊ฐ์๋ฐ… ์ ๊ฐ ๋ชจ๋ฅด๋๊ฑฐ๋ผ ์๊ฐํ๋ ํ๋ฒ ๋ ์ฐพ์๋ด์ผ๊ฒ ์ต๋๋ค.