๐Ÿ–ฅ Server

Nginx ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋ฒ„๋กœ ์‚ฌ์šฉํ•˜๊ธฐ

dev_seong 2022. 8. 4. 10:12

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์ฒ˜๋Ÿผ ์ •ํ•ด์ง„ ๊ณต๊ฐ„์— ๋ชจ๋“ˆ์„ ๋ฐฐ์น˜๋งŒ ํ•˜๋ฉด ์‹คํ–‰ํ•˜๋Š”๊ฒŒ ๋‹น์—ฐํ•˜๊ณ  ์ข‹์€๊ฑฐ๊ฐ™์€๋ฐ… ์ œ๊ฐ€ ๋ชจ๋ฅด๋Š”๊ฑฐ๋ผ ์ƒ๊ฐํ•˜๋‹ˆ ํ•œ๋ฒˆ ๋” ์ฐพ์•„๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

๐Ÿ˜ŽREF