Nginx+DigitalOcean Spaces 音频路径问题解决

导出时间:2026/6/8 07:32:18

来源地址:https://www.doubao.com/chat/38429209731734018

消息数量:4

location ~* \.(html|htm)$ { root /你的本地网站根目录; # 这里是示例文字,非法路径 try_files $uri =404; }
我的droplet上是空的没有本地html文件啊。本来所有的都是在s3的bucket里。你是什么意思呢? 我觉得这个是letencrypt的证书问题,是申请没有字域名的问题吧? root@ubuntu-sfo3:/etc/nginx# openssl x509 -text -in /etc/letsencrypt/live/staroceans.com/fullchain.pem Certificate: Data: Version: 3 (0x2) Serial Number: 05:b6:dd:13:1a:0f:84:23:08:51:8b:b1:b3:0c:fd:5d:86:18 Signature Algorithm: ecdsa-with-SHA384 Issuer: C = US, O = Let's Encrypt, CN = YE1 Validity Not Before: Jun 1 21:21:46 2026 GMT Not After : Aug 30 21:21:45 2026 GMT Subject: CN = staroceans.com Subject Public Key Info: Public Key Algorithm: id-ecPublicKey Public-Key: (256 bit) pub: 04:64:c0:f7:23:2e:05:9f:ec:6c:f1:ae:6e:c1:7b: aa:e9:19:d8:90:df:2b:04:69:d3:2e:f5:3e:92:6e: aa:d2:cb:a5:a2:5d:78:c9:7e:91:6b:fb:2c:1f:31: bc:92:97:e5:f3:b9:02:96:27:ae:7a:04:22:fc:1e: f3:11:69:aa:6f ASN1 OID: prime256v1 NIST CURVE: P-256 X509v3 extensions: X509v3 Key Usage: critical Digital Signature X509v3 Extended Key Usage: TLS Web Server Authentication X509v3 Basic Constraints: critical CA:FALSE X509v3 Subject Key Identifier: 4D:01:6A:DE:D1:9B:24:2A:D8:B9:24:8C:D6:C6:84:30:C9:BD:B9:A7 X509v3 Authority Key Identifier: BB:20:CA:47:0B:FE:D7:E5:9C:F9:8F:09:2A:A3:8C:37:45:B1:BC:D8 Authority Information Access: CA Issuers - URI:http://ye1.i.lencr.org/ X509v3 Subject Alternative Name: DNS:staroceans.com X509v3 Certificate Policies: Policy: 2.23.140.1.2.1 X509v3 CRL Distribution Points: Full Name: URI:http://ye1.c.lencr.org/25.crl CT Precertificate SCTs:

问题梳理

  1. 核心事实:你 Droplet 空白、全部文件都在 DO Spaces S3 桶,完全不需要本地 HTML 分支配置,上一轮加的 html 独立 location 是错误改动,立即删掉
  2. SSL 报错实锤:证书 SAN 只有 DNS:staroceans.com,不含 www.staroceans.com,访问 www 域名 SSL 校验失败
plaintext
X509v3 Subject Alternative Name: DNS:staroceans.com
curl www.staroceans.com → 证书不含该域名 → SSL 握手直接失败,就是报错源头。

一、恢复你原本全 S3 代理可用配置(删掉所有 html 本地读取区块)

nginx
server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name staroceans.com www.staroceans.com; # 补上www

    ssl_certificate /etc/letsencrypt/live/staroceans.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/staroceans.com/privkey.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;

    location = / {
        return 302 /index.html;
    }

    location / {
        proxy_pass https://staroceans.org.sfo3.digitaloceanspaces.com/;
        proxy_set_header Host $proxy_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_connect_timeout 30s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;

        expires 30d;
        add_header Cache-Control public;
    }

    access_log /var/log/nginx/s3-proxy.access.log;
    error_log /var/log/nginx/s3-proxy.error.log;
}
逻辑:所有资源 (index.html/mp3/css/img) 全部走 S3,零本地磁盘占用,完全匹配你现状,前端所有相对路径原生生效music/swallow-tireless.mp3 自动代理到 S3 同路径。

二、修复证书:把 www 加入证书 SAN 列表

bash
运行
certbot certonly --nginx -d staroceans.com -d www.staroceans.com
nginx -t && systemctl reload nginx
执行完重新 openssl 查看 SAN 会出现两个 DNS 域名,curl www.staroceans.com SSL 不再报错。

三、补充音频无法播放排查(相对路径生效后仍不能播再处理)

