为了极致的本地播放和多人同步观影体验,使用国内服务器部署 OpenList 和 SyncTV 是极佳的选择。但国内服务器绕不开一个痛点:未备案无法使用域名并启用HTTPS。
然而,SyncTV 的实时语音通话功能(基于 WebRTC),以及 OpenList 对接 SyncTV 后的部分视频流播放,都强制要求必须在 HTTPS 环境下运行。既然无备案,又不能用域名,我们的唯一出路就是使用 IP + 端口 + HTTPS 的方式来破局。
在实际部署中,我使用宝塔面板作为基础环境,踩了不少机制和配置上的坑。以下是具体的配置思路和深度避坑指南。
部署OpenList + SyncTV可以参考之前的教程:
1. 架构思路:公用 IP 证书 + Nginx 反向代理
为了解决证书自动续签和程序稳定性的问题,采用了下面方法。
-
证书申请:利用宝塔面板自带的特性,直接为服务器的公网 IP 申请免费的 SSL 证书(宝塔会自动处理后续的续签)。
-
反向代理:让 OpenList 和 SyncTV 服务端在本地仅开启 HTTP 模式运行。在宝塔面板中新建两个网站(分别对应两个不同的外部访问端口),通过 Nginx 反代将流量转发给后端的 OpenList 和 SyncTV。
-
优势:两个网站共用宝塔申请的同一张 IP 证书。更新证书时只需宝塔自动重载 Nginx,后端的 OpenList 和 SyncTV 进程完全不受影响,彻底保证了前端挂载的稳定性。
2. 宝塔强制添加多个“IP+端口”站点
在落实上述方案时,宝塔面板有一个很死板的机制:当你已经创建了一个以 IP 为主域名的网站(例如 公网IP:10000 代理 OpenList)后,如果你想用同样的方式直接添加第二个网站(例如 公网IP:11000 代理 SyncTV),宝塔往往会报错或被系统拦截,导致无法正常添加。
为了绕过这个限制,实现两个 IP+端口 网站的反代,你需要使用以下“障眼法”操作:
-
曲线建站:在添加第二个网站(SyncTV 反代站)时,域名一栏千万不要填 IP。随便输入一个假域名(例如
synctv123.com),完成网站创建。 -
追加绑定端口:网站创建成功后,进入该网站的 设置 -> 域名管理。
-
暗度陈仓:在域名添加框内,填入你实际需要的
公网IP:11000,并点击添加。 -
过河拆桥:添加成功后,在下方的域名列表中,将刚才编造的假域名(
synctv123.com)直接点击删除。
通过这个技巧,建立了一个纯粹由 IP:11000 驱动的网站。接下来,只需要去配置 SSL 证书(选择你已经申请好的 IP 证书)即可。
3. 核心避坑指南:Nginx 配置文件深度排雷
建立好两个反代网站后,依然会遇到“网页打不开”、“视频无法播放”、“前端白屏”等一系列诡异问题。
必须手动进入这两个网站的 Nginx 配置文件,请务必检查并修改以下 5 个关键坑点:
坑点一:非标端口的 SSL 监听配置
宝塔在非 443 端口开启 SSL 时,生成的代码逻辑是有瑕疵的,会导致 ERR_SSL_PROTOCOL_ERROR 错误。 解决办法: 打开网站配置文件,找到开头的 listen 代码。 将原本分离的两行:
listen 10000; listen 443 ssl http2 ;
合并并修改为一行(以 10000 端口为例):
listen 20000 ssl http2;
坑点二:宝塔自带的静态文件拦截(导致前端白屏)
宝塔为了优化普通的静态网站,默认会拦截 .js、.css 和图片文件,交给本地直接读取。但这会导致 OpenList 和 SyncTV 的前端资源直接报 404 错误,造成页面白屏。 解决办法: 在配置文件中,找到并直接删除(或注释掉)以下三段 location 规则:
# 必须删掉这三段! location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ location ~ .*\.(js|css)?$
坑点三:OpenList 反代参数丢失端口与协议
在使用宝塔自带的反代配置时,OpenList 会因为拿不到外部的真实端口和 HTTPS 状态,导致生成的视频播放直链变成普通的 HTTP,或者直接丢失自定义端口。 解决办法: 在宝塔的反向代理配置文件中,确保修改并添加以下两行核心参数:
# 必须是 $http_host,千万不能是默认的 $host,否则会丢失端口号! proxy_set_header Host $http_host; # 这一行是告诉 OpenList 外部是用 HTTPS 访问的,防止它生成 http 播放链接 proxy_set_header X-Forwarded-Proto $scheme;
坑点四:全局证书路径的统一
为了让这两个反代网站直接调用宝塔面板自动申请的那个全局 IP 证书,我们需要修改默认的证书引用路径。 解决办法: 在两个网站的配置文件中,找到 #SSL-START 下方的证书路径,修改为宝塔面板 SSL 的真实物理路径:
ssl_certificate /www/server/panel/ssl/certificate.pem; ssl_certificate_key /www/server/panel/ssl/privateKey.pem;
坑点五:SyncTV 的 WebSocket 冲突
SyncTV 强依赖 WebSocket(ws://)来实现房间同步和语音交互。如果使用宝塔面板自带的“反向代理”可视化界面进行设置,极易与官方要求的 location = /api/room/ws 规则产生冲突,导致 Nginx 重载失败。 解决办法: 彻底放弃宝塔面板自带的“反向代理”菜单功能。 直接打开 SyncTV 网站的 Nginx 配置文件,将 SyncTV 官方文档提供的反代参数,直接粘贴到配置文件的最下方(access_log 的上方即可)。
client_max_body_size 20m;
proxy_cache off;
proxy_buffering off;
proxy_http_version 1.1;
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;
proxy_set_header X-Forwarded-Protocol $scheme;
proxy_set_header X-Forwarded-Host $http_host;
proxy_set_header REMOTE-HOST $remote_addr;
location = /api/room/ws {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "";
proxy_set_header Range $http_range;
}
完成以上配置并重启 Nginx 后,你就可以在免备案的国内服务器上,完美享受带有安全加密和语音功能的同步观影体验了。
