홈 서버 만들기 16. 트랜스코딩: Plex

May 11, 2018

어느 기기에서나 동영상을 시청할 수 있도록 서버 측에서 실시간으로 변환해서 스트리밍하는 기능인 트랜스코딩은, 특히 모바일 기기에서 코덱을 신경쓸 필요 없이 웹을 통해서 바로 재생할 수 있고, 원본을 직접 재생하는 것보다 데이터 사용량도 줄일 수 있어서 유용하다. 트랜스코딩 프로그램으로는 Plex가 막강한데 멋진 라이브러리 형태의 UI로 구현되어 있어서 홈 미디어 서버로 사용하기에도 좋다.

Plex 설치

wget -q https://downloads.plex.tv/plex-keys/PlexSign.key -O - | sudo apt-key add -

echo deb https://downloads.plex.tv/repo/deb/ public main | sudo tee /etc/apt/sources.list.d/plexmediaserver.list

sudo apt-get update

sudo apt-get install plexmediaserver

먼저 우분투 서버에 Plex 패키지 저장소 정보를 추가하고 plexmediaserver를 설치한다. 설치 과정 중에 *** plexmediaserver.list (Y/I/N/O/D/Z) [default=N] ? 라는 질문을 해오면 기본값인 N을 입력한다. Y를 입력하면 우분투 서버에 추가한 저장소 정보가 주석 처리되어 사라진다.

방화벽 설정

sudo iptables -A INPUT -p tcp -m tcp -m multiport --dports 3005,8324,32400,32469 -j ACCEPT
sudo iptables -A INPUT -p udp -m udp -m multiport --dports 1900,5353,32410,32412,32413,32414 -j ACCEPT

iptables 방화벽에서 Plex가 사용하는 포트를 열어준다. (기본적인 방화벽 세팅은 03. 우분투 서버 18.04 LTS 기본 설정에서 완료했다.)

sudo netfilter-persistent save
sudo netfilter-persistent reload

iptables 방화벽의 설정 내용을 저장하고 리로드한다. (iptables-persistent는 03. 우분투 서버 18.04 LTS 기본 설정에서 설치했다.)

Plex 접속

http://서버내부ip:32400/web

이와 같은 형태로 서버 내부 IP 주소를 사용해서 접속하면 Plex의 기본 설정 화면이 나타난다. 설정 과정 중에 외부에서도 접속할 수 있도록 설정하면, 인터넷 공유기를 사용하는 경우 포트 포워딩 기능을 이용해서 32400번 TCP 포트가 서버 컴퓨터로 향하도록 포워딩하면 공인 IP 주소나 도메인을 사용해서도 접속할 수 있다.

다만 http 프로토콜을 사용해야 하므로, 기존에 도메인에 https로 리턴하는 설정이 적용되어 있다면 접속이 안 될 수 있다. 이때에는 인터넷 공유기에서 포트 포워딩을 하지 말고, 우분투 서버에서 운영 중인 웹 서버을 이용해서 프록시를 구성하면 https 프로토콜로 어디에서든 접속할 수 있다. 여기서는 기존에 운영 중인 Nginx 웹 서버가 있다고 가정하고 설명한다.

서브 도메인 생성

Plex는 입출력이 빈번하므로 별도의 서버 블록으로 만드는 것이 좋다. Plex 접속용 서브 도메인을 하나 생성한다. 여기서는 plex.example.com을 생성한 것으로 가정한다.

Nginx 프록시 설정

sudo mkdir /var/www/plex

Nginx 프록시가 작동될 root 디렉토리를 생성한다. 디렉토리 이름은 원하는 대로 생성하면 된다.

sudo chown varins:varins /var/www/plex

생성한 root 디렉토리의 소유자와 소유그룹을 자신의 사용자 계정으로 설정한다. varins:varins를 자신의 사용자 이름으로 바꿔서 입력한다.

sudo nano /etc/nginx/sites-available/plex.example.com

plex.example.com의 서버 블록 파일을 nano 편집기로 새로 생성한다. 구분하기 쉽도록 서버 블록 파일 이름을 plex.example.com 도메인 이름 그대로 사용했다.

upstream plex_backend {
    server 127.0.0.1:32400;
    keepalive 32;
}

map $http_host $this_host {
	"" $host;
	default $http_host;
}

map $http_x_forwarded_proto $the_scheme {
	default $http_x_forwarded_proto;
	"" $scheme;
}

map $http_upgrade $proxy_connection {
	default upgrade;
	"" close;
}

server {
	listen 80;

	server_name plex.example.com;

	return 301 https://$server_name$request_uri;
}

