Jellyfin HTTPS 教程:安全访问你的媒体
Jellyfin 是一个免费、开源的媒体服务器,它能让你在任何设备上流式传输你的电影、电视节目、音乐和照片。然而,默认情况下,Jellyfin 通常通过 HTTP(未加密)连接提供服务,这意味着你的数据在传输过程中可能被窃听或篡改。为了保护你的隐私和数据安全,为 Jellyfin 设置 HTTPS(超文本传输安全协议)至关重要。
本教程将详细指导你如何使用 Nginx 作为反向代理,并结合 Let’s Encrypt 提供的免费 SSL 证书,为你的 Jellyfin 服务器启用 HTTPS。
为什么需要 HTTPS?
- 数据加密:HTTPS 对客户端和服务器之间的所有通信进行加密,防止密码、个人信息和媒体播放记录等敏感数据被第三方截获。
- 数据完整性:它确保数据在传输过程中不被修改或损坏,保证你接收到的内容是原始的、未被篡改的。
- 身份验证:HTTPS 证书验证服务器的身份,防止中间人攻击(Man-in-the-Middle attacks),确保你连接的是真正的 Jellyfin 服务器。
- 改善SEO和浏览器信任:虽然对于个人媒体服务器不那么重要,但现代浏览器会明确警告用户访问不安全的 HTTP 网站。HTTPS 可以提升用户对你服务器的信任。
先决条件
在开始之前,请确保你满足以下条件:
- 一个注册的域名:例如
your_domain.com,并且你希望通过一个子域名(例如jellyfin.your_domain.com)来访问 Jellyfin。 - 域名DNS记录:你的域名已正确配置
A或CNAME记录,指向你的服务器的公共 IP 地址。 - 开放端口:你的服务器防火墙和路由器已开放 TCP 端口 80 (HTTP) 和 443 (HTTPS)。
- 已安装的 Jellyfin:Jellyfin 已安装并运行在你的服务器上(通常监听在
http://localhost:8096)。本教程假设你在 Linux 环境(例如 Ubuntu/Debian)中操作。 - SSH访问:拥有服务器的
sudo权限,并可以通过 SSH 访问。
核心方案:Nginx 反向代理 + Let’s Encrypt
我们将采取以下步骤:
1. 安装 Nginx。
2. 配置 Nginx 作为 Jellyfin 的 HTTP 反向代理。
3. 使用 Certbot 获取 Let’s Encrypt SSL 证书并自动配置 Nginx。
4. 优化 Nginx 配置以增强安全性。
5. 调整 Jellyfin 网络设置以识别真实客户端 IP。
6. 验证证书自动续订。
步骤 1:安装 Nginx
如果你的服务器上尚未安装 Nginx,请使用以下命令进行安装:
bash
sudo apt update
sudo apt install nginx -y
安装完成后,启动 Nginx 服务并使其在系统启动时自动运行:
bash
sudo systemctl start nginx
sudo systemctl enable nginx
步骤 2:配置 Nginx 作为 Jellyfin 的 HTTP 反向代理
在获取 SSL 证书之前,我们将首先配置 Nginx 作为 HTTP 反向代理。
-
创建 Nginx 配置文件:
为 Jellyfin 创建一个新的 Nginx 配置文件。请将jellyfin.your_domain.com替换为你的实际域名。bash
sudo nano /etc/nginx/sites-available/jellyfin -
添加 Nginx 配置内容:
将以下内容粘贴到文件中。请确保将jellyfin.your_domain.com替换为你的 Jellyfin 访问域名,并将127.0.0.1:8096替换为你的 Jellyfin 实例的实际 IP 地址和端口(如果 Jellyfin 不在同一台服务器上或使用不同端口)。“`nginx
server {
listen 80;
listen [::]:80;
server_name jellyfin.your_domain.com;# 将所有 HTTP 请求重定向到 HTTPS。Certbot 将在下一步中自动配置 HTTPS 部分。 return 301 https://$host$request_uri;}
“`
注意:此配置中只定义了 HTTP 监听部分,并将其重定向到 HTTPS。HTTPS 服务器块将在 Certbot 运行时自动生成和填充。 -
启用 Nginx 站点:
创建从sites-available到sites-enabled的符号链接,以启用此配置。bash
sudo ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled/ -
测试 Nginx 配置并重新加载:
检查配置是否有语法错误,然后重新加载 Nginx 服务使其生效。bash
sudo nginx -t
sudo systemctl reload nginx
如果测试成功,现在你尝试通过http://jellyfin.your_domain.com访问 Jellyfin 时,它应该会自动重定向。由于 HTTPS 尚未完全配置,浏览器可能会显示证书错误。
步骤 3:安装 Certbot 并获取 Let’s Encrypt SSL 证书
Certbot 是获取和管理 Let’s Encrypt 证书的官方工具。
-
安装 Certbot 和 Nginx 插件:
bash
sudo apt install certbot python3-certbot-nginx -y -
运行 Certbot 获取证书:
运行以下命令。Certbot 将自动检测你的 Nginx 配置,获取证书,并配置 Nginx 以使用 HTTPS。请将jellyfin.your_domain.com替换为你的实际域名,并将[email protected]替换为你的电子邮件地址。bash
sudo certbot --nginx -d jellyfin.your_domain.com --email [email protected] --agree-tos --no-eff-email
Certbot 会询问你是否希望将所有 HTTP 流量重定向到 HTTPS。选择2(Redirect) 是推荐的做法,这会强制所有访问都使用加密连接。如果一切顺利,你将看到一条祝贺消息,表明你的证书已成功部署。Certbot 还会自动设置一个 cron 作业来续订你的证书。
步骤 4:调整 Nginx 配置(可选,但推荐)
Certbot 会自动修改你的 Nginx 配置文件,添加 SSL 相关的指令。我们可以进一步优化配置以增强安全性。
-
编辑 Nginx 配置文件:
bash
sudo nano /etc/nginx/sites-available/jellyfin -
检查并添加推荐的配置:
Certbot 应该已经为你添加了listen 443 ssl;和ssl_certificate等行。现在,你需要添加 Jellyfin 反向代理所需的location /块,并可以添加一些安全头部以提升安全性:“`nginx
server {
listen 80;
listen [::]:80;
server_name jellyfin.your_domain.com;
return 301 https://$host$request_uri;
}server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name jellyfin.your_domain.com;# Certbot 管理的 SSL 证书路径 ssl_certificate /etc/letsencrypt/live/jellyfin.your_domain.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/jellyfin.your_domain.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; # Certbot 推荐的 SSL 选项 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Certbot 生成的 DH 参数 # 可选:更强的 SSL 协议和密码套件 (根据客户端兼容性需求调整) ssl_protocols TLSv1.3 TLSv1.2; ssl_ciphers 'TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256'; ssl_prefer_server_ciphers on; # 安全头部 (强烈推荐) add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always; add_header X-Frame-Options "SAMEORIGIN" always; add_header X-Content-Type-Options "nosniff" always; add_header Referrer-Policy "no-referrer-when-downgrade" always; # 可选:增加 client_max_body_size 如果你需要上传大文件 (例如图片封面) client_max_body_size 20M; # Jellyfin 的反向代理设置 location / { proxy_pass http://127.0.0.1:8096; # 如果 Jellyfin 在不同 IP/端口,请调整 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; proxy_set_header X-Forwarded-Host $host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_redirect off; # WebSockets 所需设置 proxy_http_version 1.1; proxy_buffering off; }}
“` -
测试 Nginx 配置并重新加载:
保存文件后,再次测试 Nginx 配置并重新加载服务。bash
sudo nginx -t
sudo systemctl reload nginx
步骤 5:配置 Jellyfin 网络设置
为了让 Jellyfin 正确识别通过 Nginx 反向代理访问的客户端的真实 IP 地址,你需要将其添加到 Jellyfin 的“已知代理”列表中。
- 访问 Jellyfin 仪表板:
通过https://jellyfin.your_domain.com访问你的 Jellyfin 实例。 - 导航到网络设置:
进入管理仪表板->网络。 - 添加已知代理:
在“已知代理”部分,添加你的 Nginx 服务器的 IP 地址。如果 Nginx 和 Jellyfin 在同一台服务器上,通常是127.0.0.1。如果 Nginx 在不同的服务器上,请输入该服务器的内部 IP 地址。 - 保存更改。
步骤 6:验证自动证书续订
Certbot 通常会自动设置一个 cron 作业来定期(例如每 90 天)续订你的 Let’s Encrypt 证书。你可以执行一次 dry-run 来测试续订过程是否正常工作,而不会真正续订:
bash
sudo certbot renew --dry-run
如果 dry-run 命令成功完成,则表示自动续订已正确配置,你无需担心证书过期。
总结
恭喜!现在你已经成功为你的 Jellyfin 服务器配置了 HTTPS。通过 Nginx 作为反向代理和 Let’s Encrypt 提供的免费 SSL 证书,你的媒体访问现在是安全的、加密的,并且你的数据得到了有效保护。你可以放心地通过 https://jellyfin.your_domain.com 访问你的媒体库了。