一.起因
玩服务器多的人一般都见过一张在圈子里流传的图,就是在稳定、速度、价格这三者之间取舍的韦恩图。由于利用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播放,效果还是很棒的。
文章评论
ssl_certificate /usr/local/nginx/conf/ssl/plex.server.crt;
ssl_certificate_key /usr/local/nginx/conf/ssl/plex.server.key;
您好,请问下您这两行的ssl证书和key哪里来的?咱没有这个证书,直接提示
[root@xini ~]# /usr/local/nginx/sbin/nginx -t
nginx: [emerg] BIO_new_file("/usr/local/nginx/conf/ssl/plex.server.crt") failed (SSL: error:02001002:system library:fopen:No such file or directory:fopen('/usr/local/nginx/conf/ssl/plex.server.crt','r') error:2006D080:BIO routines:BIO_new_file:no such file)
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
@SCGabriel 自己申请的ssl证书,你可以用let's encrypt或者其他免费证书
@Senra 可以用军哥的lnmp1.5自动申请let’s encryp吗?
@SCGabriel 不清楚lnmp有没有带这个,你可以研究下,不行的话建议使用acme.sh
@Senra 可以用军哥的lnmp1.5自动申请let’s encrypt吗?
请问大大,我用新加坡反代ks3c。
proxy_pass http://exampleA.com;
那反代的新加坡这台需要安装nginx吗?
我成功反代后,如果要换俄罗斯服务器反代,可以直接改proxy_pass http://exampleB.com;
然后 service nginx restart吗?
我现在的情况是,新加坡原先装有nginx,代理plex成功,直接访问新加坡域名连上plex登录界面,有明显加速效果;然后更改proxy_pass俄罗斯域名,俄罗斯(没有装nginx)域名访问无内容,连不上plex登录界面。最奇怪的是,proxy_pass已经改成俄罗斯域名,新加坡域名仍然能连上plex…
@crazi 我的这部分配置主要针对的是安装了Plex的本机,你如果需要用其他机器去反代,而不是使用CDN,你需要在其他机器上参照这个类似的再配置一遍,用于取代CDN的部分。
@crazi 另外我一般建议使用example.com来作为示例……你可以去访问下看看你之前的那个xxx的网站是啥内容……
感谢大大,proxy_pass http://plex_backend; 这部分原来是不用改哈,然后cf选上cdn,就直接飞起,比反代速度还好。不知道客户端的手动连接是否可以走cdn或反代?
失误,原来那个网址这么叼,2333
请问https://www.hostens.com/的openvz拿来做plex可以吗,只有单核心
@lalala 不建议,可能性能不够,而已资源消耗大可能被商家暂停
@Senra 谢谢。还有一个问题是,如果多人同时观看会不会增加服务器的负担?使用了cdn的话呢?
@lalala Plex是个人的,公开是肯定不建议的,几个人倒是应该没啥问题,负载肯定是会比一个人用增加,但是还得看你是否转码了,如果是原始画质,不走转码,那么负载主要在网络上。否则负载可能大部分在CPU上,网络的负载主要看你服务器的带宽,如果带宽大,加上CDN可能没问题,但是CPU的负载高了如果多人同时观看那可能就体验会很差。
@Senra 谢谢博主解答,因为想和朋友们合租一个KS1,所以有点疑问。大概5个人如果买KS1是不是使用体验可能会差点?
大佬 大佬 想问你用的什么CDN
@Mickey 百度云加速
百度云加速要备案吧,非百度的域名不能加速
@MeaSe 我有备案,至于备案在哪是不限制的
这个加速方案在ios的Plex客户端无法取得效果吧?(感觉应该没办法连接上,因为手机客户端好像只能通过ip连接服务器。)
您好,怎么设置反代呢,下载了一个nginx本体,有一个nginx,conf,还有这个新建的vhost.conf,怎么关联呢?谢谢
博主我爱你!宽带都跑满了!!
@小时 还有一件事你证书过期了
大佬我在谷歌搜索进来的,https://www.senra.me/optimize-plex-online-streaming-speed-via-using-cdn/
这个页面咋这样啊。。。。
主要是进来学习的