温馨提示×

如何在Ubuntu上配置Jellyfin的SSL

小樊
44
2025-12-30 15:09:24
栏目: 云计算

在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(推荐)

  1. 安装与启用模块
  • sudo apt update && sudo apt install nginx -y
  • 启用模块(按需):sudo a2enmod proxy proxy_http ssl proxy_wstunnel remoteip http2 headers(Nginx 无需 a2enmod,直接安装即可)
  1. 申请证书(Certbot 自动修改 Nginx 配置)
  • sudo certbot --nginx -d your_domain
  • 按提示选择是否重定向 HTTP→HTTPS,完成后证书将自动续期(certbot.timer)
  1. 配置 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
  1. 防火墙与访问
  • 仅放行 80/443:sudo ufw allow 80,443/tcp && sudo ufw enable
  • 访问:https://your_domain(Jellyfin 仍通过 127.0.0.1:8096 提供服务,由 Nginx 终止 SSL)

方式一 反向代理 Apache 配置 SSL(备选)

  1. 安装与启用模块
  • sudo apt install apache2 -y
  • sudo a2enmod proxy proxy_http ssl proxy_wstunnel remoteip http2 headers
  • sudo systemctl restart apache2
  1. 申请证书(Certbot 自动修改 Apache 配置)
  • sudo certbot --apache -d your_domain
  1. 手动虚拟主机示例(如不使用 --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
  1. 防火墙与访问
  • 仅放行 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 支持:确保反向代理对 /socketws:// 代理并添加 X-Forwarded-Proto/Port 头,否则远程播放器可能无法连接
  • 日志排查:
    • Nginx:/var/log/nginx/error.log
    • Apache:/var/log/apache2/error.log
    • Jellyfin:/var/log/jellyfin/*.log
  • 云服务器:除系统防火墙外,还需在云平台安全组放行 80/443(或 8920

0