进入 DO Spaces 对应 Bucket → Settings → CORS,配置:
xml
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>https://staroceans.com</AllowedOrigin>
<AllowedOrigin>https://www.staroceans.com</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
浏览器 audio 标签加载 mp3 受 CORS 限制,缺配置会出现资源 200 但播放器无法解码播放。

四、校验步骤

bash
运行
nginx -t
systemctl reload nginx
curl -v https://staroceans.com
curl -v https://www.staroceans.com
两条 curl SSL 握手全部正常、302 跳转 /index.html 即修复完成。
这个是不是访问权限的问题? nick@nick-sager:~/diabloforum$ s3cmd -c ../digitalocean/.s3cfg-do info s3://staroceans.org/music/swallow-tireless.mp3 s3://staroceans.org/music/swallow-tireless.mp3 (object): File size: 320877 Last mod: Thu, 04 Jun 2026 23:13:04 GMT MIME type: audio/mpeg Storage: STANDARD MD5 sum: 9b65148bbddd0be839e5fc0e9847cb14 SSE: none Policy: none CORS: none ACL: 33087228: FULL_CONTROL x-amz-meta-s3cmd-attrs: atime:1780614210/ctime:1780300617/gid:1000/gname:nick/md5:9b65148bbddd0be839e5fc0e9847cb14/mode:33261/mtime:1608757550/uid:1000/uname:nick nick@nick-sager:~/diabloforum$ s3cmd -c ../digitalocean/.s3cfg-do ls s3://staroceans.org/music/swallow-tireless.mp3 2026-06-04 23:13 320877 s3://staroceans.org/music/swallow-tireless.mp3 nick@nick-sager:~/diabloforum$ s3cmd -c ../digitalocean/.s3cfg-do ls s3://staroceans.org/music/*.mp3 nick@nick-sager:~/diabloforum$

一、结论:文件存在,但对象是私有 ACL,外网无法直拉 = Nginx 代理拿不到 MP3,音频 404 / 无法播放

s3cmd info关键字段:
plaintext
ACL:       33087228: FULL_CONTROL
只有该 DO 账号拥有全权限,没有 Public-Read 公共读权限。 你现在 Nginx 用纯proxy_pass https://桶域名/裸代理,不带 S3 签名,S3 直接返回 403 Forbidden,这就是 `` 加载失败根因,不是路径错。

两条现状佐证

  1. ls s3://staroceans.org/music/*.mp3 无输出:Spaces 私有桶不能通配列举对象;
  2. 浏览器直接打开 https://staroceans.org.sfo3.digitaloceanspaces.com/music/swallow-tireless.mp3 → 403。

二、两套解决方案(二选一,不改前端相对路径、不改 Nginx 路由结构)

方案 1:批量开对象公共读(最简单,静态站点首选)

本地执行 s3cmd 批量给 music 目录全部 mp3 开公读:
bash
运行
s3cmd -c ../digitalocean/.s3cfg-do setacl --acl-public s3://staroceans.org/music/*
单文件临时测试:
bash
运行
s3cmd -c ../digitalocean/.s3cfg-do setacl --acl-public s3://staroceans.org/music/swallow-tireless.mp3
执行完再 info 会变成: ACL: *anon*: READ,Nginx 代理、浏览器均可正常拉取。
优点:现有 Nginx 配置不动、相对路径music/xxx.mp3原样生效; 缺点:MP3 全网可直接下载。

方案 2:不开公读,Nginx 做 S3 V4 签名代理(私有资源、不外泄文件)

放弃裸proxy_pass,改用ngx_aws_auth或者 lua 签名插件,Nginx 请求 Spaces 时自动带上 DO Spaces 签名鉴权。
适合不想文件公开,改动成本更高,你当前静态音频优先选方案 1。

三、顺带 CORS(开公读后必配,否则 audio 能下载不能播放)

Bucket 添加 CORS:
xml
<CORSConfiguration>
 <CORSRule>
   <AllowedOrigin>https://staroceans.com</AllowedOrigin>
   <AllowedOrigin>https://www.staroceans.com</AllowedOrigin>
   <AllowedMethod>GET</AllowedMethod>
   <AllowedHeader>*</AllowedHeader>
 </CORSRule>
</CORSConfiguration>

四、你的 Nginx 配置维持不动即可

nginx
location / {
    proxy_pass https://staroceans.org.sfo3.digitaloceanspaces.com/;
    ...
}
公读生效后: /music/swallow-tireless.mp3 → Nginx→Spaces→正常返回音频,前端相对路径完全不用改。

五、证书小收尾

bash
运行
certbot certonly -d staroceans.com -d www.staroceans.com
systemctl reload nginx
解决www.staroceans.comSSL 不匹配报错。