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 等排障实录与卸载清理。

myTinyTodoPHP 应用自托管任务管理2026/10/24

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)
PHP8.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):

依赖项要求
PHP7.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.62026-10-20修复 PHP 8.5+ 因 PDO 类变更产生的弃用告警
v1.8.52026-10-19修复 v1.8.4 引入的 PHP 7.x 不兼容错误
v1.8.42026-09-29标签云新增「Any tag」过滤;标签云改按字母序;修 PostgreSQL 导出 iCal/CSV/RSS 报错;兼容 PHP 8.6;更新中/德/波翻译
v1.8.32025-05-29维护版本
v1.8.22025-05-13维护版本
v1.8.12024-01-28维护版本
v1.8.02023-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 官方不提供系统软件源与官方容器镜像):

文件值
下载 URLhttps://github.com/maxpozdeev/mytinytodo/releases/download/v1.8.6/mytinytodo-v1.8.6.tar.gz
大小386,781 字节
MD58d10584e6ee6d0e85336a3b2abf8684f
SHA-256597e00a4160fad7107d08e9bc44b0e6bc1f90042a5870bff8527c30791c87d6c

四、安装方案 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、Database mytinytodo、User mtt、Password mtt、Table prefix mtt_(表单默认值,可改);
  • 点 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-fpmapache2 + libapache2-mod-php8.1
PHP 运行方式独立 FPM 进程池,Unix 套接字Apache 内嵌模块(需 mpm_prefork)
配置量站点文件 1 个(~15 行)vhost 1 个(~10 行),模块自动启用
内存占用较低(FPM 动态进程池默认 max_children=5)略高(prefork 多进程 + 内嵌解释器)
静态文件性能强一般
适用场景推荐:长期常驻、低配服务器已有 Apache 环境/需要 .htaccess 生态

7.2 数据库后端对比

维度SQLiteMySQL/MariaDBPostgreSQL
外部依赖无(PHP 内置 pdo_sqlite)需数据库服务需数据库服务
数据落点单文件 db/todolist.db独立库(表带 mtt_ 前缀)独立库
备份方式拷贝文件mysqldumppg_dump
向导步骤1 步(免填连接信息)需填 Host/库名/账号/前缀同 MySQL(官方标注 beta)
适用场景个人/小规模(默认推荐)已有 MySQL 运维体系、多实例共享PG 技术栈团队

选择建议:个人使用直接照抄第四章(Nginx + FPM + SQLite),零外部依赖、备份即拷文件;已有 Apache 或需要 .htaccess 的共享主机环境选第五章;只有当服务器上本来就有 MariaDB/MySQL 且希望统一数据库运维时才走第六章。PostgreSQL 支持官方标注 beta,生产慎选。

八、配置说明

安装完成后的配置分两层:

  1. 数据库连接层——/var/www/mytinytodo-app/config.php,7 个 MTT_* 常量(MTT_DB_TYPE/HOST/USER/PASSWORD/NAME/PREFIX/DRIVER + MTT_SALT)。改数据库类型需删掉 config.php 重新走向导(见第六章);MTT_SALT 不可随手改,改了会使既有会话与 API 令牌失效。
  2. 应用行为层——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)。

十一、参考链接