远程访问
Kryspal Media 不替你中转流量,也不做 HTTPS 终结。想在外面观看,需要你自己让服务器能被访问。这一页说明两种常用做法、需要注意的设置,以及 Caddy、Nginx、Nginx Proxy Manager 的最小示例。
选一种方式#
- VPN,例如 Tailscale。 在服务器所在的机器和你的设备上都装好,然后用服务器的 VPN 地址加 5797 端口访问。不向互联网暴露任何东西,最简单也最安全。
- 带 HTTPS 的反向代理。 代理监听 443、持有证书,再把请求转给服务器。想要一个在任何播放器里都能用的正常网址,就用这种。
无论哪种,都不要在路由器上转发 5797 端口,它是明文 HTTP。要转发端口,只转发外网访问端口 5798,并在它前面放反向代理。
需要注意的设置#
端口。 compose 文件已经发布了 5797(局域网)和 5798(外网),并设置了 EXTERNAL_HTTP_ADDR: ":5798"。两个端口访问的是同一个服务器,包括管理后台。区别只在于连接如何被判定:从 5798 进来的一律算外网。请让反向代理指向 5798。
可信代理。 把代理的地址告诉服务器,它才能看出真正连进来的是谁。在 compose 文件里,服务器的 environment 下:
environment:
EXTERNAL_HTTP_ADDR: ":5798"
TRUSTED_PROXIES: "192.168.1.5"
值是用逗号分隔的地址或网段(例如 Docker 网络 172.18.0.0/16)。有一项格式不对,服务器就无法启动。不设置的话,所有请求看起来都来自代理,登录失败次数限制会把你所有的观众当成一个客户端;如果代理在内网地址上,外网的人还可能被当成在你的局域网里。
公网访问网址。 在「系统设置 → 网络」里填写你的播放器从外网访问时用的地址,例如 https://media.example.com:8443。可以带路径(https://example.com/media)。必须是完整的 http:// 或 https:// 地址,不能带用户名、查询参数或片段;结尾的斜杠会被去掉。设置之后,只要服务器要给外网连接一个完整地址,就用它:交给外部播放器的播放链接、复制出来的播放地址和播放列表,以及告诉 Emby、Jellyfin 类播放器的服务器地址。来自局域网的连接仍然用局域网地址。这样就不用完全依赖代理传的请求头;用 443 以外的端口时尤其重要,因为很多代理会把 Host 里的端口丢掉。建议填上,即使代理也传了下面这些头。
代理必须传的请求头。
Host要保持访问者输入的样子。从网页发起的修改(保存设置等),如果Origin和Host对不上,会被以 403 拒绝。X-Forwarded-Host和X-Forwarded-Proto。没有设置公网访问网址时,服务器用它们生成交给 Infuse 等外部播放器的串流地址。两者都缺的话,播放器拿到的是http://server:5797/...这样的内部地址,从外网连不上。
WebSocket。 播放器会保持一条 WebSocket 连接。代理必须转发 Upgrade 和 Connection 头,读取超时至少 60 秒(服务器每 30 秒发一次心跳)。
串流与大文件。 不要缓冲或缓存响应,并允许 Range 请求,播放器才能拖动进度。读取和发送超时要设长一点,免得长片被切断。服务器已经通知 Nginx 系代理不要缓冲。如果你在管理后台上传图片,代理必须接受至少 20 MiB 的请求体(Nginx 默认的 1 MiB 不够)。
HTTPS。 证书由代理持有。服务器看到 X-Forwarded-Proto: https 时,会自动把登录 Cookie 标为安全。
把 VPN 当作本地。 通过 VPN 连进来的设备默认算外网。想把某个 VPN 网段算作局域网,加上 LAN_RANGES,例如 Tailscale:LAN_RANGES: "100.64.0.0/10"。
最小示例#
把 media.example.com 换成你自己的域名,192.168.1.10 换成服务器的地址。
Caddy#
Caddy 自己会传 Host、X-Forwarded-Host、X-Forwarded-Proto,支持 WebSocket,不缓冲串流,证书也自动申请。
media.example.com {
reverse_proxy 192.168.1.10:5798
}
Nginx#
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
server {
listen 443 ssl;
server_name media.example.com;
ssl_certificate /etc/ssl/media.example.com.pem;
ssl_certificate_key /etc/ssl/media.example.com.key;
client_max_body_size 50m;
location / {
proxy_pass http://192.168.1.10:5798;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}
Nginx Proxy Manager#
- Proxy Hosts → Add Proxy Host。 域名填
media.example.com,协议http,转发主机192.168.1.10,端口5798,打开 Websockets Support。 - SSL 页:申请证书,打开 Force SSL。
- Advanced 页,自定义配置:
proxy_buffering off;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
client_max_body_size 50m;
NPM 自己会传转发头。TRUSTED_PROXIES 填 NPM 容器或所在机器的地址。
检查是否正常#
- 在你的网络之外打开
https://media.example.com并登录。 - 在网页播放器里播放一个文件,再把同一个地址(443 端口)加到你的播放器里。
出问题时#
- 在管理后台保存时报 403。 代理改了
Host头,请原样传递。 - 播放器拿到的地址不能用。 代理没有传
X-Forwarded-Host和X-Forwarded-Proto。 - 全部被当成局域网,或一个人登录失败连累别人。 把代理加进
TRUSTED_PROXIES。 - 播放几分钟后中断,或实时画面不更新。 调大代理的读取超时,并关闭缓冲。
管理后台也能通过同一个地址访问。请使用强密码,或者如果不需要在外网使用后台,就在代理上限制对后台的访问。关于日志和反馈问题时该附什么,见日志与问题反馈。