Media server: Plex

 

Plex

어느 기기에서나 동영상을 시청할 수 있도록 서버 측에서 실시간으로 변환해서 스트리밍하는 미디어 서버로 미려한 UI를 제공하는 Plex가 널리 쓰인다. Plex를 이용하면 특히 모바일 기기에서 코덱을 신경쓸 필요 없이 웹을 통해서 바로 재생할 수 있고, 원본을 직접 재생하는 것보다 데이터 사용량도 줄일 수 있어서 유용하다.

 

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 update

sudo apt 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가 사용하는 TCP 및 UDP 포트를 열어준다. (기본적인 방화벽 세팅은 앞선 글 우분투 서버 기본 설정에서 완료했다.)

sudo netfilter-persistent save
sudo netfilter-persistent reload

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

 

Plex 기본 설정

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

내부 네트워크에서 내부 IP 주소를 사용해서 http 프로토콜로 접속하면 Plex의 기본 설정 화면이 나타난다.

설정 과정 중에 외부에서도 접속할 수 있도록 설정한 경우에는 우분투 서버에 운영 중인 웹 서버을 이용해서 리버스 프록시를 구성해주면 도메인 및 https 프로토콜로 Plex에 접속할 수 있게 된다.

 

리버스 프록시 구성

 

Nginx 설치

리버스 프록시를 구성할 웹 서버로 Nginx를 이용한다. Nginx 설치 및 기본적인 설정 방법은 앞선 글 웹 서버: Nginx를 참고한다.

 

서브도메인 생성

Plex는 데이터 입출력이 빈번하므로 별도의 Nginx 서버 블록으로 만드는 것이 좋다. Plex 접속용 서브도메인을 하나 생성한다. 여기서는 plex.example.com을 생성한 것으로 가정한다. (도메인에 대한 일반적인 내용은 앞선 글 도메인과 DNS를 참고한다.)

 

TLS 인증서 발급

https 보안 연결을 구성하기 위해서 TLS 인증서를 발급받는다. 자세한 방법은 앞선 글 TLS 인증서: Let's Encrypt를 참고한다. 이 방법으로 인증서를 발급받으면 *.example.com 형태의 와일드카드 서브도메인에 대한 인증서가 발급되므로 이 인증서를 그대로 plex.example.com 서브도메인에 사용할 수 있다.

 

DH Param 키 생성

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096

앞선 글 웹 서버: Nginx를 통해서 DH Param 키를 생성했다면 그 키 하나로 모든 웹사이트에 사용할 수 있으므로 이 단계는 건너뛴다. 만일 생성하지 않았다면 위 명령으로 DH Param 키를 생성한다. DH Param 키는 https 보안 연결에서 암호화 성능을 높이기 위해서 추가로 사용하는 난수인데, 위 명령어는 4096 비트 (512 바이트) 로 생성하므로 시간이 오래 걸린다. 서버 컴퓨터의 성능에 따라 다르지만 길게는 수십분 가량 소요되기도 한다. 2048 비트 (256 바이트) 로 생성하려면 위의 명령에서 끝에 4096을 2048로 바꿔서 입력한다. 키가 생성되는 위치는 /etc/ssl/certs/dhparam.pem 으로 지정했다.

 

Nginx 설정

sudo mkdir /var/www/plex

plex.example.com의 root 디렉토리를 생성한다. 디렉토리 이름은 원하는 대로 생성하면 된다.

sudo chown www-data:www-data /var/www/plex

생성한 디렉토리 및 그 하위 디렉토리(-R 옵션)의 소유자와 소유그룹을 www-data로 설정한다. www-data는 우분투 서버의 웹 서버 프로세스를 뜻한다.

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_trusted_certificate /etc/letsencrypt/live/example.com/chain.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-CHACHA20-POLY1305: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 1.1.1.1 1.0.0.1 valid=300s;
        resolver_timeout 5s;

        add_header Strict-Transport-Security max-age=31536000;
        add_header X-Robots-Tag none;
        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_keyssl_trusted_certificate에는 앞서 발급받은 TLS 인증서 파일의 경로가 들어가고, ssl_dhparam에는 DH Param 키의 경로가 들어간다. 위 예시의 서버 블록은 TLSv1.2만 사용하도록 설정된 것인데 만일 새로운 버전 TLSv1.3도 사용하려면 앞선 글 Nginx TLS 1.3 설정을 추가로 적용한다.

작성이 끝났으면 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를 이용할 수 있다.

 

본 글의 저작권은 작성자 Varins에게 있습니다.
Varins의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.

 

코멘트 없음
맨위로