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

May 11, 2018Updated on December 8, 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

먼저 h4rt우분투 서버에 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가 사용하는 포트를 열어준다. (기본적인 sf4h546방화벽 세팅은 03. 우분투 서버 18.04 LTS 기본 설정에서 완료했다.)

sudo netfilter-persistent save
sudo netfilter-persistent reload

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

Plex 접속

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

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

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

서브 도메인 생성

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

SSL/TLS 인증서 발급

https 보안 연결을 위해서 plex.example.com 도메인에 SSL/TLS 인증서를 발급받는다. 자세한 방법은 07. SSL/TLS 인증서: Let’s Encrypt (Wildcard) r4f63 또는  22. SSL/TLS 인증서: Let’s Encrypt + CloudFlare (Wildcard + 자동갱신)을 참고한다. 이 방법으로 인증서를 발급받으면 *.example.com 형태의 와일드카드 s645h서브 도메인에 대한 인증서가 발급되므로 이 인증서를 그대로 plex.example.com 도메인에 사용할 수 있다.

DH Param 키 생성

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

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

Nginx 프록시 설정

sudo mkdir /var/www/plex

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

sudo chown varins:varins /var/www/plex

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

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

plex.example.com의 6gdfg서버 블록 파일을 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;
	}
}

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

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

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

만일 이런 서버 41t31hn블록을 여러 개 생성해서 다수의 웹사이트를 운영한다면 도메인 처리를 원활하게 하기 위해서 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;를 찾아서 앞에 s43d주석 #을 제거하고, Ctrl키와 x키를 동시에 눌러서 nano 편집기를 빠져나오면서 저장한다. 이미 처리되어 있다면 그대로 nano 편집기를 빠져나온다.

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

sudo nginx -t

Nginx 설정에 기본적인 s4g13s문법 오류가 없는지 점검한다. 오류가 없다면
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의 사전 서면 동의 없이는 본 글의 전부 또는 일부를 무단으로 전재, 게시, 배포하는 것을 금지합니다.

 

홈 서버 만들기 목차 
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
21. Dynamic DNS: CloudFlare + ddclient
22. SSL/TLS 인증서: Let's Encrypt + CloudFlare (Wildcard + 자동갱신)

Comments (6)

  • KBJ

    May 18, 2018 at 4:04 pm

    서버구성 포스트 너무나 잘 봤습니다.
    최근 서버를 윈도우에서 리눅스로 바꾸며 고생을 많이 했는데,
    몇몇 부분만 제외하고 거의 동일하게 구성된 내용들을 보니까 모르는 것도 배우고 도움이 많이 되었습니다.
    진즉에 알았다면 그 고생을 안해도 되었을텐데.. 아쉬우면서도 앞으로 서버 구성하시는 분들께 많은 도움이 될 내용들이어서 감탄이 계속 되네요.

    좋은 포스트에 다시 한번 감사드리며 항상 건강히 지내시길!

    1. Varins

      May 18, 2018 at 6:20 pm

      안녕하세요, 좋은 말씀 감사합니다.
      이 글들이 도움이 된다면 저도 기분이 좋습니다.
      KBJ님께서도 늘 평안하시길 기원합니다. 감사합니다.

  • 안녕하세요.

    June 16, 2018 at 2:45 am

    서버구성 포스트 정말 역대급입니다.
    따로 집에 저장해두고 싶을만큼 친절한 안내서입니다.

    정말 뵐 수 있다면 커피라도 마구마구 사드리고 싶습니다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ
    감사합니다.

    1. Varins

      June 16, 2018 at 3:22 am

      안녕하세요, 좋은 말씀 감사드립니다.
      도움이 되는 글이었으면 좋겠습니다. 즐거운 시간 보내시길 바래봅니다.

  • deaba

    July 22, 2018 at 12:25 am

    우분투 서버설명중에 가장 최고가 아닌가 합니다.
    많이 배우고 갑니다. 글이 너무 도움이 되었습니다. 감사합니다.
    따라서 여러가지를 만들어 보고 있는데
    보안부분에 궁금증이 들어 물어봅니다.

    다른건 모르지만 ftp나 ssh에 무분별한 로그인접속시도는 어떻게 처리하시는지 궁금합니다.
    글에 적힌대로 포트는 다른걸로 바꾸었지만
    무작위한 로그인 시도에 대해서도 괜찮은건지 궁금합니다.

    1. Varins

      July 25, 2018 at 8:55 am

      안녕하세요,
      보통 무작위 로그인 시도는 널리 알려진 특정 포트에 IP 주소를 무작위로 대입하는 방식으로 이루어지기 때문에 이런 포트를 막아두는 방법도 효과가 있습니다. 가정에서 사용하는 인터넷 공유기가 1차적인 방화벽 역할을 하기 때문에 공유기 펌웨어 업데이트 및 설정을 안전하게 하고 포트를 관리하는 것으로 기본적인 보안은 확보할 수 있습니다. 여기에 추가로 우분투 서버 상에서 iptables를 직접 관리하면 큰 문제는 없으리라 생각합니다. 좋은 말씀 감사드립니다. 즐거운 하루 되시길 기원합니다.

Leave a comment

댓글은 관리자의 승인 이후에 게시됩니다.

Prev Post Next Post