Ubuntu 22.04 安装 myTinyTodo 1.8.6 指南
Ubuntu 22.04 从零安装 myTinyTodo 1.8.6 实测指南:Nginx+PHP-FPM 与 Apache2+mod_php 双方案、SQLite 与 MariaDB 双后端、systemd 托管、安装向导、502/PDO_MySQL 等排障实录与卸载清理。
Ubuntu 22.04 安装 myTinyTodo 1.8.6 指南
目标:在一台 Ubuntu 22.04 LTS 服务器上从零安装 myTinyTodo 1.8.6(PHP 待办清单应用),覆盖 Nginx + PHP-FPM 与 Apache2 + mod_php 两套 Web 运行方案、SQLite 与 MySQL/MariaDB 两种数据库后端、systemd 托管、安装向导、常见故障排查与卸载清理。文中全部命令与回显均在 Ubuntu 22.04.5 LTS(x86_64)环境逐条实测通过。
一、环境信息
本文实测环境(真实服务器视角,以下版本号均来自环境中实际命令回显):
| 项目 | 值 |
|---|---|
| 操作系统 | Ubuntu 22.04.5 LTS(x86_64) |
| Web 服务器(方案 A) | nginx 1.18.0(Ubuntu 软件源包 nginx-core 1.18.0-6ubuntu14.21) |
| Web 服务器(方案 B) | Apache 2.4.52(Ubuntu 软件源包 apache2 2.4.52-1ubuntu4.25) |
| PHP | 8.1.2-1ubuntu2.28(php-fpm 与 libapache2-mod-php8.1 两种形态) |
| 数据库(默认) | SQLite 3.37.2(系统库,随 php-sqlite3 使用) |
| 数据库(变体) | MariaDB 10.6.23-0ubuntu0.22.04.1 |
| 应用版本 | myTinyTodo v1.8.6(官方 tar 包 386,781 字节,md5 8d10584e6ee6d0e85336a3b2abf8684f) |
| 应用目录 | /var/www/mytinytodo-app |
| 监听端口 | 80(Web) |
| SQLite 数据文件 | /var/www/mytinytodo-app/db/todolist.db |
| PHP-FPM 套接字 | /run/php/php8.1-fpm.sock |
二、前置条件
2.1 系统要求(官方兼容矩阵)
myTinyTodo 官方 README 声明的系统要求(查询日期 2026-10-24,来源 github.com/maxpozdeev/mytinytodo):
| 依赖项 | 要求 |
|---|---|
| PHP | 7.4 或更高 |
| PHP 扩展(必需) | mbstring |
| PHP 扩展(按数据库选型) | SQLite 版:pdo_sqlite、intl;MySQL 版:pdo_mysql 或 mysqli;PostgreSQL 版:pdo_pgsql |
| 数据库 | MySQL 5.7+ / MariaDB 10.2+ / PostgreSQL 10+ / SQLite(系统库),三选一 |
| 浏览器 | Chrome 49+、Safari 10+、Firefox 53+(不支持 IE) |
💡 技术拓展:三种数据库后端如何选——SQLite 零外部依赖、数据就是单个文件(备份即拷贝),是个人使用的默认推荐;MySQL/MariaDB 适合已有数据库实例、需要数据库侧运维工具的场景;PostgreSQL 适合统一 PG 技术栈的团队。本指南方案 A/B 默认走 SQLite,方案 C 演示切换 MySQL/MariaDB。
2.2 安装基础工具
准备 wget(下载官方包)、curl(验证)与 sqlite3(检查数据文件,可选):
apt-get install -y wget curl sqlite3 ca-certificates
安装后确认版本(实测回显):
wget --version | head -1
curl --version | head -1
sqlite3 --version
实测输出:
GNU Wget 1.21.2 built on linux-gnu.
curl 7.81.0 (x86_64-pc-linux-gnu) libcurl/7.81.0 OpenSSL/3.0.2 zlib/1.2.11 brotli/1.0.9 zstd/1.4.8 libidn2/2.3.2 libpsl/0.21.0 (+libidn2/2.3.2) libssh/0.9.6/openssl zlib nghttp2/1.43.0 librtmp/2.3 OpenLDAP/2.5.20
3.37.2 2022-01-06 13:25:41 872ba256cbf61d9290b571c0e6d82a20c224ca3ad82971edc46b29818d5dalt1
2.3 安装 Web 运行环境(Nginx + PHP-FPM,方案 A 依赖)
apt-get install -y nginx php-fpm php-sqlite3 php-mbstring php-intl php-xml
输出节选(实测,Setting up 段):
Setting up php8.1-cli (8.1.2-1ubuntu2.28) ...
update-alternatives: using /usr/bin/php8.1 to provide /usr/bin/php (php) in auto mode
Creating config file /etc/php/8.1/cli/php.ini with new version
Setting up nginx-core (1.18.0-6ubuntu14.21) ...
Setting up nginx (1.18.0-6ubuntu14.21) ...
Setting up php8.1-fpm (8.1.2-1ubuntu2.28) ...
Creating config file /etc/php/8.1/fpm/php.ini with new version
Created symlink /etc/systemd/system/multi-user.target.wants/php8.1-fpm.service → /lib/systemd/system/php8.1-fpm.service.
Setting up php-fpm (2:8.1+92ubuntu1) ...
确认版本(实测回显):
php -v | head -1
nginx -v
PHP 8.1.2-1ubuntu2.28 (cli) (built: Oct 19 2026 18:54:45) (NTS)
nginx version: nginx/1.18.0 (Ubuntu)
⚠️ 注意:PHP 版本必须是 7.4+。若你在更老的系统源里只有 PHP 7.x,需要先加 ondrej/php PPA 升级 PHP;v1.8.4 起官方已适配 PHP 8.6,v1.8.6 修复了 PHP 8.5+ 的 PDO 类弃用告警,新装环境建议直接用 PHP 8.1+ 与 myTinyTodo v1.8.6。
三、版本选型说明
3.1 版本时间线(实查官方 Releases,查询日期 2026-10-24)
| 版本 | 发布日期 | 关键变化(官方 Release Notes) |
|---|---|---|
| v1.8.6 | 2026-10-20 | 修复 PHP 8.5+ 因 PDO 类变更产生的弃用告警 |
| v1.8.5 | 2026-10-19 | 修复 v1.8.4 引入的 PHP 7.x 不兼容错误 |
| v1.8.4 | 2026-09-29 | 标签云新增「Any tag」过滤;标签云改按字母序;修 PostgreSQL 导出 iCal/CSV/RSS 报错;兼容 PHP 8.6;更新中/德/波翻译 |
| v1.8.3 | 2025-05-29 | 维护版本 |
| v1.8.2 | 2025-05-13 | 维护版本 |
| v1.8.1 | 2024-01-28 | 维护版本 |
| v1.8.0 | 2023-11-30 | 大版本 |
关键差异与如何选:新装一律选最新稳定版 v1.8.6——它是当前唯一同时覆盖 PHP 7.x(v1.8.5 修复回退)与 PHP 8.5/8.6(v1.8.4/1.8.6 适配)两端兼容性的版本;近 30 天连发 3 版说明项目处于活跃修复期,老版本(≤v1.8.3)在新 PHP 上存在已知兼容问题,不建议新装。
3.2 下载地址与完整性校验值
官方唯一发布渠道是 GitHub Releases(截至 2026-10-24 官方不提供系统软件源与官方容器镜像):
| 文件 | 值 |
|---|---|
| 下载 URL | https://github.com/maxpozdeev/mytinytodo/releases/download/v1.8.6/mytinytodo-v1.8.6.tar.gz |
| 大小 | 386,781 字节 |
| MD5 | 8d10584e6ee6d0e85336a3b2abf8684f |
| SHA-256 | 597e00a4160fad7107d08e9bc44b0e6bc1f90042a5870bff8527c30791c87d6c |
四、安装方案 A:Nginx + PHP-FPM + SQLite(推荐)
本方案是 myTinyTodo 的默认形态:Nginx 处理 HTTP,PHP-FPM 以 Unix 套接字承载 PHP,SQLite 单文件存数据,全程不需要独立数据库服务。
4.1 下载官方包
cd /root
wget https://github.com/maxpozdeev/mytinytodo/releases/download/v1.8.6/mytinytodo-v1.8.6.tar.gz
输出节选(实测尾部):
150K .......... .......... .......... .......... .......... 52% 77.5M 0s
200K .......... .......... .......... .......... .......... 66% 365M 0s
250K .......... .......... .......... .......... .......... 79% 362M 0s
300K .......... .......... .......... .......... .......... 92% 99.3M 0s
350K .......... .......... ....... 100% 322M=0.009s
2026-10-24 00:46:09 (40.0 MB/s) - 'mytinytodo-v1.8.6.tar.gz' saved [386781/386781]
校验完整性(与 3.2 表比对,实测回显):
md5sum mytinytodo-v1.8.6.tar.gz
sha256sum mytinytodo-v1.8.6.tar.gz
8d10584e6ee6d0e85336a3b2abf8684f mytinytodo-v1.8.6.tar.gz
597e00a4160fad7107d08e9bc44b0e6bc1f90042a5870bff8527c30791c87d6c mytinytodo-v1.8.6.tar.gz
4.2 解压与授权
tar -C /var/www -xzf mytinytodo-v1.8.6.tar.gz
mv /var/www/mytinytodo /var/www/mytinytodo-app
chown -R www-data:www-data /var/www/mytinytodo-app
确认目录与属主(实测回显):
ls -l /var/www/mytinytodo-app | head -8
ls -ld /var/www/mytinytodo-app /var/www/mytinytodo-app/db
-rw-r--r-- 1 501 staff 2082 Oct 20 17:52 COPYRIGHT
-rwxr-xr-x 1 501 staff 18092 Oct 20 17:52 LICENSE
-rw-r--r-- 1 501 staff 7574 Oct 20 17:52 api.php
-rw-r--r-- 1 501 staff 529 Oct 20 17:52 config-sample.php
drwxr-xr-x 4 501 staff 4096 Oct 24 00:46 content
drwxr-xr-x 2 501 staff 4096 Oct 24 00:46 db
-rw-r--r-- 1 501 staff 5757 Oct 20 17:52 export.php
drwxr-xr-x 6 www-data www-data 4096 Oct 20 17:52 /var/www/mytinytodo-app
drwxr-xr-x 2 www-data www-data 4096 Oct 24 00:46 /var/www/mytinytodo-app/db
💡 说明:tar 包内的文件属主是打包者的 UID(501/staff),
chown -R www-data:www-data让 Web 服务运行用户拥有全部文件——这是应用能写入db/目录(创建 SQLite 文件)的前提。www-data是 Ubuntu 上 Nginx/Apache 默认的运行用户。
4.3 Nginx 站点配置
写入站点配置文件 /etc/nginx/sites-available/mytinytodo.conf:
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/mytinytodo-app;
index index.php index.html;
server_name _;
location / {
try_files $uri $uri/ /index.php;
}
location ~ [^/]\.php(/|$) {
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
}
location ~ /\.ht { deny all; }
}
逐项说明:
listen 80 default_server:监听 80 端口并作为默认站点(单应用服务器场景);[::]:80同时覆盖 IPv6。root /var/www/mytinytodo-app:应用目录,即 4.2 的部署位置。index index.php index.html:目录默认页优先 index.php(myTinyTodo 入口)。try_files $uri $uri/ /index.php:先找静态文件,找不到统一回落到 index.php(myTinyTodo 前端是单页应用)。fastcgi_pass unix:/run/php/php8.1-fpm.sock:PHP 交给 FPM 的 Unix 套接字处理(Ubuntu php8.1-fpm 包的默认套接字路径,见/etc/php/8.1/fpm/pool.d/www.conf的listen = /run/php/php8.1-fpm.sock)。location ~ /\.ht { deny all; }:拒绝访问.htaccess等隐藏文件(Apache 语义的访问控制文件在 Nginx 下不生效,必须显式屏蔽,尤其db/.htaccess所在的数据目录)。
启用站点并关闭默认站点(避免与 default_server 冲突):
ln -sf /etc/nginx/sites-available/mytinytodo.conf /etc/nginx/sites-enabled/mytinytodo.conf
rm -f /etc/nginx/sites-enabled/default
nginx -t
实测回显:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
4.4 systemd 托管与启动验证
systemctl enable --now php8.1-fpm nginx
systemctl is-active php8.1-fpm nginx
实测回显:
Synchronizing state of nginx.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable nginx
active
active
HTTP 层验证(实测回显):
curl -s -o /dev/null -w "%{http_code}\n" http://localhost/
200
4.5 运行安装向导(setup.php)
浏览器打开 http://<服务器地址>/setup.php,向导分两步:
- 第一步:选择数据库类型。页面上是三个单选——
SQLite(默认选中)、MySQL、PostgreSQL (beta);选 SQLite 无需填任何连接信息,直接点 Next。此时向导生成/var/www/mytinytodo-app/config.php。 - 第二步:页面显示
This will create myTinyTodo database,点 Install 建表。
无浏览器时也可用 curl 走完全部步骤(从第一步页面提取 stoken 令牌后依次 POST,stoken 每步都会刷新)。两步之后的完成页文本(实测回显):
myTinyTodo 1.8.6 Setup Done Attention! Delete this file for security reasons. Go to homepage .
向导完成后确认生成的配置与数据文件(实测回显):
cat /var/www/mytinytodo-app/config.php
ls -la /var/www/mytinytodo-app/db/
<?php
// myTinyTodo Database connection configuration
define('MTT_DB_TYPE', 'sqlite');
define('MTT_DB_HOST', 'localhost');
define('MTT_DB_USER', 'mtt');
define('MTT_DB_PASSWORD', 'mtt');
define('MTT_DB_NAME', 'mytinytodo');
define('MTT_DB_PREFIX', '');
define('MTT_DB_DRIVER', '');
define('MTT_SALT', '0fdd0165-c40c-499d-bf6c-755c6e48ce48');
-rw-r--r-- 1 www-data www-data 69632 Oct 24 00:47 todolist.db
💡 说明:
MTT_SALT是向导自动生成的随机盐(每次安装不同),用于会话与令牌派生,不要照抄本文值;SQLite 后端下MTT_DB_HOST/USER/PASSWORD/NAME四项不生效,属占位值。数据表共 6 张(lists / todolist / tags / tag2task / settings / sessions),可用sqlite3 /var/www/mytinytodo-app/db/todolist.db ".tables"验证,实测输出lists sessions settings tag2task tags todolist。
4.6 设置站点与访问密码
浏览器打开 http://<服务器地址>/settings.php,在 Password 处设置管理口令(本文示例使用 q1w2e3r4),同时可顺手把 Language 改为 中文 (简体)、Timezone 改为 Asia/Shanghai,点 Save settings。保存后设置立即生效(口令以 SHA-256 哈希形式存入数据库,实测设置接口返回 {"saved":1})。
⚠️ 注意:不设密码时 myTinyTodo 对所有能访问到端口的人开放读写;哪怕只在内网,也建议设置口令。
4.7 删除安装向导
按向导提示删除 setup.php(安全要求——它能在已有配置上重建/升级数据库):
rm /var/www/mytinytodo-app/setup.php
至此方案 A 安装完成。打开 http://<服务器地址>/,输入口令即可开始使用。
五、安装方案 B:Apache2 + mod_php
与方案 A 二选一(两者都抢 80 端口)。Apache 方案用 mod_php 内嵌运行 PHP,不需要 FPM,配置更少;代价是 Apache 进程模型内存占用略高。应用目录与数据与方案 A 完全共用,切换方案不影响已建的任务数据。
5.1 安装 Apache 与 PHP 模块
apt-get install -y apache2 libapache2-mod-php8.1
输出节选(实测):
Setting up apache2-bin (2.4.52-1ubuntu4.25) ...
Setting up libapache2-mod-php8.1 (8.1.2-1ubuntu2.28) ...
Creating config file /etc/php/8.1/apache2/php.ini with new version
Setting up apache2 (2.4.52-1ubuntu4.25) ...
Enabling module mpm_prefork.
Enabling module php8.1.
💡 说明:
libapache2-mod-php8.1安装时会自动把多路复用模块从mpm_event切到mpm_prefork(mod_php 只能跑在 prefork 下)并启用php8.1模块,这两步无需手工执行。
5.2 配置虚拟主机
写入 /etc/apache2/sites-available/mytinytodo.conf:
<VirtualHost *:80>
ServerName _
DocumentRoot /var/www/mytinytodo-app
<Directory /var/www/mytinytodo-app>
AllowOverride None
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/mtt_error.log
CustomLog ${APACHE_LOG_DIR}/mtt_access.log combined
</VirtualHost>
逐项说明:DocumentRoot 指向应用目录;Require all granted 放行访问(Apache 2.4 语法);AllowOverride None 表示不读 .htaccess(myTinyTodo 的 .htaccess 仅用于 Apache 默认目录布局,显式 vhost 下不需要);日志独立成 mtt_error.log/mtt_access.log 便于排障。
切换站点并停掉 Nginx(释放 80 端口):
a2dissite 000-default
a2ensite mytinytodo
systemctl stop nginx
systemctl enable --now apache2
实测回显(enable 段):
Synchronizing state of apache2.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable apache2
5.3 配置检查与验证
apachectl configtest
systemctl is-active apache2
curl -s -o /dev/null -w "%{http_code}\n" http://localhost/
curl -s -I http://localhost/ | grep -i "^Server"
实测回显:
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 10.89.67.3. Set the 'ServerName' directive globally to suppress this message
Syntax OK
active
200
Server: Apache/2.4.52 (Ubuntu)
configtest 输出的 Syntax OK 表示配置可用;AH00558 行只是 FQDN 提示性告警(处理方式见 9.3)。Server: Apache/2.4.52 (Ubuntu) 确认请求由 Apache 承载,首页 200 且页面内容正常(15540 字节,访问日志实测 127.0.0.1 - - [24/Oct/2026:00:52:56 +0000] "GET / HTTP/1.1" 200 15540 "-" "curl/7.81.0")。
⚠️ 注意:从方案 A 切到方案 B 后无需重跑安装向导——
config.php与数据库都在应用目录/数据库服务里,与 Web 服务器无关。若 Apache 下访问出现 PHP 源码直出或下载提示,检查php8.1模块是否启用(a2enmod php8.1 && systemctl reload apache2)。
六、安装方案 C:切换 MySQL/MariaDB 数据库后端
SQLite 之外的官方支持后端。本方案演示在同一台服务器上把 myTinyTodo 从 SQLite 切到 MariaDB(全新建库;如果是迁移存量数据请另行走导出/导入流程)。
6.1 安装 MariaDB 与 PHP MySQL 扩展
apt-get install -y mariadb-server php-mysql
systemctl start mariadb
systemctl is-active mariadb
php -m | grep -i pdo_mysql
实测回显:
active
pdo_mysql
MariaDB 版本确认(实测回显):
mysql -uroot -e "SELECT VERSION();"
VERSION()
10.6.23-MariaDB-0ubuntu0.22.04.1
6.2 建库与授权
mysql -uroot -e "CREATE DATABASE IF NOT EXISTS mytinytodo CHARACTER SET utf8mb4; CREATE USER IF NOT EXISTS 'mtt'@'localhost' IDENTIFIED BY 'mtt'; GRANT ALL PRIVILEGES ON mytinytodo.* TO 'mtt'@'localhost'; FLUSH PRIVILEGES;"
成功后无输出(MySQL 客户端惯例)。验证建库结果可用 mysql -uroot -e "SHOW DATABASES;" 查看 mytinytodo 是否在列。
6.3 重新运行安装向导(MySQL 表单)
先备份并移除现有 config.php(向导只有在没有配置文件时才会走「选择数据库类型」分支):
mv /var/www/mytinytodo-app/config.php /root/config.php.sqlite.bak
浏览器打开 http://<服务器地址>/setup.php:
- 数据库类型选 MySQL,表单展开后填写:Host
localhost、Databasemytinytodo、Usermtt、Passwordmtt、Table prefixmtt_(表单默认值,可改); - 点 Next → 显示
This will create myTinyTodo database→ 点 Install; - 完成页同样提示 Done / Delete this file for security reasons,此时记得删除
setup.php。
⚠️ 注意:若向导报
Database connection error: Required PHP extension 'PDO_MySQL' is not installed.,是 Web 服务进程还没加载新装的 php-mysql 扩展——执行systemctl reload apache2(方案 B)或systemctl restart php8.1-fpm(方案 A)后重试。本指南实测时即遇到此报错,reload 后向导一次通过。
6.4 验证 MySQL 后端
生成的 config.php(实测回显):
<?php
// myTinyTodo Database connection configuration
define('MTT_DB_TYPE', 'mysql');
define('MTT_DB_HOST', 'localhost');
define('MTT_DB_USER', 'mtt');
define('MTT_DB_PASSWORD', 'mtt');
define('MTT_DB_NAME', 'mytinytodo');
define('MTT_DB_PREFIX', 'mtt_');
define('MTT_DB_DRIVER', '');
define('MTT_SALT', 'b90e53cf-9fb1-4418-b076-aec1cf8ef2e8');
数据库侧建表结果(实测回显):
mysql -uroot mytinytodo -e "SHOW TABLES;"
Tables_in_mytinytodo
mtt_lists
mtt_sessions
mtt_settings
mtt_tag2task
mtt_tags
mtt_todolist
默认清单已创建(实测回显):
mysql -uroot mytinytodo -e "SELECT id,name FROM mtt_lists;"
id name
1 Todo
HTTP 验证(实测回显):curl -s -o /dev/null -w "%{http_code}\n" http://localhost/ → 200。
七、方案对比与选择建议
7.1 Web 运行方案对比
| 维度 | 方案 A:Nginx + PHP-FPM | 方案 B:Apache2 + mod_php |
|---|---|---|
| 包组合 | nginx + php-fpm | apache2 + libapache2-mod-php8.1 |
| PHP 运行方式 | 独立 FPM 进程池,Unix 套接字 | Apache 内嵌模块(需 mpm_prefork) |
| 配置量 | 站点文件 1 个(~15 行) | vhost 1 个(~10 行),模块自动启用 |
| 内存占用 | 较低(FPM 动态进程池默认 max_children=5) | 略高(prefork 多进程 + 内嵌解释器) |
| 静态文件性能 | 强 | 一般 |
| 适用场景 | 推荐:长期常驻、低配服务器 | 已有 Apache 环境/需要 .htaccess 生态 |
7.2 数据库后端对比
| 维度 | SQLite | MySQL/MariaDB | PostgreSQL |
|---|---|---|---|
| 外部依赖 | 无(PHP 内置 pdo_sqlite) | 需数据库服务 | 需数据库服务 |
| 数据落点 | 单文件 db/todolist.db | 独立库(表带 mtt_ 前缀) | 独立库 |
| 备份方式 | 拷贝文件 | mysqldump | pg_dump |
| 向导步骤 | 1 步(免填连接信息) | 需填 Host/库名/账号/前缀 | 同 MySQL(官方标注 beta) |
| 适用场景 | 个人/小规模(默认推荐) | 已有 MySQL 运维体系、多实例共享 | PG 技术栈团队 |
选择建议:个人使用直接照抄第四章(Nginx + FPM + SQLite),零外部依赖、备份即拷文件;已有 Apache 或需要 .htaccess 的共享主机环境选第五章;只有当服务器上本来就有 MariaDB/MySQL 且希望统一数据库运维时才走第六章。PostgreSQL 支持官方标注 beta,生产慎选。
八、配置说明
安装完成后的配置分两层:
- 数据库连接层——
/var/www/mytinytodo-app/config.php,7 个MTT_*常量(MTT_DB_TYPE/HOST/USER/PASSWORD/NAME/PREFIX/DRIVER+MTT_SALT)。改数据库类型需删掉config.php重新走向导(见第六章);MTT_SALT不可随手改,改了会使既有会话与 API 令牌失效。 - 应用行为层——Web 界面
settings.php(站点标题、语言、口令、智能语法、时区、自动打标签、Markdown 渲染、周起始日、时钟制式、三组日期格式、外观亮暗、任务计数角标、扩展管理)。所有设置项以 JSON 形式持久化在数据库settings表的单行config.json键下,改完即时生效,无需重启服务。
各参数的取值范围、默认值与逐项详解见 《myTinyTodo 1.8.6 配置参数详解》 配置篇(本专栏内)。
九、常见问题(FAQ)
Q1:访问返回 502 Bad Gateway,如何排查?
最常见原因是 PHP-FPM 未运行,Nginx 连不上套接字。受控复现(实测):systemctl stop php8.1-fpm 后访问首页得到 502,同时 Nginx 错误日志出现:
2026/10/24 00:52:25 [crit] 12425#12425: *25 connect() to unix:/run/php/php8.1-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 127.0.0.1, server: _, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.1-fpm.sock:", host: "localhost"
处理:systemctl start php8.1-fpm(并 systemctl enable php8.1-fpm 保证开机自启),复测恢复 200。若 FPM 在跑仍 502,依次核对:站点配置里 fastcgi_pass 的套接字路径与 /etc/php/8.1/fpm/pool.d/www.conf 的 listen 是否一致;ls -l /run/php/php8.1-fpm.sock 属主是否为 www-data 可读写。
Q2:向导报 Database connection error: Required PHP extension 'PDO_MySQL' is not installed.?
刚装完 php-mysql 后 Web 服务进程尚未加载新扩展(CLI 里 php -m 有 pdo_mysql,但 Apache/FPM 进程是老镜像)。实测处理:方案 B 执行 systemctl reload apache2、方案 A 执行 systemctl restart php8.1-fpm,然后重走向导即可通过。
Q3:apachectl configtest 报 AH00558: Could not reliably determine the server's fully qualified domain name?
这是提示性告警不是错误(实测输出中与 Syntax OK 同时出现)。Apache 拿不到可反解的 FQDN 时会用首个监听地址(实测中为 10.89.67.3)顶替。要消除它,在 /etc/apache2/conf-available/servername.conf 写一行 ServerName localhost 后 a2enconf servername && systemctl reload apache2。
Q4:服务器上配置了 http_proxy 环境变量后,curl http://localhost/ 变成 502?
代理环境变量会让 curl 把 localhost 请求也转发给代理,代理不回源你的本机就返回 502(实测回显中可见请求发往代理并携带 Proxy-Connection: Keep-Alive 头,返回 HTTP/1.1 502 Bad Gateway)。处理:本机验证一律加 --noproxy "*",或临时 unset http_proxy https_proxy。浏览器不受影响。
Q5:向导第二步报 Access denied! No token provided.?
安装向导用 stoken(存于 mtt-s-token Cookie)做 CSRF 防护,每步表单都必须携带上一步响应里刷新的 stoken;手工构造请求时漏带/复用过期令牌就会得到该报错(实测复现)。正常浏览器操作不会遇到;脚本化安装时需要每步从响应 HTML 中重新提取 stoken value='...'。
Q6:如何升级到新版本?
官方升级路径:备份 db/ 目录(或数据库 dump)与 config.php → 下载新版 tar 包覆盖应用目录(保留 config.php 与 db/)→ 浏览器打开 setup.php。向导会读取库内版本号:同版本时提示 Installed version does not require database update.;跨版本(支持从 v1.4/v1.7 的库结构)时显示 Update database v1.7 to v1.8 确认框,点击后自动迁移。升级完成后再次删除 setup.php。回滚 = 恢复备份的目录与数据。
十、卸载与清理
按安装范围逆序拆除(数据先行备份):
# 1. 备份数据(SQLite 场景)
cp /var/www/mytinytodo-app/db/todolist.db /root/todolist.db.bak
# MySQL 场景改用:mysqldump -uroot mytinytodo > /root/mytinytodo.sql
# 2. 停用并移除应用目录
systemctl stop nginx php8.1-fpm # 方案 B 为 systemctl stop apache2
rm -rf /var/www/mytinytodo-app
rm -f /etc/nginx/sites-enabled/mytinytodo.conf /etc/nginx/sites-available/mytinytodo.conf
# 3. 卸载软件包
apt-get purge -y nginx php-fpm php-sqlite3 php-mbstring php-intl php-xml
apt-get autoremove -y
# 4. 卸载数据库(仅方案 C)
systemctl stop mariadb
apt-get purge -y mariadb-server php-mysql
rm -rf /var/lib/mysql
上述流程在本文实测环境完整走通,关键回显(实测):
===STOP===
inactive inactive inactive inactive
===BACKUP===
-rw-r--r-- 1 root root 69632 Oct 24 01:20 /root/todolist.db.bak
===RM-APP===
html
===PURGE===
27 (Remove/Purge 记录条数)
===VERIFY===
inactive inactive inactive inactive
html
STOP 后 4 个服务(apache2/php8.1-fpm/mariadb/nginx)全部 inactive;应用目录删除后 /var/www/ 仅剩系统自带的 html;purge 共产生 27 条 Removing/Purging 记录;最终 VERIFY 与首查一致即清理干净。MySQL 数据目录 /var/lib/mysql 连同 rm -rf 一步移除(实测输出 mysql-data-removed)。
十一、参考链接
- 官方下载页(Releases):https://github.com/maxpozdeev/mytinytodo/releases
- 官方系统要求(README):https://github.com/maxpozdeev/mytinytodo#system-requirements
- 官方网站:https://www.mytinytodo.net/
- 本专栏认知篇:《myTinyTodo 1.8.6 介绍与选型指南》
- 本专栏配置篇:《myTinyTodo 1.8.6 配置参数详解》
- 本专栏 API 篇:《myTinyTodo 1.8.6 API 使用详解》