在 Debian 上部署 ThinkPHP 时,数据库连接通常不是“填上账号密码就结束”这么简单。真正容易出问题的,往往是 PHP 扩展没装全、Nginx 根目录没指到 public、MySQL 用户权限不完整,或者项目运行目录不可写。
下面按实际部署顺序,把 ThinkPHP 连接 MySQL 的关键步骤重新整理一遍。你可以从环境准备一路做到连接测试,也可以按目录直接跳到自己当前卡住的环节排查。
先把 Debian 运行环境补齐
在开始配置数据库前,先确认 ThinkPHP 运行所需的基础组件已经安装到位:PHP(7.4+)、Web 服务器、MySQL/MariaDB,以及 Composer。对于 ThinkPHP 6.x,PHP 版本至少需要 7.4。
更新软件包列表
sudo apt update
安装 PHP 与常用扩展
数据库连接相关的关键扩展是 php-mysql,另外 php-fpm、php-mbstring、php-xml、php-curl 也是 ThinkPHP 项目常见依赖。
sudo apt install php php-cli php-fpm php-mysql php-mbstring php-xml php-curl -y
安装 Nginx、MySQL 和 Composer
sudo apt install nginx -y
sudo apt install mysql-server -y
curl -sS https://getcomposer.org/installer | phpsudo mv composer.phar /usr/local/bin/composer
这里需要额外留意一处:原命令中的 phpsudo 看起来是连写了,实际执行前应先确认命令是否有误,否则 Composer 安装步骤可能直接失败。
把 Web 服务器正确指向 ThinkPHP 入口
ThinkPHP 项目的访问入口在 public 目录。如果 Web 服务器根目录仍指向项目根目录,轻则路由异常,重则可能暴露不该公开访问的文件。

Nginx 根目录与重写规则怎么配
下面是文中给出的 Nginx 配置示例,核心是两点:root 指向项目的 public 目录;通过 try_files 将请求转发给 index.php,让 ThinkPHP 路由生效。
server {
listen 80;
server_name your_domain.com; # 替换为你的域名或IP
root /var/www/your_project/public; # 替换为项目public目录路径
index index.php index.html;
location / {
try_files $uri $uri/ /index.php$query_string; # 关键:将请求转发到index.php
}
location ~ .php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/var/run/php/php8.1-fpm.sock; # 根据PHP版本调整(如php7.4-fpm.sock)
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /.ht {
deny all; # 禁止访问.htaccess文件
}
}
编辑路径按原文为 /etc/nginx/sites-a vailable/default,实际操作时应注意确认目录名是否书写正确。
启用配置并重启 Nginx
sudo ln -s /etc/nginx/sites-a vailable/default /etc/nginx/sites-enabled/
sudo nginx -t # 测试配置语法
sudo systemctl restart nginx
其中 sudo nginx -t 这一步很关键,先检查语法,再重启服务,能少走很多排错弯路。
先建库,再给 ThinkPHP 单独授权
数据库部分建议不要直接让应用使用 root 账户。更稳妥的做法是单独创建数据库、单独创建业务用户,再把权限授给这个用户。
登录 MySQL
sudo mysql -u root -p
创建数据库并指定字符集
字符集推荐使用 utf8mb4,这样对 emoji 和更完整的 Unicode 字符支持更好。
CREATE DATABASE your_database_name CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
创建用户并授权
CREATE USER 'your_username'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON your_database_name.* TO 'your_username'@'localhost';
FLUSH PRIVILEGES; # 刷新权限
退出 MySQL
exit;
ThinkPHP 数据库连接该写在哪
ThinkPHP 的数据库配置常见有两种入口:较新的项目通常通过 .env 管理环境变量;较早版本则可能直接在 config/database.php 中维护。原文更推荐优先使用 .env,原因也很明确:敏感信息更容易隔离,部署时更方便区分环境。

ThinkPHP 6.x 优先使用 .env
# 数据库配置(ThinkPHP 6.x+)
DB_CONNECTION=mysql # 数据库类型(mysql/sqlite/pgsql等)
DB_HOST=127.0.0.1 # 数据库服务器地址(本地用127.0.0.1)
DB_PORT=3306 # 数据库端口(MySQL默认3306)
DB_DATABASE=your_database_name # 数据库名
DB_USERNAME=your_username # 数据库用户名
DB_PASSWORD=your_password # 数据库密码
这里最容易填错的通常是 DB_HOST、DB_PORT 和账号密码。若数据库就在本机,按原文建议使用 127.0.0.1。
ThinkPHP 5.x 可改 config/database.php
return [
'default' => 'mysql', // 默认数据库连接
'connections' => [
'mysql' => [
'type' => 'mysql',
'hostname' => '127.0.0.1',
'database' => 'your_database_name',
'username' => 'your_username',
'password' => 'your_password',
'hostport' => '3306',
'charset' => 'utf8mb4',
'prefix' => 'think_', // 表前缀(可选)
],
],
];
如果是多环境部署,仍然更建议把可变配置收敛到环境变量中,避免直接把生产数据库信息写死在代码里。
项目目录权限也会影响数据库使用
数据库连接本身配对了,不代表程序就能顺利运行。ThinkPHP 运行过程中还会写入缓存、日志等运行时文件,因此 runtime 目录必须具备正确权限。
cd /var/www/your_project # 进入项目根目录
sudo chown -R www-data:www-data . # 将项目所有者设为www-data(Web服务器用户)
sudo chmod -R 755 runtime # 设置runtime目录权限为755
如果这里权限不对,项目可能表现为页面报错、日志写不进去,或者看起来像数据库异常,实际上根因在文件系统权限。
最后做连接测试,并补上生产环境项
部署完成后,最好立刻验证一次数据库连接。这样一旦出错,排查范围还比较集中。

使用 ThinkPHP 命令行测试连接
php think db:list # 查看已配置的数据库连接(ThinkPHP 6.x+)
如果命令能正确返回数据库连接信息,说明配置基本生效;如果报错,优先检查 .env 中的数据库名、用户名、密码以及主机地址是否一致。
生产环境可开启断线重连
对于长时间运行的业务,数据库连接断开后自动重连通常值得开启。原文给出的方式是在 config/database.php 中设置 break_reconnect:
'mysql' => [
// ...其他配置
'break_reconnect' => true, // 开启断线重连
],
做到这里,ThinkPHP 项目在 Debian 上连接 MySQL 的基础链路就算完整了:环境具备、入口正确、数据库授权到位、配置文件落地、权限正常、命令测试通过,后续再做数据表迁移或业务接入会顺畅很多。







