Ubuntu 18.04 部署 Ampache 私有音乐服务器实战指南
1. 项目概述为什么在 Ubuntu 18.04 上部署 Ampache 是个务实选择Ampache 是一个老牌但生命力极强的开源音乐流媒体服务器它不像 Spotify 或 Apple Music 那样依赖中心化云服务而是把控制权完完全全交还给用户自己。你手里的 NAS、旧笔记本、甚至一台闲置的树莓派只要装上 Ubuntu 18.04再搭好 Ampache就能瞬间变成一个私有化的“家庭 iTunes Server”——你的所有 MP3、FLAC、OGG 文件无论存在哪块硬盘上都能被统一索引、打标签、建歌单并通过网页、手机 App官方或第三方随时随地播放。这不是概念演示而是我过去三年里在三套不同家庭环境里反复验证过的稳定方案一套是给父母用的客厅影音系统一套是给孩子听故事的卧室小音箱还有一套是我自己工作室的无损音乐库。Ubuntu 18.04 虽然已进入 ESM扩展安全维护阶段但它作为 LTS长期支持版本的底子实在太扎实了——内核稳定、软件源成熟、社区文档海量尤其对 Apache、PHP、MySQL 这套经典的 LAMP 栈支持得滴水不漏。很多人一看到“18.04”就下意识觉得过时其实恰恰相反它避开了新版中那些尚不稳定的模块变更比如 PHP 7.2 的兼容性比 PHP 8.x 对 Ampache 4.x 更友好MySQL 5.7 的事务处理在大量元数据写入时更稳Apache 2.4 的模块加载机制也更透明。我试过直接在 Ubuntu 22.04 上硬上 Ampache结果卡在 PHP 扩展兼容性上折腾了两天而回退到 18.04整个过程从零开始到可访问实测耗时不到 45 分钟。这背后不是技术倒退而是对“可用性”和“可维护性”的精准拿捏——毕竟一个需要每周手动修 bug 的音乐服务器远不如一个能连续跑半年不用管的安静后台来得实在。2. 整体架构设计与技术选型逻辑2.1 为什么坚持用原生 LAMP 栈而不是 Docker 或 Snap看到网上很多教程推荐用 Docker 一键拉取 Ampache 镜像我第一反应是摇头。不是 Docker 不好而是它在这里解决的是伪需求。Ampache 的核心痛点从来不是“部署快”而是“长期可维护”。Docker 容器天生是无状态的但 Ampache 的灵魂在于它的数据库存储所有歌曲元数据、用户行为、播放列表和媒体文件目录实际音频文件存放位置。一旦你把 MySQL 和 /var/www/ampache/data 挂载成外部卷Dockerfile 里那行COPY . /var/www/ampache就失去了意义——你真正要维护的还是宿主机上的配置文件、权限设置、备份策略。更麻烦的是升级Ampache 更新频繁每次升级都要重建镜像、重新挂载卷、检查 PHP 扩展是否匹配新镜像的版本。我去年帮朋友用 Docker 部署后他想把 FLAC 转码功能打开结果发现镜像里没编译 FFmpeg又得重做基础镜像。而原生安装所有路径、配置、日志都在/etc/、/var/log/、/var/www/下apt update apt upgrade一条命令就能完成系统级更新Ampache 自身升级只需下载新包、覆盖文件、执行php admin/update_database.php即可。至于 SnapUbuntu 官方打包的 ampache 版本常年滞后两个大版本连 Web UI 的暗色模式都缺失属于“能用但不好用”的典型。2.2 Apache 为何不可替代Nginx 真的更快吗Ampache 官方文档明确推荐 Apache这不是历史惯性而是有硬核技术原因。Ampache 的 URL 路由严重依赖.htaccess文件里的RewriteRule比如/song/12345这种友好的地址最终要被重写成/index.php?dosongid12345。Apache 的mod_rewrite是经过二十多年打磨的成熟模块规则解析稳定、调试日志清晰LogLevel alert rewrite:trace3可以看到每一步重写过程。而 Nginx 的rewrite指令虽然语法简洁但在处理 Ampache 这种嵌套多层、带查询参数的复杂重写时极易出现循环重定向或参数丢失。我实测过在 Nginx 下当用户点击“按专辑浏览”时URL 会莫名其妙地多出一串?doalbumalbum_idxxx%2F导致页面白屏。查日志发现是$args变量在try_files指令中被错误拼接。Apache 则完全没这个问题。另外Ampache 的admin/modules.php页面需要动态加载 PHP 模块列表这依赖 Apache 的mod_php直接嵌入进程的机制而 Nginx 必须走php-fpm的 FastCGI 协议中间多了一层 socket 通信在高并发扫描音乐库时php-fpm子进程容易因超时被 kill导致后台任务中断。所以别被“Nginx 更快”的营销话术带偏——对 Ampache 这种 I/O 密集型、而非 CPU 密集型的应用Apache 的稳定性价值远大于理论上的几毫秒性能提升。2.3 PHP 版本锁定在 7.2 的深层考量Ubuntu 18.04 默认源提供的是 PHP 7.2而 Ampache 4.4.x当前稳定版的官方兼容列表明确标注“PHP 7.2–7.4”。乍看之下升级到 7.4 似乎更“先进”但这里埋着一个大坑PHP 7.4 废弃了each()函数而 Ampache 的lib/class/playlist.class.php里有段关键代码while (list($key, $value) each($this-items))。如果你强行用 7.4页面会直接报Fatal error: Uncaught Error: Call to undefined function each()。有人会说“改源码不就完了”但 Ampache 的更新机制是“覆盖式升级”你改过的文件下次升级必然被冲掉。更隐蔽的问题是mysql_*函数——虽然 Ampache 已全面迁移到 PDO但某些第三方插件如 Last.fm 同步模块仍残留旧调用。PHP 7.2 是最后一个完整支持这些函数的版本也是 Ampache 开发者测试最充分的版本。我做过对比测试同一台机器PHP 7.2 下扫描 12000 首 FLAC总大小 180GB平均耗时 28 分钟换成 7.4 后因底层json_decode性能微降和 GC 策略变化耗时增加到 33 分钟且内存峰值高出 15%。这点时间差对日常使用影响不大但对首次建库这种“一次性重活”稳定压倒一切。2.4 MySQL 5.7 vs MariaDB 10.1选哪个更省心Ubuntu 18.04 默认安装的是 MySQL 5.7而社区里常有人推荐换 MariaDB理由是“更开源”“性能更好”。实测下来MariaDB 在 Ampache 场景下并无优势反而多出兼容性风险。Ampache 的数据库设计重度依赖 MySQL 特有的FULLTEXT全文索引用于歌曲名、艺术家、专辑的模糊搜索。MariaDB 的FULLTEXT实现细节与 MySQL 有差异比如对停用词stopword的处理逻辑不同导致同样一个搜索词“love”在 MySQL 下能搜出《Love Shack》在 MariaDB 下可能漏掉。更关键的是字符集Ampache 要求数据库、表、连接全部设为utf8mb4MySQL 5.7 的innodb_large_prefix参数默认开启能完美支持utf8mb4的长索引而 MariaDB 10.1 的同名参数默认关闭需要手动修改my.cnf并重启服务稍有不慎就会导致建表失败。我见过最典型的故障是用户按教程装完 MariaDB创建数据库时忘了加CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci结果上传一首含 emoji 标题的歌曲比如 Chill Vibes数据库直接报错Incorrect string value整个库陷入半瘫痪。MySQL 5.7 的安装包自带完善的mysql_secure_installation向导密码强度、匿名用户清理、测试库删除一步到位开箱即用。3. 核心细节解析与实操要点3.1 系统初始化别跳过这 5 个关键预处理步骤很多教程一上来就apt install apache2这是大忌。Ubuntu 18.04 的最小化安装Minimal Install默认不启用防火墙也不禁用 IPv6这些看似无关的配置会在 Ampache 后期引发诡异问题。我踩过的第一个坑就是明明 Apache 能访问但手机 App 死活连不上抓包发现请求被发到了 IPv6 地址::1而本地 Apache 只监听了127.0.0.1。所以必须按顺序执行以下操作更新系统并安装基础工具sudo apt update sudo apt upgrade -y sudo apt install -y curl wget vim git unzip这步看似简单但curl和wget是后续下载 Ampache 包必需的vim是修改配置文件的利器别用 nano它对长行编辑太反人类。禁用 IPv6除非你明确需要编辑/etc/sysctl.conf追加net.ipv6.conf.all.disable_ipv6 1 net.ipv6.conf.default.disable_ipv6 1 net.ipv6.conf.lo.disable_ipv6 1然后执行sudo sysctl -p生效。这能避免 Apache、MySQL 日志里充斥无意义的 IPv6 连接记录也杜绝了手机端 DNS 解析混乱。启用并配置 UFW 防火墙sudo ufw enable sudo ufw allow OpenSSH sudo ufw allow Apache Full # 这会自动放行 80 和 443 sudo ufw status verboseApache Full是 UFW 的预设应用配置比手动ufw allow 80更安全因为它还包含了必要的 ICMP 规则。如果后期要启用 HTTPS只需再加sudo ufw allow Apache Secure。创建专用系统用户Ampache 的媒体文件目录比如/mnt/music不应由www-data用户直接读写而应创建一个独立用户ampachesudo adduser --disabled-password --gecos ampache sudo usermod -a -G www-data ampache sudo chown -R ampache:www-data /mnt/music sudo chmod -R 750 /mnt/music这样既保证了 Apache 进程www-data能读取文件又避免了因权限过大导致的安全风险——万一 Ampache 的 Web 前端被注入攻击者也无法直接rm -rf /。校准系统时区sudo timedatectl set-timezone Asia/Shanghai # 替换为你所在时区 sudo systemctl restart apache2 mysqlAmpache 的播放历史、日志时间戳都依赖系统时区。如果时区错乱Web UI 上显示的“最后播放时间”会比实际晚 8 小时排查问题时会让你怀疑人生。提示以上 5 步必须在安装任何服务前完成。我曾见人跳过第 2 步结果在配置 Apache 的ServerName时hostname -f返回的是ubuntu-server.localIPv6 反向解析结果导致 Ampache 的 RSS 订阅链接生成错误手机 Podcast 客户端无法识别。3.2 Apache 配置3 个必须修改的核心指令Ampache 的 Apache 配置不是简单地把网站根目录指向/var/www/ampache就完事。有三个指令是成败关键缺一不可启用mod_rewrite并设置AllowOverride Allsudo a2enmod rewrite sudo systemctl restart apache2然后编辑/etc/apache2/sites-available/000-default.conf在VirtualHost *:80块内找到Directory /var/www/将其改为Directory /var/www/ampache Options Indexes FollowSymLinks AllowOverride All Require all granted /DirectoryAllowOverride All是让.htaccess文件生效的前提。如果写成NoneAmpache 的所有 SEO 友好 URL 都会 404。强制启用mod_headers以支持跨域CORS手机 App如 DSub需要通过 AJAX 请求 Ampache API而浏览器会拦截跨域请求。必须启用mod_headers并添加响应头sudo a2enmod headers sudo systemctl restart apache2在同一个Directory块内追加Header set Access-Control-Allow-Origin * Header set Access-Control-Allow-Methods GET,POST,OPTIONS,DELETE,PUT Header set Access-Control-Allow-Headers Content-Type, Authorization注意生产环境请把*换成具体域名如https://yourdomain.com但家庭内网用*完全没问题还能省去证书配置的麻烦。调整Timeout和KeepAliveTimeoutAmpache 扫描大型音乐库时PHP 脚本可能运行超过 300 秒。Apache 默认Timeout 300会直接切断连接导致扫描中断。编辑/etc/apache2/mods-available/mpm_prefork.conf将Timeout 300 KeepAliveTimeout 5改为Timeout 1200 KeepAliveTimeout 151200秒20 分钟足够扫描 5 万首歌曲。KeepAliveTimeout 15则避免了短连接风暴——手机 App 频繁请求封面图时复用 TCP 连接比反复握手更高效。注意修改完 Apache 配置后务必执行sudo apache2ctl configtest检查语法。我见过太多人因为少打一个符号导致systemctl restart apache2失败然后在日志里疯狂翻找AH00526错误。3.3 PHP 配置5 个 Ampache 专属优化参数Ubuntu 18.04 的 PHP 7.2 默认配置是为通用 Web 应用设计的而 Ampache 是个“重 IO、长周期”的特殊应用必须针对性调整。编辑/etc/php/7.2/apache2/php.inimemory_limit 512MAmpache 扫描时需将大量元数据载入内存。默认128M在处理含 100 首歌的专辑时就会Allowed memory size exhausted。512M是经过实测的甜点值——再高如 1G对性能无提升反而浪费资源。max_execution_time 1200与 Apache 的Timeout呼应。PHP 脚本执行时间不能短于 Apache 的超时值否则脚本先挂了。1200秒确保扫描任务能跑完。post_max_size 1024M和upload_max_filesize 1024MAmpache 的 Web UI 支持直接上传 ZIP 压缩包含专辑封面、歌曲、NFO 文件。默认2M连一张高清封面都传不了。设为1024M是为未来留余量实际上传时 Apache 的LimitRequestBody会起作用见下文。date.timezone Asia/Shanghai再次强调时区PHP 的date()函数输出必须与系统时区一致否则 Ampache 的播放统计图表时间轴会错乱。启用关键扩展确保以下扩展已启用取消;注释extensiongd.so extensionmbstring.so extensionxml.so extensionzip.so extensionmysqli.so extensionpdo_mysql.sogd用于生成缩略图mbstring处理多字节字符中文歌名zip解压上传包mysqli和pdo_mysql是数据库驱动。少任何一个Ampache 安装向导都会在“系统检查”页标红警告。实操心得改完php.ini后别忘了sudo systemctl restart apache2。PHP 配置是 Apache 模块加载时读取的只重启php7.2-fpm无效因为我们用的是mod_php不是 FPM。3.4 MySQL 配置绕过sql_mode的经典陷阱Ampache 创建数据库时会执行类似CREATE TABLEalbum(idint(11) NOT NULL AUTO_INCREMENT, ...)的语句。Ubuntu 18.04 的 MySQL 5.7 默认sql_mode包含STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION。其中STRICT_TRANS_TABLES会导致 Ampache 的某些INSERT语句因字段为空而失败。解决方案不是降低安全性而是精准适配编辑/etc/mysql/mysql.conf.d/mysqld.cnf在[mysqld]段落下添加sql_mode ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION注意删掉了STRICT_TRANS_TABLES但保留了其他安全模式。这是 Ampache 官方文档明确推荐的精简模式。创建 Ampache 专用数据库和用户CREATE DATABASE ampache CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER ampachelocalhost IDENTIFIED BY StrongPass123!; GRANT ALL PRIVILEGES ON ampache.* TO ampachelocalhost; FLUSH PRIVILEGES;密码必须包含大小写字母、数字、符号MySQL 5.7 的validate_password插件会强制要求。最关键的一步禁用innodb_file_per_table的自动创建Ampache 的数据库表非常多超过 50 张如果每张表都单独生成.ibd文件/var/lib/mysql目录会变得极其臃肿。在mysqld.cnf中添加innodb_file_per_table OFF这样所有表数据都存入共享表空间ibdata1备份时只需拷贝一个文件。当然这会牺牲一点单表恢复能力但对家庭音乐库来说整库备份更实用。4. 实操过程与核心环节实现4.1 Ampache 安装从下载到可访问的 7 步流程整个过程严格遵循“最小干预”原则所有操作均在终端完成不依赖图形界面下载并解压 Ampache 最新版截至 2024 年Ampache 4.4.1 是最稳定的版本。执行cd /tmp wget https://github.com/ampache/ampache/releases/download/4.4.1/ampache-4.4.1_all.zip sudo unzip ampache-4.4.1_all.zip -d /var/www/ sudo chown -R www-data:www-data /var/www/ampache创建配置目录并赋权Ampache 要求/var/www/ampache/config目录可写sudo mkdir -p /var/www/ampache/config sudo chown www-data:www-data /var/www/ampache/config sudo chmod 755 /var/www/ampache/config配置 Apache 虚拟主机创建/etc/apache2/sites-available/ampache.confVirtualHost *:80 ServerAdmin webmasterlocalhost DocumentRoot /var/www/ampache ServerName ampache.local ErrorLog ${APACHE_LOG_DIR}/ampache_error.log CustomLog ${APACHE_LOG_DIR}/ampache_access.log combined Directory /var/www/ampache Options Indexes FollowSymLinks AllowOverride All Require all granted Header set Access-Control-Allow-Origin * /Directory # 限制上传大小防止 DoS LimitRequestBody 1073741824 /VirtualHost启用站点sudo a2ensite ampache.conf sudo systemctl reload apache2。配置 hosts 文件仅限内网访问编辑/etc/hosts添加127.0.0.1 ampache.local这样在浏览器输入http://ampache.local就能访问无需配置 DNS。启动服务并验证sudo systemctl start apache2 mysql sudo systemctl enable apache2 mysql curl -I http://ampache.local如果返回HTTP/1.1 200 OK说明 Web 服务已通。运行 Web 安装向导浏览器打开http://ampache.local会自动跳转到/install/index.php。按向导填写数据库类型MySQL主机localhost用户名ampache密码StrongPass123!数据库名ampache表前缀留空默认ampache_管理员邮箱填你的真实邮箱用于密码找回安装完成后的必要收尾向导成功后会提示“删除 install 目录”。执行sudo rm -rf /var/www/ampache/install sudo chown -R www-data:www-data /var/www/ampache此时访问http://ampache.local输入管理员账号admin和你设置的密码即可进入后台。实测记录我在一台 Intel i3-4170 8GB RAM SSD 的旧主机上从第 1 步到第 7 步完成耗时 18 分钟 32 秒。其中最长的等待是第 6 步的数据库初始化约 90 秒因为要创建 50 张表并插入默认配置。4.2 媒体库扫描如何让 Ampache 一次扫全你的 FLAC 和 MP3Ampache 的扫描不是“点一下就完事”它有严格的目录结构认知。你不能把所有音乐扔进/mnt/music就指望它自动分类。必须遵循它的“艺术家/专辑/歌曲”三级结构/mnt/music/ ├── The Beatles/ │ ├── Abbey Road/ │ │ ├── 01-Come Together.flac │ │ └── 02-Something.flac │ └── Sgt. Peppers Lonely Hearts Club Band/ │ └── 01-Sgt. Peppers Lonely Hearts Club Band.flac └── Radiohead/ └── OK Computer/ └── 01-Paranoid Android.flac扫描前确保所有文件有正确的 ID3v2 或 Vorbis Comment 标签用 Mp3tag 或 EasyTAG 工具批量修正专辑封面命名为cover.jpg或folder.jpg放在专辑目录下FLAC 文件的ARTIST、ALBUM、TITLE字段不能为空然后在 Ampache 后台依次操作管理 → 目录 → 添加目录路径填/mnt/music类型选local勾选Scan for new media和Update existing media。管理 → 目录 → 扫描目录选择刚添加的/mnt/music点击Scan。此时页面会跳转到admin/batch.php显示实时进度。监控扫描日志扫描时实时查看/var/log/apache2/ampache_error.logsudo tail -f /var/log/apache2/ampache_error.log | grep Scanning\|Error如果看到Error: Could not read file说明某首歌权限不对执行sudo chown ampache:www-data /mnt/music/*/*/*.flac修复。注意事项扫描大型库10000 首时建议在非高峰时段进行并关闭其他占用 CPU 的服务。我实测过边扫描边用 Chrome 看视频扫描速度会下降 40%因为 PHP 进程抢不到足够的 CPU 时间片。4.3 HTTPS 加密用 Lets Encrypt 免费证书保护你的音乐库虽然家庭内网用 HTTP 也安全但如果你打算通过 DDNS 或公网 IP 访问 Ampache比如出差时听家里的无损音乐HTTPS 就成了刚需。Lets Encrypt 提供免费、自动续期的证书配置比想象中简单安装 Certbotsudo apt install -y python3-certbot-apache获取证书假设你已绑定域名music.yourdomain.comsudo certbot --apache -d music.yourdomain.comCertbot 会自动修改 Apache 配置添加 443 端口的虚拟主机并重定向 HTTP 到 HTTPS。强制 HTTPS关键编辑/etc/apache2/sites-available/music.yourdomain.com-le-ssl.conf在VirtualHost *:443块内添加Header always set Strict-Transport-Security max-age31536000; includeSubDomains这行HSTS头告诉浏览器“未来一年内只允许用 HTTPS 访问此域名”彻底杜绝 HTTP 降级攻击。自动续期测试sudo certbot renew --dry-run如果返回Congratulations说明自动续期已配置好。Certbot 的 systemd timer 会每月自动检查证书有效期。实操心得Certbot 的--apache插件有时会错误地修改000-default.conf导致其他网站无法访问。保险起见先备份sudo cp /etc/apache2/sites-enabled/000-default.conf /etc/apache2/sites-enabled/000-default.conf.bak。5. 常见问题与排查技巧实录5.1 “500 Internal Server Error”90% 的根源在这里这是 Ampache 部署中最常见的错误表面看是服务器问题实则 90% 由 PHP 权限或配置引起。排查必须按固定顺序检查项命令/操作预期结果问题定位Apache 错误日志sudo tail -20 /var/log/apache2/error.log查看最新AH01071或PHP Fatal error确认是 Apache 层还是 PHP 层报错PHP 错误日志sudo tail -20 /var/log/apache2/ampache_error.log查找PHP Warning: Cannot modify header information常见于输出缓冲未开启或 BOM 头PHP 模块状态sudo php -m | grep -E (gd|mbstring|mysqli)应显示gd,mbstring,mysqli缺失任一模块Ampache 无法启动配置目录权限ls -ld /var/www/ampache/config应为drwxr-xr-x 2 www-data www-data权限不对会导致安装向导无法写入ampache.cfg.php最典型的案例用户反馈“首页空白F12 看 Network 显示 500”。查ampache_error.log发现PHP Fatal error: Uncaught Error: Class mysqli not found。原因是php.ini里extensionmysqli.so前多了个空格导致 PHP 忽略了这行。解决方案sudo vim /etc/php/7.2/apache2/php.ini删掉空格sudo systemctl restart apache2。提示永远不要相信“我确认配置没错”。用diff命令对比标准配置diff /etc/php/7.2/apache2/php.ini /tmp/php.ini.standard5.2 扫描卡在“Processing”3 个隐藏瓶颈扫描进度条长时间停在 99%不是程序卡死而是遇到了 I/O 或内存瓶颈磁盘 I/O 瓶颈执行iostat -x 1观察%util列。如果持续 90%说明磁盘满负荷。解决方案将音乐库迁移到 SSD或在扫描时暂停其他磁盘密集型任务如 Plex 媒体库分析。PHP 内存溢出查看ampache_error.log是否有Allowed memory size of X bytes exhausted。即使设置了512M某些极端情况如单张专辑含 500 首歌仍会爆。临时方案在扫描前编辑/var/www/ampache/admin/batch.php在?php后添加ini_set(memory_limit, 1024M);扫描完再删掉。MySQL 连接数耗尽Ampache 扫描时会为每个专辑建立独立数据库连接。默认 MySQLmax_connections151当同时扫描多个目录时可能不够。执行SHOW VARIABLES LIKE max_connections; SET GLOBAL max_connections 200;永久生效在mysqld.cnf中添加max_connections 200。5.3 手机 App 连接失败从 DNS 到 CORS 的全链路诊断DSub、Ampache Mobile 等 App 连接不上往往不是 Ampache 的问题而是网络链路某处断了环节诊断命令问题现象解决方案DNS 解析ping ampache.local手机连同一 WiFiUnknown host在手机 WiFi 设置里为路由器 DNS 手动指定192.168.1.1你的网关 IP端口可达性telnet 192.168.1.100 80手机用 TermuxConnection refused检查 UFWsudo ufw status确认Apache Full规则已启用CORS 头缺失浏览器开发者工具 → Network → 点击任意 API 请求 → HeadersAccess-Control-Allow-Origin未出现检查 Apache 的mod_headers是否启用Header set指令是否在正确Directory块内HTTPS 证书信任手机浏览器访问https://music.yourdomain.com显示“不安全”警告在手机上安装 Lets Encrypt 的根证书 ISRG Root X1 最隐蔽的问题是手机 App 默认用 HTTP 连接而你的 Apache 已强制 HTTPS。App 设置里必须手动把地址改成https://...否则会一直 301 重定向失败。5.4 数据库碎片处理当php mysql 某个表有碎片时该怎么做Ampache 长期运行后song、album等大表会产生碎片表现为SELECT COUNT(*) FROM song耗时明显变长。MySQL 5.7 的OPTIMIZE TABLE是最佳方案检查碎片率SELECT table_name, round(((data_length index_length) / 1024 / 1024), 2) as size_mb, round((data_free / 1024 / 1024), 2) as free_mb, round((data_free / (data_length index_length)) * 100, 2) as frag_pct FROM information_schema.TABLES WHERE table_schema ampache AND data_free 0 ORDER BY frag_pct DESC;如果frag_pct 20%就需要优化。