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即可。至于 Snap,Ubuntu 官方打包的 ampache 版本常年滞后两个大版本,连 Web UI 的暗色模式都缺失,属于“能用但不好用”的典型。
2.2 Apache 为何不可替代?Nginx 真的更快吗?
Ampache 官方文档明确推荐 Apache,这不是历史惯性,而是有硬核技术原因。Ampache 的 URL 路由严重依赖.htaccess文件里的RewriteRule,比如/song/12345这种友好的地址,最终要被重写成/index.php?do=song&id=12345。Apache 的mod_rewrite是经过二十多年打磨的成熟模块,规则解析稳定、调试日志清晰(LogLevel alert rewrite:trace3可以看到每一步重写过程)。而 Nginx 的rewrite指令虽然语法简洁,但在处理 Ampache 这种嵌套多层、带查询参数的复杂重写时,极易出现循环重定向或参数丢失。我实测过:在 Nginx 下,当用户点击“按专辑浏览”时,URL 会莫名其妙地多出一串?do=album&album_id=xxx&%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 要求数据库、表、连接全部设为utf8mb4,MySQL 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用户直接读写,而应创建一个独立用户ampache:sudo 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.local(IPv6 反向解析结果),导致 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 </Directory>AllowOverride All是让.htaccess文件生效的前提。如果写成None,Ampache 的所有 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和KeepAliveTimeout
Ampache 扫描大型音乐库时,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.ini:
memory_limit = 512M
Ampache 扫描时需将大量元数据载入内存。默认128M在处理含 100+ 首歌的专辑时就会Allowed memory size exhausted。512M是经过实测的甜点值——再高(如 1G)对性能无提升,反而浪费资源。max_execution_time = 1200
与 Apache 的Timeout呼应。PHP 脚本执行时间不能短于 Apache 的超时值,否则脚本先挂了。1200秒确保扫描任务能跑完。post_max_size = 1024M和upload_max_filesize = 1024M
Ampache 的 Web UI 支持直接上传 ZIP 压缩包(含专辑封面、歌曲、NFO 文件)。默认2M连一张高清封面都传不了。设为1024M是为未来留余量,实际上传时 Apache 的LimitRequestBody会起作用(见下文)。date.timezone = Asia/Shanghai
再次强调时区!PHP 的date()函数输出必须与系统时区一致,否则 Ampache 的播放统计图表时间轴会错乱。启用关键扩展
确保以下扩展已启用(取消;注释):extension=gd.so extension=mbstring.so extension=xml.so extension=zip.so extension=mysqli.so extension=pdo_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 'ampache'@'localhost' IDENTIFIED BY 'StrongPass123!'; GRANT ALL PRIVILEGES ON ampache.* TO 'ampache'@'localhost'; 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.conf:<VirtualHost *:80> ServerAdmin webmaster@localhost 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 和 MP3
Ampache 的扫描不是“点一下就完事”,它有严格的目录结构认知。你不能把所有音乐扔进/mnt/music就指望它自动分类。必须遵循它的“艺术家/专辑/歌曲”三级结构:
/mnt/music/ ├── The Beatles/ │ ├── Abbey Road/ │ │ ├── 01-Come Together.flac │ │ └── 02-Something.flac │ └── Sgt. Pepper's Lonely Hearts Club Band/ │ └── 01-Sgt. Pepper's 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.log:
如果看到sudo 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 加密:用 Let's Encrypt 免费证书保护你的音乐库
虽然家庭内网用 HTTP 也安全,但如果你打算通过 DDNS 或公网 IP 访问 Ampache(比如出差时听家里的无损音乐),HTTPS 就成了刚需。Let's Encrypt 提供免费、自动续期的证书,配置比想象中简单:
安装 Certbot
sudo apt install -y python3-certbot-apache获取证书(假设你已绑定域名
music.yourdomain.com)sudo 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-age=31536000; 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里extension=mysqli.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.standard
5.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_connections=151,当同时扫描多个目录时可能不够。执行: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(手机连同一 WiFi) | Unknown host | 在手机 WiFi 设置里,为路由器 DNS 手动指定192.168.1.1(你的网关 IP) |
| 端口可达性 | telnet 192.168.1.100 80(手机用 Termux) | Connection refused | 检查 UFW:sudo ufw status,确认Apache Full规则已启用 |
| CORS 头缺失 | 浏览器开发者工具 → Network → 点击任意 API 请求 → Headers | Access-Control-Allow-Origin未出现 | 检查 Apache 的mod_headers是否启用,Header set指令是否在正确<Directory>块内 |
| HTTPS 证书信任 | 手机浏览器访问https://music.yourdomain.com | 显示“不安全”警告 | 在手机上安装 Let's 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%,就需要优化。