一.起因
玩服务器多的人一般都见过一张在圈子里流传的图,就是在稳定、速度、价格这三者之间取舍的韦恩图。由于利用Plex搭建在线视频服务器本身只是我拿来利用闲置服务器的一个项目,所以也没打算扔太多钱在上面,这也就意味着,这台机器必然会在 速度或者稳定其中一者上有所取舍。而我选择的是稳定,所以么,速度也就没那么好了。
二.分析
我拿来跑Plex的服务器是Kimsufi的K4C,i5+16G+2T+100M,配置是还OK的,就是处于法国,这样的话个国内有些情况下速度就比较憋屈了,虽然我配置了BBR,但是在部分网络下还是只有500k左右的速度,虽然看个720p还是没问题的,但是拖动的话还是有些不够流畅,这远远不能让我满足。如果是普通网站,为了加快访问速度我们想到的就是上CDN,那么Plex能不能这么干呢?
当然也是可以的,只要CDN支持Websocket,因为Plex的部分数据是通过WS从服务器上获取的,只要想办法让WebSocket通过CDN将用户和服务器连接起来,借助CDN机房网络比用户家用网络拥有更优异的路由和带宽的优势,我们就能够获得比直连更快的播放速度。
三.解决
研究了下网上的各种方法,发现众说纷纭啊,Quickbox的教程看上去很靠谱,其实并没有卵用,复杂的要死,有个Github上的教程就很简单也很有效。
地址在这 https://github.com/toomuchio/plex-nginx-reverseproxy
他这个主要就是个nginx的vhost配置文件,然后还有些说明,我来简单介绍下流程。
怎么在机器上安装nginx我就不提了吧,太简单了,随便你用源装还是用各种lnmp包啥的装,反正只需要一个nginx本体。
修改下 https://github.com/toomuchio/plex-nginx-reverseproxy/raw/master/nginx.conf 这个配置文件,注意这个不是替代你的nginx.conf的,这样不太好,我建议把它作为模板来修改你新建的vhost,下面是我改的
upstream plex_backend { server 127.0.0.1:32400; keepalive 32; } server { listen 80; listen 443 ssl http2; server_name plex.server; access_log off; send_timeout 100m; resolver 8.8.4.4 8.8.8.8 valid=300s; resolver_timeout 10s; ssl_certificate /usr/local/nginx/conf/ssl/plex.server.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/plex.server.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_buffer_size 1400; ssl_stapling on; ssl_stapling_verify on; ssl_session_tickets on; 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]."; client_max_body_size 100M; #Forward real ip and host to Plex proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; #Websockets proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; #Disables compression between Plex and Nginx, required if using sub_filter below. #May also improve loading time by a very marginal amount, as nginx will compress anyway. #关闭Plex程序到Nginx之间的gzip压缩 #proxy_set_header Accept-Encoding ""; #Buffering off send to the client as soon as the data is received from Plex. #关闭缓冲,防止出问题 proxy_redirect off; proxy_buffering off; location / { #Example of using sub_filter to alter what Plex displays, this disables Plex News. #这部分内容替换是为了去除Plex的News,可以不用管,如果要用这个必须把上面的压缩给关掉,不然gzip压缩后的内容无法检索到内容成功替换 #sub_filter ',news,' ','; #sub_filter_once on; #sub_filter_types text/xml; proxy_pass http://plex_backend; } #PlexPy forward example, works the same for other services. #用于将PlexPy同时反代,关于PlexPy这个可以参考我第一篇Plex文章的后半部分内容 #location /plexpy { # proxy_pass http://127.0.0.1:8181; #} }
记得把SSL和Server_name啥的给改了,其他可以直接用来着。
我把GitHub上的配置里那个global的ssl缓存设置给丢到了server段,这个只要你nginx.conf里面没有定义过放到server里面是不会冲突的,不然server段配置的缓存大小受global限制,不能超过。
然后有些HSTS啥的因为我打算用百度云加速,免费套餐不支持https,所以就没有加上,另外部分平台的plex不支持https,比如roku和ps4上的,具体可以参考这个issue ——>传送门
还有ssl证书的话可以用let's encrypt的,签发可以用acme.sh,这个我就不介绍了。
在配置完nginx反代后,我们就能通过反代的域名访问plex了,测试下先,然后我们做些修改。
Remote Access - Disable
Network - Custom server access URLs = https://<your-domain>:443,http://<your-domain>:80
Network - Secure connections = Preferred.
#f03c15 Note you can force SSL by setting required and not adding the HTTP URL, however some players which do not support HTTPS (e.g: Roku, Playstations, some SmartTVs) will no longer function.
就是在远程访问那儿禁用远程访问(开了的话Plex会把IP上报给Plex的官方服务器,然后你默认会用端口连那个IP,而不是走CDN)
然后在网络那儿配置访问地址Custom server access URLs (如果没看见这个请点击右上方的显示高级选),这个可以用逗号来分隔添加多个地址,比如http和https的(https://<your-domain>:443,http://<your-domain>:80),记得带上端口,至于那个Secure connections看你需求,如果不用https就禁用掉,支持可以开preferred,不建议开必须,这样兼容性不好。
配置完成后建议用防火墙关掉外部访问32400端口,防止部分平台不管配置的 Custom server access URLs 而优先直接访问32400(当然,上了cdn的情况下是访问不通的)
这是iptables命令,禁止非本地访问32400的
iptables -A INPUT ! -i lo -p tcp --dport 32400 -j DROP
然后你就可以享受刷刷刷的访问速度了,当然,你会记得在cdn那边添加域名的对吧
经过测试,上了CDN之后我能够达到峰值10M/s,稳定3-4m/s的4k播放,效果还是很棒的。
Senraの小窝原创