이제 실제로 Nginx 웹서버와 rtmp 소스를 push, pull 로 쉽게 받을 수 있게 지원하는 open source 를 활용해 미디어서버를 구축해보겠다.
서버는 ubuntu 20.04인 AWS의 EC2이다.
내가 임대한 서버는 CentOS7 기반이라 패키지 설치를 진행할 때는 apt-get 말고 yum 으로 진행하도록 한다.
(ubuntu20.04 코드들은 맨 밑에 참고자료 있음)
1. Nginx 컴파일 설치를 위한 의존성 도구들 설치
sudo yum install pcre pcre-devel openssl openssl-devel zlib zlib-devel -y
sudo yum groupinstall "Development Tools" -y
2. Nginx 웹서버와 rtmp module // tar 압축파일 다운로드할 폴더 생성 & tar 압축파일 다운로드
mkdir /usr/local/nginx-rtmp
cd /usr/local/nginx-rtmp
wget https://nginx.org/download/nginx-1.14.0.tar.gz
wget https://github.com/arut/nginx-rtmp-module/archive/master.zip
tar -zxvf nginx-1.14.0.tar.gz
unzip master.zip
** 차근차근 하나씩 명령어를 실행해주세요
3. nginx와 rtmp module 컴파일 설치
cd nginx-1.14.0
sudo ./configure --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --conf-path=/etc/nginx/nginx.conf --pid-path=/var/run/nginx.pid --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --with-http_ssl_module --add-module=../nginx-rtmp-module-master --user=nginx --group=nginx
sudo make
sudo make install
1) ./configure : 컴파일 설치를 하기 위한 설정
2) --prefix='경로' : nginx가 설치될 때 모든 것의 기본적인 정보가 저장되는 경로
3) --sbin-path='경로' : nginx의 실행파일이 설치되는 경로
4) --conf-path='경로' : nginx의 설정 파일(nginx.conf)이 저장되는 경로
5) --pid-path='경로' : nginx의 프로세스 ID값이 있는 파일의 경로
6) --error, --http-log : nginx의 로그 파일이 저장되는 경로
7) --with--http_ssl_module 등.. : 기본적으로 nginx설치 파일에 들어있으나 설치되지 않는 모듈들.. 그러나 내가 with로 설정할 때 설치할 수 있는 모듈들
8) --add-module='경로' : 서드파티의 모듈(라이브러리, Nginx-rtmp 모듈 등)을 설치할 수 있는 명령어
9) --user=nginx --group=nginx: nginx사용자의 권한으로 Nginx를 실행 함. conf에서 바꿀 수 있음.
4. Nginx 사용자 등록 및 Nginx 실행
sudo useradd --shell /sbin/nologin nginx
sudo ps aux | grep nginx 로 nginx가 worker process로 등록 된 것을 확인한다.
** 서비스에 등록하지 않고 매번 명령어를 쳐서 실행할꺼면 다음 명령어로 실행한다 .
sudo /usr/sbin/nginx
5. Nginx를 서비스에 등록하기
다음 파일을 다운로드 한 후
sudo vi /etc/init.d/nginx
편집기를 오픈해서 붙여넣는다. 마우스로 할 경우 Ctrl + C -> vi 안에 오른쪽마우스 클릭 하면 붙여넣기 됨
저장 했으면, 서비스 실행파일 권한 설정(644->744)
sudo chmod +x /etc/init.d/nginx
6. 나의 경우 rtmp 소스를 hls로 바꾸기 위한 환경설정
vi /etc/nginx/nginx.conf
user nginx;
worker_processes auto;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events
{
worker_connections 1024;
}
rtmp
{
server
{
listen 1935;
# Listen on standard RTMP port
chunk_size 4000;
application show
{
on_publish http://127.0.0.1/chat//publisher;
on_done http://127.0.0.1/chat//publisher-end;
live on;
hls on;
hls_path /mnt/hls/;
hls_fragment 1;
hls_playlist_length 6s;
hls_continuous on;
# Turn on HLS
# -c:a aac -b:a 128k -c:v libx264 -b:v 512K -f flv rtmp://localhost/hls/$name_hi;
exec ffmpeg -i rtmp://localhost/show/$name
-c:a aac -b:a 32k -s 720*1280 -c:v libx264 -b:v 3000K -f flv rtmp://localhost/hls/$name_mid
-c:a aac -b:a 64k -s 1080*1920 -c:v libx264 -b:v 4500K -f flv rtmp://localhost/hls/$name_hi;
}
application hls
{
live on;
hls on;
hls_path /tmp/hls/;
hls_fragment 1;
hls_playlist_length 6s;
deny play all;
hls_continuous on;
hls_nested on;
# hls_variant _low BANDWIDTH=3200000;
hls_variant _mid BANDWIDTH=3200000;
hls_variant _hi BANDWIDTH=6400000;
}
}
}
http
{
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
server
{
listen 80;
server_name localhost;
add_header 'Access-Control-Allow-Origin' '*';
#charset koi8-r;
#access_log logs/host.access.log main;
location /
{
root html;
index index.html index.htm ;
add_header 'Access-Control-Allow-Origin' '*';
}
# location ~ \.php$ {
# include fastcgi_params;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
# }
location /live
{
add_header Cache-Control no-cache;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Expose-Headers' 'Content-Length';
types
{
application/vnd.apple.mpegurl m3u8;
}
alias /tmp/hls/;
}
location /live-origin
{
add_header Cache-Control no-cache;
add_header 'Access-Control-Allow-Origin' '*';
add_header 'Access-Control-Expose-Headers' 'Content-Length';
types
{
application/vnd.apple.mpegurl m3u8;
}
alias /mnt/hls/;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html
{
root html;
}
location /chat
{
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $host;
add_header 'Access-Control-Allow-Origin' '*';
proxy_pass http://localhost:3000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
rtmp 소스를 hls 로 변환해서 웹사이트에서 라이브 스트리밍이 되는 부분까지 테스트 완료한 서버 설정 코드이다.
저장 후 nginx 재시작
service nginx restart
서버설정은 여기까지해서 완료했다.
**혹시 ubuntu 궁금해하시는분들 있을까봐
해당 블로그를 참고했고, nginx.conf는 위의 CentOS 부분을 가져가도 무방하다.
궁금한점이나, 다른부분에 대해 질문있으면 댓글남겨주세요!
service nginx restart 등 service 관련 명령어가 동작하지 않을 때
/usr/local/nginx/sbin/nginx // 서비스 시작
/usr/local/nginx/sbin/nginx -s stop // 서비스 정지
/usr/local/nginx/sbin/nginx -s reload // 서비스 재시작
/usr/local/nginx/sbin/nginx -t // 설정 파일 syntax 테스트
'Server' 카테고리의 다른 글
docker 명령어 정리 - 내가 자주 사용하는 것들 (0) | 2022.04.03 |
---|---|
mkdir (make directory) 옵션 정리 - 폴더생성 (0) | 2022.04.03 |
Live & VOD Streaming Media server 구축 (4) - 오디오, 비디오 코덱 선정 상세 (0) | 2022.03.09 |
Live & VOD Streaming Media server 구축 (3) - 디지털 동영상이란 (2) | 2022.02.26 |
Live & VOD Streaming Media server 구축 (2) - 미디어 서버의 종류 (0) | 2022.02.20 |
댓글