在Ubuntu上为Jellyfin配置SSL的两种常用方式
- 方式一:使用 Nginx/Apache 反向代理 + Let’s Encrypt,对外仅暴露 443/80,Jellyfin 继续在本地 8096 运行,便于统一管理证书与HTTP/2。
- 方式二:在 Jellyfin 内置 Web 服务上直接使用 HTTPS(不推荐,证书更新与端口管理不便,但步骤更短)。
前置准备
- 已安装并运行 Jellyfin(默认监听 http://127.0.0.1:8096)。
- 拥有可解析到服务器的域名,并指向服务器公网/内网IP。
- 开放防火墙端口:建议仅开放 80/443;如需临时测试再放行 8096。示例(UFW):sudo ufw allow 80,443/tcp && sudo ufw enable。
- 安装证书工具(任选其一):sudo apt install certbot python3-certbot-nginx 或 sudo apt install certbot python3-certbot-apache。
- 如用云服务器,还需在云平台安全组放行 80/443。
方式一 反向代理 Nginx 配置 SSL(推荐)
- 安装与启用模块
- sudo apt update && sudo apt install nginx -y
- 启用模块(按需):sudo a2enmod proxy proxy_http ssl proxy_wstunnel remoteip http2 headers(Nginx 无需 a2enmod,直接安装即可)
- 申请证书(Certbot 自动修改 Nginx 配置)
- sudo certbot --nginx -d your_domain
- 按提示选择是否重定向 HTTP→HTTPS,完成后证书将自动续期(certbot.timer)
- 配置 Nginx 反向代理(示例)
- 新建配置:sudo nano /etc/nginx/sites-available/jellyfin
- 粘贴以下内容(将 your_domain 替换为你的域名):
server {
listen 80;
server_name your_domain;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name your_domain;
ssl_certificate /etc/letsencrypt/live/your_domain/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/your_domain/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;
# 安全与性能
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
client_max_body_size 100M;
location / {
proxy_pass http://127.0.0.1:8096;
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-Port $server_port;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
- 启用站点并重启:sudo ln -s /etc/nginx/sites-available/jellyfin /etc/nginx/sites-enabled && sudo nginx -t && sudo systemctl reload nginx
- 防火墙与访问
- 仅放行 80/443:sudo ufw allow 80,443/tcp && sudo ufw enable
- 访问:https://your_domain(Jellyfin 仍通过 127.0.0.1:8096 提供服务,由 Nginx 终止 SSL)
方式一 反向代理 Apache 配置 SSL(备选)
- 安装与启用模块
- sudo apt install apache2 -y
- sudo a2enmod proxy proxy_http ssl proxy_wstunnel remoteip http2 headers
- sudo systemctl restart apache2
- 申请证书(Certbot 自动修改 Apache 配置)
- sudo certbot --apache -d your_domain
- 手动虚拟主机示例(如不使用 --apache 自动配置)
- 新建:sudo nano /etc/apache2/sites-available/jellyfin.conf
- 粘贴以下内容(按需调整域名与证书路径):
<VirtualHost *:80>
ServerName your_domain
Redirect permanent / https://your_domain/
</VirtualHost>
<VirtualHost *:443>
ServerName your_domain
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/your_domain/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/your_domain/privkey.pem
ProxyPreserveHost On
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-Port "443"
ProxyPass "/socket" "ws://127.0.0.1:8096/socket"
ProxyPassReverse "/socket" "ws://127.0.0.1:8096/socket"
ProxyPass "/" "http://127.0.0.1:8096/"
ProxyPassReverse "/" "http://127.0.0.1:8096/"
</VirtualHost>
- 启用站点并重启:sudo a2ensite jellyfin.conf && sudo systemctl reload apache2
- 防火墙与访问
- 仅放行 80/443:sudo ufw allow 80,443/tcp && sudo ufw enable
- 访问:https://your_domain
方式二 Jellyfin 内置 HTTPS 直配(不推荐)
- 将证书与私钥复制到 Jellyfin 证书目录(示例):
- 证书:/etc/letsencrypt/live/your_domain/fullchain.pem
- 私钥:/etc/letsencrypt/live/your_domain/privkey.pem
- 建议软链到 Jellyfin 证书目录(路径因安装方式不同可能为 /var/lib/jellyfin/.dotnet/… 或 /usr/share/jellyfin/.dotnet/…),并设置仅 jellyfin 用户可读:
- sudo mkdir -p /etc/jellyfin/ssl
- sudo ln -s /etc/letsencrypt/live/your_domain/fullchain.pem /etc/jellyfin/ssl/jellyfin.crt
- sudo ln -s /etc/letsencrypt/live/your_domain/privkey.pem /etc/jellyfin/ssl/jellyfin.key
- sudo chown -R jellyfin:jellyfin /etc/jellyfin/ssl && sudo chmod 600 /etc/jellyfin/ssl/*.pem
- 在 Jellyfin 管理后台启用 HTTPS:
- 进入 控制台 → 网络 → 高级 → 启用 HTTPS,指定端口(如 8920),证书与密钥路径指向 /etc/jellyfin/ssl/jellyfin.crt 与 /etc/jellyfin/ssl/jellyfin.key
- 重启 Jellyfin:sudo systemctl restart jellyfin
- 防火墙放行 8920/tcp,访问:https://your_domain:8920
- 注意:证书续期后需同步更新 Jellyfin 证书文件或重启服务,维护成本较高
验证与常见问题
- 验证证书与链:sudo certbot certificates;浏览器访问应显示 HTTPS 锁标识 与有效证书链
- 自动续期测试:sudo certbot renew --dry-run(无报错说明续期正常)
- 端口与访问:
- 反向代理方案:仅开放 80/443,Jellyfin 仍用 8096;访问 https://your_domain
- 内置 HTTPS 方案:开放 8920;访问 https://your_domain:8920
- WebSocket 支持:确保反向代理对 /socket 做 ws:// 代理并添加 X-Forwarded-Proto/Port 头,否则远程播放器可能无法连接
- 日志排查:
- Nginx:/var/log/nginx/error.log
- Apache:/var/log/apache2/error.log
- Jellyfin:/var/log/jellyfin/*.log
- 云服务器:除系统防火墙外,还需在云平台安全组放行 80/443(或 8920)