server {
	listen 443 ssl http2;

	server_name plex.example.com;

	root /var/www/plex;

	ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
	ssl_dhparam /etc/ssl/certs/dhparam.pem;

	ssl_protocols TLSv1.2;
	ssl_prefer_server_ciphers on;
	ssl_ciphers ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-SHA256;
	ssl_ecdh_curve secp384r1;
	ssl_session_timeout 10m;
	ssl_session_cache shared:SSL:10m;
	ssl_session_tickets off;
	ssl_stapling on;
	ssl_stapling_verify on;
	resolver 8.8.8.8 8.8.4.4 valid=300s;
	resolver_timeout 5s;

	add_header Strict-Transport-Security max-age=31536000;
	add_header X-Content-Type-Options nosniff;

	gzip on;
	gzip_vary on;
	gzip_min_length 1000;
	gzip_proxied any;
	gzip_types text/plain text/css text/xml application/xml text/javascript application/x-javascript image/svg+xml;
	gzip_disable "MSIE [1-6]\.";

	send_timeout 100m;

	client_max_body_size 0;

	location / {
		if ($http_x_plex_device_name = '') {
			rewrite ^/$ https://$http_host/web/index.html;
		}
		proxy_pass http://plex_backend;
		proxy_http_version 1.1;
		proxy_set_header Upgrade $http_upgrade;
		proxy_set_header Connection $proxy_connection;
		proxy_set_header Host $http_host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-Proto $the_scheme;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_redirect off;
		proxy_buffering off;
	}
}

빨간색 부분을 자신의 것으로 바꿔야 함을 유의하면서, 위의 내용으로 작성한다. ssl_certificatessl_certificate_key에는 자신의 SSL/TLS 인증서 경로가 들어가야 하고, ssl_dhparam에는 DH Param 키의 경로가 들어가야 한다. 작성이 끝났으면 Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다.

sudo ln -s /etc/nginx/sites-available/plex.example.com /etc/nginx/sites-enabled/

작성한 서버 블록을 작동시키기 위해 /etc/nginx/sites-enabled/ 경로에 심볼릭 링크를 만들어준다.

만일 이런 서버 블록을 여러 개 생성해서 다수의 웹사이트를 운영한다면 도메인 처리를 원활하게 하기 위해서 Nginx 설정 파일 nginx.conf에 아래의 설정을 추가한다.

sudo nano /etc/nginx/nginx.conf

Nginx 설정 파일인 nginx.conf 파일을 nano 편집기로 연다.

server_names_hash_bucket_size 64;

server_names_hash_bucket_size 64;를 찾아서 앞에 주석 #을 제거하고, Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다. 이미 처리되어 있다면 그대로 nano 편집기를 빠져나온다.

이상으로 서버 블록 설정이 끝났으면, 설정한 서버 블록이 Nginx에 반영되도록 아래와 같이 Nginx를 재시작한다.

sudo nginx -t

Nginx 설정에 기본적인 문법 오류가 없는지 점검한다. 오류가 없다면
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
이런 메시지가 출력된다. 만일 다른 메시지가 나온다면 메시지를 참고해서 설정 사항을 점검한다.

sudo systemctl restart nginx

오류가 없으면 Nginx를 재시작한다.

이제 plex.example.com 주소로 접속하면 Plex를 이용할 수 있다.

 

홈 서버 만들기 목차 
https://varins.com/category/server

01. 하드웨어 구성과 전기 요금
02. 우분투 서버 18.04 LTS 설치
03. 우분투 서버 18.04 LTS 기본 설정
04. 파일 복원: Btrfs 스냅샷
05. 네트워크 파일 공유: Samba (SMB)
06. Dynamic DNS: 구글 도메인 + ddclient
07. SSL/TLS 인증서: Let's Encrypt (Wildcard)
08. 웹 서버: Nginx, 서버 블록, https 보안연결
09. 웹사이트: php + MariaDB + WordPress
10. 서버 모니터링: Monitorix + Nginx Proxy
11. FTPS: vsftpd
12. VPN: IKEv2 (strongSwan)
13. Torrent: Transmission
14. 클라우드 스토리지: Nextcloud (Nginx, MariaDB)
15. 온라인 오피스: 온리오피스 (Docker, Nginx)
16. 트랜스코딩: Plex
17. VNC RDP 클라이언트: Guacamole (Docker, Nginx)
18. 가상 머신: QEMU-KVM + libvirt + virt-install
19. 시스템 업그레이드: i3 8300T, 970 EVO 전력 사용량
20. 서버 모니터링: netdata + Nginx Proxy
Prev Post Next Post